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"
15namespace litesql {
16using namespace std;
19class Expr {
20protected:
21 // extra tables to be joined
22 Split extraTables;
23public:
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};
35
36class RawExpr : public Expr {
37 string expr;
38public:
39 RawExpr(string e) : expr(e) {}
40 virtual string asString() const { return expr; }
41};
42
43class Connective : public Expr {
44private:
45 string op;
46protected:
47 const Expr &e1, &e2;
48
49 Connective(string o, const Expr & e1_, const Expr & e2_)
50 : op(o), e1(e1_), e2(e2_) { }
51
52public:
53 virtual ~Connective() {}
54
55 virtual string asString() const {
56 string res = "(" + e1.asString() + ") " + op
57 + " (" + e2.asString() + ")";
58 return res;
59 }
60};
61
62class And : public Connective {
63public:
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};
74
75class Or : public Connective {
76public:
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};
86
87class Not : public Expr {
88private:
89 const Expr & exp;
90public:
91 Not(const Expr & _exp) : exp(_exp) {}
92 virtual string asString() const {
93 return "not ("+exp.asString()+")";
94 }
95
96};
97
98class Oper : public Expr {
99protected:
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
114public:
115 virtual string asString() const {
116 string res;
117 res += field.fullName() + " " + op + " " + (escape ? escapeSQL(data) : data);
118 return res;
119 }
120};
121
122class Eq : public Oper {
123public:
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};
130
131class NotEq : public Oper {
132public:
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};
140
141class Gt : public Oper {
142public:
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};
149
150class GtEq : public Oper {
151public:
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};
158
159class Lt : public Oper {
160public:
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};
167
168class LtEq : public Oper {
169public:
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};
176
177class Like : public Oper {
178public:
179 Like(const FieldType & fld, const string& d)
180 : Oper(fld, "like", d) {}
181};
182class SelectQuery;
184class In : public Oper {
185public:
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};
194And operator&&(const Expr& o1, const Expr& o2);
195Or operator||(const Expr& o1, const Expr& o2);
196template <class T>
197litesql::Eq operator==(const litesql::FieldType& fld, const T& o2) {
198 return litesql::Eq(fld, litesql::toString(o2));
199}
200Eq operator==(const FieldType& fld, const FieldType& f2);
201Gt operator>(const FieldType& fld, const FieldType& o2);
202GtEq operator>=(const FieldType& fld, const FieldType& o2);
203Lt operator<(const FieldType& fld, const FieldType& o2);
204LtEq operator<=(const FieldType& fld, const FieldType& o2);
205NotEq operator!=(const FieldType& fld, const FieldType& f2);
206
207template <class T>
208litesql::Gt operator>(const litesql::FieldType& fld, const T& o2) {
209 return litesql::Gt(fld, litesql::toString(o2));
210}
211
212template <class T>
213litesql::GtEq operator>=(const litesql::FieldType& fld, const T& o2) {
214 return litesql::GtEq(fld, litesql::toString(o2));
215}
216
217template <class T>
218litesql::Lt operator<(const litesql::FieldType& fld, const T& o2) {
219 return litesql::Lt(fld, litesql::toString(o2));
220}
221
222
223template <class T>
224litesql::LtEq operator<=(const litesql::FieldType& fld, const T& o2) {
225 return litesql::LtEq(fld, litesql::toString(o2));
226}
227template <class T>
228litesql::NotEq operator!=(const litesql::FieldType& fld, const T& o2) {
229 return litesql::NotEq(fld, litesql::toString(o2));
230}
231
232Not operator!(const Expr &exp);
233}
234
235
236#endif
connects two expressions with and-operator.
Definition expr.hpp:62
equality operator
Definition expr.hpp:122
A base class for expression in WHERE - clause.
Definition expr.hpp:19
static const char * True
constant for True expression
Definition expr.hpp:25
Definition field.hpp:24
greater than operator
Definition expr.hpp:141
negates expression
Definition expr.hpp:87
connects two expression with or-operator.
Definition expr.hpp:75
a class that helps creating SELECT-SQL statements.
Definition selectquery.hpp:18
splits and joins strings.
Definition split.hpp:15
contains FieldType- and Field-classes
std::string toString(T a)
returns string representation of passed parameter if it can be written to ostringstream
Definition string.hpp:18
std::string escapeSQL(const std::string &str)
escapes ' characters so that they do not break SQL statements.
includes string.hpp and split.hpp

SourceForge.net Logo