ultimatepp/uppsrc/Sql/SqlVal.cpp
cxl 435c8e13c4 SqlSelect::AsValue, SqlId::Of(const char *)
git-svn-id: svn://ultimatepp.org/upp/trunk@786 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2009-01-19 12:55:41 +00:00

409 lines
8.3 KiB
C++

#include "Sql.h"
NAMESPACE_UPP
SqlCol SqlCol::As(const char *as) const
{
return name + SqlCase(MSSQL | PGSQL, " as ")(" ") + as;
}
SqlCol SqlId::Of(const char *of) const
{
return of + ('.' + ToString());
}
SqlCol SqlId::Of(SqlId id) const
{
return id.IsNull() ? ToString() : id.ToString() + '.' + ToString();
}
SqlId SqlId::operator[](const SqlId& id) const
{
return id.IsNull() ? ToString() : ToString() + '.' + id.ToString();
}
SqlId SqlId::As(const char *as) const
{
return id.IsNull() ? ToString() : ToString() + SqlCase(MSSQL | PGSQL, " as ")(" ") + as;
}
SqlId SqlId::operator [] (int i) const
{
return SqlId(ToString() + FormatInt(i));
}
SqlId SqlId::operator&(const SqlId& s) const
{
return SqlId(ToString() + "$" + s.ToString());
}
String SqlS::operator()() const
{
return '(' + text + ')';
}
String SqlS::operator()(int at) const
{
return at > priority ? operator()() : text;
}
SqlS::SqlS(const SqlS& a, const char *o, const SqlS& b, int pr, int prb) {
text = a(pr) + o + b(prb);
priority = pr;
}
SqlS::SqlS(const SqlS& a, const char *o, const SqlS& b, int pr) {
text = a(pr) + o + b(pr);
priority = pr;
}
SqlVal SqlVal::As(const char *as) const {
SqlVal v;
v.SetHigh(text + ~SqlCase(MSSQL | PGSQL, " as ")(" ") + as);
return v;
}
SqlVal SqlVal::As(const SqlId& id) const {
return As(~~id);
}
SqlVal::SqlVal(const String& x) {
if(UPP::IsNull(x))
SetNull();
else
SetHigh(SqlFormat(x));
}
SqlVal::SqlVal(const char *s) {
if(s && *s)
SetHigh(SqlFormat(s));
else
SetNull();
}
SqlVal::SqlVal(int x) {
if(UPP::IsNull(x))
SetNull();
else
SetHigh(SqlFormat(x));
}
SqlVal::SqlVal(int64 x) {
if(UPP::IsNull(x))
SetNull();
else
SetHigh(SqlFormat(x));
}
SqlVal::SqlVal(double x) {
if(UPP::IsNull(x))
SetNull();
else
SetHigh(SqlFormat(x));
}
SqlVal::SqlVal(Date x) {
if(UPP::IsNull(x))
SetNull();
else
SetHigh(SqlFormat(x));
}
SqlVal::SqlVal(Time x) {
if(UPP::IsNull(x))
SetNull();
else
SetHigh(SqlFormat(x));
}
SqlVal::SqlVal(const Value& x) {
if(UPP::IsNull(x))
SetNull();
else
SetHigh(SqlFormat(x));
}
SqlVal::SqlVal(const Nuller&) {
SetNull();
}
SqlVal::SqlVal(SqlId id) {
SetHigh(id.ToString());
}
SqlVal::SqlVal(const SqlId& (*id)())
{
SetHigh((*id)().ToString());
}
SqlVal::SqlVal(SqlCol id) {
SetHigh(id.ToString());
}
/*
SqlVal::SqlVal(const SqlSelect& x) {
SetHigh('(' + ((SqlStatement) x).GetText() + ')');
}
SqlVal::SqlVal(const SqlBool& x) {
SetHigh(~x);
}
*/
SqlVal::SqlVal(const Case& x) {
SetHigh(~x);
}
SqlVal operator-(const SqlVal& a) {
return SqlVal('-' + a(SqlS::UNARY), SqlS::UNARY);
}
SqlVal operator+(const SqlVal& a, const SqlVal& b) {
return SqlVal(a, " + ", b, SqlS::ADD);
}
SqlVal operator-(const SqlVal& a, const SqlVal& b) {
return SqlVal(a," - ", b, SqlS::ADD, SqlS::ADD + 1);
}
SqlVal operator*(const SqlVal& a, const SqlVal& b) {
return SqlVal(a, " * ", b, SqlS::MUL);
}
SqlVal operator/(const SqlVal& a, const SqlVal& b) {
return SqlVal(a, " / ", b, SqlS::MUL, SqlS::MUL + 1);
}
SqlVal operator%(const SqlVal& a, const SqlVal& b) {
return SqlFunc("mod", a, b);
}
SqlVal operator|(const SqlVal& a, const SqlVal& b) {
return SqlVal(a, SqlCase(ORACLE, " || ")(PGSQL, " || ")(" + "), b, SqlS::MUL);
}
SqlVal& operator+=(SqlVal& a, const SqlVal& b) { return a = a + b; }
SqlVal& operator-=(SqlVal& a, const SqlVal& b) { return a = a - b; }
SqlVal& operator*=(SqlVal& a, const SqlVal& b) { return a = a * b; }
SqlVal& operator/=(SqlVal& a, const SqlVal& b) { return a = a / b; }
SqlVal& operator%=(SqlVal& a, const SqlVal& b) { return a = a % b; }
SqlVal& operator|=(SqlVal& a, const SqlVal& b) { return a = a | b; }
SqlVal SqlFunc(const char *name, const SqlVal& a) {
return SqlVal(name + a(), SqlS::FN);
}
SqlVal SqlFunc(const char *n, const SqlVal& a, const SqlVal& b) {
return SqlVal(String(n) + '(' + ~a + ", " + ~b + ')', SqlS::FN);
}
SqlVal SqlFunc(const char *n, const SqlVal& a, const SqlVal& b, const SqlVal& c) {
return SqlVal(String(n) + '(' + ~a + ", " + ~b + ", " + ~c + ')', SqlS::FN);
}
SqlVal SqlFunc(const char *n, const SqlVal& a, const SqlVal& b, const SqlVal& c, const SqlVal& d) {
return SqlVal(String(n) + '(' + ~a + ", " + ~b + ", " + ~c + ", " + ~d + ')', SqlS::FN);
}
SqlVal SqlFunc(const char *name, const SqlSet& set) {
return SqlVal(name + set(), SqlS::FN);
}
SqlVal Decode(const SqlVal& exp, const SqlSet& variants) {
ASSERT(!variants.IsEmpty());
return SqlVal("decode(" + ~exp + ", " + ~variants + ')', SqlS::FN);
}
SqlVal Distinct(const SqlVal& exp) {
return SqlVal("distinct " + exp(SqlS::ADD), SqlS::UNARY);
}
SqlSet Distinct(const SqlSet& columns) {
return SqlSet("distinct " + ~columns, SqlSet::SET);
}
SqlVal All(const SqlVal& exp) {
return SqlVal("all " + exp(SqlS::ADD), SqlS::UNARY);
}
SqlSet All(const SqlSet& columns) {
return SqlSet("all " + ~columns, SqlSet::SET);
}
SqlVal Count(const SqlVal& exp)
{
return SqlFunc("count", exp);
}
SqlVal Count(const SqlSet& exp)
{
return SqlFunc("count", exp);
}
SqlVal SqlAll()
{
return SqlCol("*");
}
SqlVal SqlCountRows()
{
return Count(SqlAll());
}
SqlVal Descending(const SqlVal& exp) {
return SqlVal(exp(SqlS::ADD) + " desc", SqlS::UNARY);
}
SqlVal SqlMax(const SqlVal& exp) {
return SqlFunc("max", exp);
}
SqlVal SqlMin(const SqlVal& exp) {
return SqlFunc("min", exp);
}
SqlVal SqlSum(const SqlVal& exp) {
return SqlFunc("sum", exp);
}
SqlVal Avg(const SqlVal& a) {
return SqlFunc("avg", a);
}
SqlVal Stddev(const SqlVal& a) {
return SqlFunc("stddev", a);
}
SqlVal Variance(const SqlVal& a) {
return SqlFunc("variance", a);
}
SqlVal Greatest(const SqlVal& a, const SqlVal& b) {
return SqlFunc("greatest", a, b);
}
SqlVal Least(const SqlVal& a, const SqlVal& b) {
return SqlFunc("least", a, b);
}
SqlVal ConvertCharset(const SqlVal& exp, const SqlVal& charset) { //TODO Dialect!
if(exp.IsEmpty()) return exp;
return exp.IsEmpty() ? exp : SqlFunc("convert", exp, charset);
}
SqlVal ConvertAscii(const SqlVal& exp) { //TODO Dialect!
return ConvertCharset(exp, "US7ASCII");
}
SqlVal Upper(const SqlVal& exp) {
return exp.IsEmpty() ? exp : SqlFunc("upper", exp);
}
SqlVal Lower(const SqlVal& exp) {
return exp.IsEmpty() ? exp : SqlFunc("lower", exp);
}
SqlVal Length(const SqlVal& exp) {
return exp.IsEmpty() ? exp : SqlFunc("length", exp);
}
SqlVal UpperAscii(const SqlVal& exp) {
return exp.IsEmpty() ? exp : Upper(ConvertAscii(exp));
}
SqlVal Substr(const SqlVal& a, const SqlVal& b) {
return SqlFunc("SUBSTR", a, b);
}
SqlVal Substr(const SqlVal& a, const SqlVal& b, const SqlVal& c)
{
return SqlFunc("SUBSTR", a, b, c);
}
SqlVal Instr(const SqlVal& a, const SqlVal& b) {
return SqlFunc("INSTR", a, b);
}
SqlVal Wild(const char* s) {
String result;
for(char c; (c = *s++) != 0;)
if(c == '*')
result << '%';
else if(c == '?')
result << '_';
else if(c == '.' && *s == 0)
return result;
else
result << c;
result << '%';
return result;
}
SqlVal SqlDate(const SqlVal& year, const SqlVal& month, const SqlVal& day) {//TODO Dialect!
return SqlFunc("to_date", year|"."|month|"."|day, "SYYYY.MM.DD");
}
SqlVal AddMonths(const SqlVal& date, const SqlVal& months) {//TODO Dialect!
return SqlFunc("add_months", date, months);
}
SqlVal LastDay(const SqlVal& date) {//TODO Dialect!
return SqlFunc("last_day", date);
}
SqlVal MonthsBetween(const SqlVal& date1, const SqlVal& date2) {//TODO Dialect!
return SqlFunc("months_between", date1, date2);
}
SqlVal NextDay(const SqlVal& date) {//TODO Dialect!
return SqlFunc("next_day", date);
}
SqlVal Cast(const char* type, const SqlId& a) {
return SqlFunc(type, a);
}
SqlVal SqlNvl(const SqlVal& a, const SqlVal& b) {
return SqlFunc(SqlCase
(PGSQL, "coalesce")
(MY_SQL|SQLITE3, "ifnull")
(MSSQL, "isnull")
("nvl"),
a, b);
}
SqlVal SqlNvl(const SqlVal& a) {
return Nvl(a, SqlVal(0));
}
SqlVal Prior(SqlId a) {
return SqlVal("prior " + ~a, SqlS::UNARY);
}
SqlVal NextVal(SqlId a) {
return SqlVal(SqlCase
(PGSQL, "nextval('" + ~a + "')")
(~a + ".NEXTVAL")
, SqlS::HIGH);
}
SqlVal CurrVal(SqlId a) {
return SqlVal(SqlCase
(PGSQL, "currval('" + ~a + "')")
(~a + ".CURRVAL")
, SqlS::HIGH);
}
SqlVal SqlRowNum()
{
return SqlCol("ROWNUM");
}
SqlVal SqlArg() {
return SqlCol("?");
}
SqlVal OuterJoin(SqlCol col)
{
return SqlCol(~col + "(+)");
}
END_UPP_NAMESPACE