comparison DBCache.hpp @ 58:7b7e84356b39

Introduce API for fine tuning inserts. Reduce the amount of rebuilds.
author Tom Fredrik Blenning Klaussen <bfg@blenning.no>
date Fri, 14 Sep 2012 00:04:24 +0200
parents f711ddb56ae7
children 74be5a2f49db
comparison
equal deleted inserted replaced
57:c8111de2e0bb 58:7b7e84356b39
15 #include <QtSql/QSqlError> 15 #include <QtSql/QSqlError>
16 #include <QtSql/QSqlQuery> 16 #include <QtSql/QSqlQuery>
17 #include <QtSql/QSqlRecord> 17 #include <QtSql/QSqlRecord>
18 18
19 #include <boost/optional.hpp> 19 #include <boost/optional.hpp>
20
21 #include <QtCore/QString>
22
23 template<typename Key, typename Value>
24 struct InsertRegulator {
25 static void start() {}
26 static void finish() {}
27 static void next() {}
28 };
20 29
21 template<typename T> 30 template<typename T>
22 struct SQLGenerator 31 struct SQLGenerator
23 { 32 {
24 }; 33 };
262 QString repopulateQuery = QString("SELECT %1, %2 FROM %3;").arg(keyFields).arg(valueFields).arg(dictName); 271 QString repopulateQuery = QString("SELECT %1, %2 FROM %3;").arg(keyFields).arg(valueFields).arg(dictName);
263 QSqlQuery query(db); 272 QSqlQuery query(db);
264 if (!query.exec(repopulateQuery)) { 273 if (!query.exec(repopulateQuery)) {
265 throw SQLException(query); 274 throw SQLException(query);
266 } 275 }
276 InsertRegulator<Key, Value> regulator;
277 regulator.start();
267 while (query.next()) { 278 while (query.next()) {
268 Key key = *SQLGenerator<Key>::extract(query, "key"); 279 Key key = *SQLGenerator<Key>::extract(query, "key");
269 Value value = *SQLGenerator<Value>::extract(query, "value"); 280 Value value = *SQLGenerator<Value>::extract(query, "value");
270 memoryMap.insert(key, value); 281 memoryMap.insert(key, value);
271 } 282 regulator.next();
283 }
284 regulator.finish();
272 } 285 }
273 QString queryString = QString("INSERT into %1 (%2, %3) VALUES(%4, %5);") 286 QString queryString = QString("INSERT into %1 (%2, %3) VALUES(%4, %5);")
274 .arg(dictName) 287 .arg(dictName)
275 .arg(SQLGenerator<Key>::fieldName("key")) 288 .arg(SQLGenerator<Key>::fieldName("key"))
276 .arg(SQLGenerator<Value>::fieldName("value")) 289 .arg(SQLGenerator<Value>::fieldName("value"))