LiteSQL  0.3.10
expr.hpp
Go to the documentation of this file.
1 /* LiteSQL
2  *
3  * By Tero Laitinen
4  *
5  * See LICENSE for copyright information. */
6 
7 #ifndef litesql_expr_hpp
8 #define litesql_expr_hpp
9 #include <string>
10 #include <utility>
11 #include "litesql/utils.hpp"
12 #include "litesql/field.hpp"
15 namespace litesql {
16 using namespace std;
19 class Expr {
20 protected:
21  // extra tables to be joined
22  Split extraTables;
23 public:
25  static const char* True;
26  // default expression is true
27  virtual string asString() const { return True; }
28 
29 
30  Split getExtraTables() const {
31  return extraTables;
32  }
33  virtual ~Expr() {}
34 };
36 class RawExpr : public Expr {
37  string expr;
38 public:
39  RawExpr(string e) : expr(e) {}
40  virtual string asString() const { return expr; }
41 };
43 class Connective : public Expr {
44 private:
45  string op;
46 protected:
47  const Expr &e1, &e2;
48 
49  Connective(string o, const Expr & e1_, const Expr & e2_)
50  : op(o), e1(e1_), e2(e2_) { }
51 
52 public:
53  virtual ~Connective() {}
54 
55  virtual string asString() const {
56  string res = "(" + e1.asString() + ") " + op
57  + " (" + e2.asString() + ")";
58  return res;
59  }
60 };
62 class And : public Connective {
63 public:
64  And(const Expr & e1_, const Expr & e2_) : Connective("and", e1_, e2_) {}
65  virtual string asString() const {
66  if (e1.asString() == True)
67  return e2.asString();
68  else if (e2.asString() == True)
69  return e1.asString();
70  else
71  return Connective::asString();
72  }
73 };
75 class Or : public Connective {
76 public:
77  Or(const Expr & e1_, const Expr & e2_)
78  : Connective("or", e1_, e2_) {}
79  virtual string asString() const {
80  if ((e1.asString() == True)||(e2.asString() == True))
81  return True;
82  else
83  return Connective::asString();
84  }
85 };
87 class Not : public Expr {
88 private:
89  const Expr & exp;
90 public:
91  Not(const Expr & _exp) : exp(_exp) {}
92  virtual string asString() const {
93  return "not ("+exp.asString()+")";
94  }
95 
96 };
98 class Oper : public Expr {
99 protected:
100  const FieldType & field;
101  string op;
102  string data;
103  bool escape;
104 
105  Oper(const FieldType & fld, const string& o, const string& d)
106  : field(fld), op(o), data(d), escape(true) {
107  extraTables.push_back(fld.table());
108  }
109  Oper(const FieldType & fld, const string& o, const FieldType &f2)
110  : field(fld), op(o), data(f2.fullName()), escape(false) {
111  extraTables.push_back(fld.table());
112  }
113 
114 public:
115  virtual string asString() const {
116  string res;
117  res += field.fullName() + " " + op + " " + (escape ? escapeSQL(data) : data);
118  return res;
119  }
120 };
122 class Eq : public Oper {
123 public:
124  Eq(const FieldType & fld, const string& d)
125  : Oper(fld, "=", d) {}
126  Eq(const FieldType & fld, const FieldType & f2)
127  : Oper(fld, "=", f2) {}
128 
129 };
131 class NotEq : public Oper {
132 public:
133  NotEq(const FieldType & fld, const string& d)
134  : Oper(fld, "<>", d) {}
135  NotEq(const FieldType & fld, const FieldType & f2)
136  : Oper(fld, "<>", f2) {
137  }
138 
139 };
141 class Gt : public Oper {
142 public:
143  Gt(const FieldType & fld, const string& d)
144  : Oper(fld, ">", d) {}
145  Gt(const FieldType & fld, const FieldType& d)
146  : Oper(fld, ">", d) {}
147 
148 };
150 class GtEq : public Oper {
151 public:
152  GtEq(const FieldType & fld, const string& d)
153  : Oper(fld, ">=", d) {}
154  GtEq(const FieldType & fld, const FieldType& d)
155  : Oper(fld, ">=", d) {}
156 
157 };
159 class Lt : public Oper {
160 public:
161  Lt(const FieldType & fld, const string& d)
162  : Oper(fld, "<", d) {}
163  Lt(const FieldType & fld, const FieldType& d)
164  : Oper(fld, "<", d) {}
165 
166 };
168 class LtEq : public Oper {
169 public:
170  LtEq(const FieldType & fld, const string& d)
171  : Oper(fld, "<=", d) {}
172  LtEq(const FieldType & fld, const FieldType& d)
173  : Oper(fld, "<=", d) {}
174 
175 };
177 class Like : public Oper {
178 public:
179  Like(const FieldType & fld, const string& d)
180  : Oper(fld, "like", d) {}
181 };
182 class SelectQuery;
184 class In : public Oper {
185 public:
186  In(const FieldType & fld, const string& set)
187  : Oper(fld, "in", "("+set+")") {};
188  In(const FieldType & fld, const SelectQuery& s);
189  virtual string asString() const {
190  return field.fullName() + " " + op + " " + data;
191  }
192 
193 };
194 And operator&&(const Expr& o1, const Expr& o2);
195 Or operator||(const Expr& o1, const Expr& o2);
196 template <class T>
197 litesql::Eq operator==(const litesql::FieldType& fld, const T& o2) {
198  return litesql::Eq(fld, litesql::toString(o2));
199 }
200 Eq operator==(const FieldType& fld, const FieldType& f2);
201 Gt operator>(const FieldType& fld, const FieldType& o2);
202 GtEq operator>=(const FieldType& fld, const FieldType& o2);
203 Lt operator<(const FieldType& fld, const FieldType& o2);
204 LtEq operator<=(const FieldType& fld, const FieldType& o2);
205 NotEq operator!=(const FieldType& fld, const FieldType& f2);
206 
207 template <class T>
208 litesql::Gt operator>(const litesql::FieldType& fld, const T& o2) {
209  return litesql::Gt(fld, litesql::toString(o2));
210 }
211 
212 template <class T>
213 litesql::GtEq operator>=(const litesql::FieldType& fld, const T& o2) {
214  return litesql::GtEq(fld, litesql::toString(o2));
215 }
216 
217 template <class T>
218 litesql::Lt operator<(const litesql::FieldType& fld, const T& o2) {
219  return litesql::Lt(fld, litesql::toString(o2));
220 }
221 
222 
223 template <class T>
224 litesql::LtEq operator<=(const litesql::FieldType& fld, const T& o2) {
225  return litesql::LtEq(fld, litesql::toString(o2));
226 }
227 template <class T>
228 litesql::NotEq operator!=(const litesql::FieldType& fld, const T& o2) {
229  return litesql::NotEq(fld, litesql::toString(o2));
230 }
231 
232 Not operator!(const Expr &exp);
233 }
234 
235 
236 #endif
Definition: backend.hpp:14
in operator
Definition: expr.hpp:184
greater or equal operator
Definition: expr.hpp:150
std::string escapeSQL(const std::string &str)
escapes &#39; characters so that they do not break SQL statements.
like operator
Definition: expr.hpp:177
connects two expression with or-operator.
Definition: expr.hpp:75
includes string.hpp and split.hpp
A base class for expression in WHERE - clause.
Definition: expr.hpp:19
contains FieldType- and Field-classes
a class that helps creating SELECT-SQL statements.
Definition: selectquery.hpp:18
splits and joins strings.
Definition: split.hpp:15
less than or equal operator
Definition: expr.hpp:168
base class of operators in expressions
Definition: expr.hpp:98
greater than operator
Definition: expr.hpp:141
used to inject custom expression into WHERE-clause
Definition: expr.hpp:36
static const char * True
constant for True expression
Definition: expr.hpp:25
equality operator
Definition: expr.hpp:122
connects two expressions with and-operator.
Definition: expr.hpp:62
negates expression
Definition: expr.hpp:87
used to connect two expressions
Definition: expr.hpp:43
less than operator
Definition: expr.hpp:159
Definition: field.hpp:24
inequality operator
Definition: expr.hpp:131

SourceForge.net Logo