comparison SQLGenerator.hpp @ 59:74be5a2f49db

Separate SQLGenerator into a separate header.
author Tom Fredrik Blenning Klaussen <bfg@blenning.no>
date Fri, 14 Sep 2012 00:20:06 +0200
parents
children e5fa379d4030
comparison
equal deleted inserted replaced
58:7b7e84356b39 59:74be5a2f49db
1 #ifndef SQLGENERATOR_HPP
2 #define SQLGENERATOR_HPP
3
4 #include "OrderedPair.hpp"
5 #include "ThreadSafeLookup.hpp"
6 #include "UniqueString.hpp"
7
8 #include "Exception/IOException.hpp"
9 #include "Exception/SQLException.hpp"
10
11 #include <QtCore/QStringList>
12 #include <QtCore/QVariant>
13
14 #include <QtSql/QSqlDatabase>
15 #include <QtSql/QSqlError>
16 #include <QtSql/QSqlQuery>
17 #include <QtSql/QSqlRecord>
18
19 #include <boost/optional.hpp>
20
21 #include <QtCore/QString>
22
23 template<typename T>
24 struct SQLGenerator
25 {
26 };
27
28 template<>
29 struct SQLGenerator<int>
30 {
31 static QString fieldName(const QString &prefix = QString())
32 {
33 return QString("%1_Int").arg(prefix);
34 }
35
36 static QString createFields(const QString &prefix = QString())
37 {
38 return QString("%1 INTEGER").arg(fieldName(prefix));
39 }
40
41 static QString valueString(const QString &prefix = QString())
42 {
43 return QString(":") + fieldName(prefix);
44 }
45
46 static void bindValue(QSqlQuery& query,
47 int value,
48 const QString& prefix = QString())
49 {
50 query.bindValue(valueString(prefix), value);
51 }
52
53 static void bindValues(QSqlQuery& query,
54 const QVariantList& values,
55 const QString& prefix = QString())
56 {
57 query.bindValue(valueString(prefix), values);
58 }
59
60 static void bindValues(QSqlQuery& query,
61 const QList<int>& values,
62 const QString& prefix = QString())
63 {
64 QVariantList list;
65 foreach(int value, values) {
66 list << value;
67 }
68 bindValues(query, list, prefix);
69 }
70
71 static boost::optional<int> extract(QSqlQuery& query,
72 const QString& prefix = QString())
73 {
74 int fieldNo = query.record().indexOf(fieldName(prefix));
75 if (query.at() >= 0)
76 return query.value(fieldNo).toInt();
77 else
78 return boost::optional<int>();
79 }
80
81 };
82
83 template<>
84 struct SQLGenerator<QString>
85 {
86 static QString fieldName(const QString &prefix = QString())
87 {
88 return QString("%1_QString").arg(prefix);
89 }
90
91 static QString createFields(const QString &prefix = QString())
92 {
93 return QString("%1 TEXT").arg(fieldName(prefix));
94 }
95
96 static QString valueString(const QString &prefix = QString())
97 {
98 return QString(":") + fieldName(prefix);
99 }
100
101 static QString restrict(const QString &prefix = QString())
102 {
103 return QString("%1 = %2").arg(fieldName(prefix)).arg(valueString(prefix));
104 }
105
106 static void bindValue(QSqlQuery& query,
107 const QString& value,
108 const QString& prefix = QString())
109 {
110 query.bindValue(valueString(prefix), value);
111 }
112
113 static void bindValues(QSqlQuery& query,
114 const QVariantList& value,
115 const QString& prefix = QString())
116 {
117 query.bindValue(valueString(prefix), value);
118 }
119
120 static void bindValues(QSqlQuery& query,
121 const QList<QString>& values,
122 const QString& prefix = QString())
123 {
124 QVariantList list;
125 foreach(const QString& value, values) {
126 list << value;
127 }
128 bindValues(query, list, prefix);
129 }
130
131 static boost::optional<QString> extract(QSqlQuery& query,
132 const QString& prefix = QString())
133 {
134 int fieldNo = query.record().indexOf(fieldName(prefix));
135 if (query.at() >= 0)
136 return query.value(fieldNo).toString();
137 else
138 return boost::optional<QString>();
139 }
140
141
142 };
143
144 template<>
145 struct SQLGenerator<UniqueString>
146 {
147 static QString fieldName(const QString &prefix = QString())
148 {
149 return QString("%1_QString").arg(prefix);
150 }
151
152 static QString createFields(const QString &prefix = QString())
153 {
154 return QString("%1 TEXT").arg(fieldName(prefix));
155 }
156
157 static QString valueString(const QString &prefix = QString())
158 {
159 return QString(":") + fieldName(prefix);
160 }
161
162 static QString restrict(const QString &prefix = QString())
163 {
164 return QString("%1 = %2").arg(fieldName(prefix)).arg(valueString(prefix));
165 }
166
167 static void bindValue(QSqlQuery& query,
168 const QString& value,
169 const QString& prefix = QString())
170 {
171 query.bindValue(valueString(prefix), value);
172 }
173
174 static void bindValues(QSqlQuery& query,
175 const QVariantList& values,
176 const QString& prefix = QString())
177 {
178 query.bindValue(valueString(prefix), values);
179 }
180
181 static void bindValues(QSqlQuery& query,
182 const QList<UniqueString>& values,
183 const QString& prefix = QString())
184 {
185 QVariantList list;
186 foreach(const UniqueString& value, values) {
187 list << static_cast<const QString>(value);
188 }
189 bindValues(query, list, prefix);
190 }
191
192 static boost::optional<QString> extract(QSqlQuery& query,
193 const QString& prefix = QString())
194 {
195 int fieldNo = query.record().indexOf(fieldName(prefix));
196 if (query.at() >= 0)
197 return query.value(fieldNo).toString();
198 else
199 return boost::optional<QString>();
200 }
201
202
203 };
204
205 template<typename T>
206 struct SQLGenerator<OrderedPair<T> >
207 {
208 static QString fieldName(const QString &prefix = QString())
209 {
210 return SQLGenerator<T>::fieldName(prefix + "_1") + ", " +
211 SQLGenerator<T>::fieldName(prefix + "_2");
212 }
213
214 static QString createFields(const QString &prefix = QString())
215 {
216 return SQLGenerator<T>::createFields(prefix + "_1") + ", " +
217 SQLGenerator<T>::createFields(prefix + "_2");
218 }
219
220 static QString restriction(const QString& prefix = QString())
221 {
222 return SQLGenerator<T>::restrict(prefix + "_1") + " AND " +
223 SQLGenerator<T>::restrict(prefix + "_2");
224 }
225
226 static QString valueString(const QString &prefix = QString())
227 {
228 return SQLGenerator<T>::valueString(prefix + "_1") + ", " +
229 SQLGenerator<T>::valueString(prefix + "_2");
230 }
231
232 static void bindValue(QSqlQuery& query,
233 const OrderedPair<T>& value,
234 const QString& prefix = QString())
235 {
236 SQLGenerator<T>::bindValue(query, value.first, prefix + "_1");
237 SQLGenerator<T>::bindValue(query, value.second, prefix + "_2");
238 }
239
240 static void bindValues(QSqlQuery& query,
241 const QList<OrderedPair<T> >& values,
242 const QString& prefix = QString())
243 {
244 QList<T> first;
245 QList<T> second;
246 foreach(OrderedPair<T> value, values) {
247 first << value.first;
248 second << value.second;
249 }
250 SQLGenerator<T>::bindValues(query, first, prefix + "_1");
251 SQLGenerator<T>::bindValues(query, second, prefix + "_2");
252 }
253
254 static boost::optional<OrderedPair<T> >
255 extract(QSqlQuery& query,
256 const QString& prefix = QString())
257 {
258 if (query.at() >= 0)
259 return OrderedPair<T> (*SQLGenerator<T>::extract(query, prefix + "_1"),
260 *SQLGenerator<T>::extract(query, prefix + "_2"));
261 else
262 return boost::optional<OrderedPair<T> >();
263 }
264 };
265
266
267 #endif //SQLGENERATOR_HPP