comparison DBCache.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 7b7e84356b39
children e5fa379d4030
comparison
equal deleted inserted replaced
58:7b7e84356b39 59:74be5a2f49db
1 #ifndef DBCACHE_HPP 1 #ifndef DBCACHE_HPP
2 #define DBCACHE_HPP 2 #define DBCACHE_HPP
3 3
4 #include "OrderedPair.hpp" 4 #include "OrderedPair.hpp"
5 #include "SQLGenerator.hpp"
5 #include "ThreadSafeLookup.hpp" 6 #include "ThreadSafeLookup.hpp"
6 #include "UniqueString.hpp" 7 #include "UniqueString.hpp"
7 8
8 #include "Exception/IOException.hpp" 9 #include "Exception/IOException.hpp"
9 #include "Exception/SQLException.hpp" 10 #include "Exception/SQLException.hpp"
23 template<typename Key, typename Value> 24 template<typename Key, typename Value>
24 struct InsertRegulator { 25 struct InsertRegulator {
25 static void start() {} 26 static void start() {}
26 static void finish() {} 27 static void finish() {}
27 static void next() {} 28 static void next() {}
28 };
29
30 template<typename T>
31 struct SQLGenerator
32 {
33 };
34
35 template<>
36 struct SQLGenerator<int>
37 {
38 static QString fieldName(const QString &prefix = QString())
39 {
40 return QString("%1_Int").arg(prefix);
41 }
42
43 static QString createFields(const QString &prefix = QString())
44 {
45 return QString("%1 INTEGER").arg(fieldName(prefix));
46 }
47
48 static QString valueString(const QString &prefix = QString())
49 {
50 return QString(":") + fieldName(prefix);
51 }
52
53 static void bindValue(QSqlQuery& query, int value, const QString& prefix = QString())
54 {
55 query.bindValue(valueString(prefix), value);
56 }
57
58 static void bindValues(QSqlQuery& query, const QVariantList& values, const QString& prefix = QString())
59 {
60 query.bindValue(valueString(prefix), values);
61 }
62
63 static void bindValues(QSqlQuery& query, const QList<int>& values, const QString& prefix = QString())
64 {
65 QVariantList list;
66 foreach(int value, values) {
67 list << value;
68 }
69 bindValues(query, list, prefix);
70 }
71
72 static boost::optional<int> extract(QSqlQuery& query, 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, const QString& value, const QString& prefix = QString())
107 {
108 query.bindValue(valueString(prefix), value);
109 }
110
111 static void bindValues(QSqlQuery& query, const QVariantList& value, const QString& prefix = QString())
112 {
113 query.bindValue(valueString(prefix), value);
114 }
115
116 static void bindValues(QSqlQuery& query, const QList<QString>& values, const QString& prefix = QString())
117 {
118 QVariantList list;
119 foreach(const QString& value, values) {
120 list << value;
121 }
122 bindValues(query, list, prefix);
123 }
124
125 static boost::optional<QString> extract(QSqlQuery& query, const QString& prefix = QString())
126 {
127 int fieldNo = query.record().indexOf(fieldName(prefix));
128 if (query.at() >= 0)
129 return query.value(fieldNo).toString();
130 else
131 return boost::optional<QString>();
132 }
133
134
135 };
136
137 template<>
138 struct SQLGenerator<UniqueString>
139 {
140 static QString fieldName(const QString &prefix = QString())
141 {
142 return QString("%1_QString").arg(prefix);
143 }
144
145 static QString createFields(const QString &prefix = QString())
146 {
147 return QString("%1 TEXT").arg(fieldName(prefix));
148 }
149
150 static QString valueString(const QString &prefix = QString())
151 {
152 return QString(":") + fieldName(prefix);
153 }
154
155 static QString restrict(const QString &prefix = QString())
156 {
157 return QString("%1 = %2").arg(fieldName(prefix)).arg(valueString(prefix));
158 }
159
160 static void bindValue(QSqlQuery& query, const QString& value, const QString& prefix = QString())
161 {
162 query.bindValue(valueString(prefix), value);
163 }
164
165 static void bindValues(QSqlQuery& query, const QVariantList& values, const QString& prefix = QString())
166 {
167 query.bindValue(valueString(prefix), values);
168 }
169
170 static void bindValues(QSqlQuery& query, const QList<UniqueString>& values, const QString& prefix = QString())
171 {
172 QVariantList list;
173 foreach(const UniqueString& value, values) {
174 list << static_cast<const QString>(value);
175 }
176 bindValues(query, list, prefix);
177 }
178
179 static boost::optional<QString> extract(QSqlQuery& query, const QString& prefix = QString())
180 {
181 int fieldNo = query.record().indexOf(fieldName(prefix));
182 if (query.at() >= 0)
183 return query.value(fieldNo).toString();
184 else
185 return boost::optional<QString>();
186 }
187
188
189 };
190
191 template<typename T>
192 struct SQLGenerator<OrderedPair<T> >
193 {
194 static QString fieldName(const QString &prefix = QString())
195 {
196 return SQLGenerator<T>::fieldName(prefix + "_1") + ", " +
197 SQLGenerator<T>::fieldName(prefix + "_2");
198 }
199
200 static QString createFields(const QString &prefix = QString())
201 {
202 return SQLGenerator<T>::createFields(prefix + "_1") + ", " +
203 SQLGenerator<T>::createFields(prefix + "_2");
204 }
205
206 static QString restriction(const QString& prefix = QString())
207 {
208 return SQLGenerator<T>::restrict(prefix + "_1") + " AND " +
209 SQLGenerator<T>::restrict(prefix + "_2");
210 }
211
212 static QString valueString(const QString &prefix = QString())
213 {
214 return SQLGenerator<T>::valueString(prefix + "_1") + ", " +
215 SQLGenerator<T>::valueString(prefix + "_2");
216 }
217
218 static void bindValue(QSqlQuery& query, const OrderedPair<T>& value, const QString& prefix = QString())
219 {
220 SQLGenerator<T>::bindValue(query, value.first, prefix + "_1");
221 SQLGenerator<T>::bindValue(query, value.second, prefix + "_2");
222 }
223
224 static void bindValues(QSqlQuery& query, const QList<OrderedPair<T> >& values, const QString& prefix = QString())
225 {
226 QList<T> first;
227 QList<T> second;
228 foreach(OrderedPair<T> value, values) {
229 first << value.first;
230 second << value.second;
231 }
232 SQLGenerator<T>::bindValues(query, first, prefix + "_1");
233 SQLGenerator<T>::bindValues(query, second, prefix + "_2");
234 }
235
236 static boost::optional<OrderedPair<T> > extract(QSqlQuery& query, const QString& prefix = QString())
237 {
238 if (query.at() >= 0)
239 return OrderedPair<T> (*SQLGenerator<T>::extract(query, prefix + "_1"),
240 *SQLGenerator<T>::extract(query, prefix + "_2"));
241 else
242 return boost::optional<OrderedPair<T> >();
243 }
244
245
246 }; 29 };
247 30
248 template<typename Key, typename Value, bool memoryMapped = false> 31 template<typename Key, typename Value, bool memoryMapped = false>
249 class DBCache 32 class DBCache
250 { 33 {