changeset 108:e9b798e80bad

Setup prepared begin, end queries. Support for more effective delete statement.
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Tue, 18 Feb 2014 17:08:06 +0100
parents d434137e296d
children 6cf5eb5b0be1
files SqliteDBLink.cpp
diffstat 1 files changed, 33 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/SqliteDBLink.cpp	Tue Feb 18 17:07:01 2014 +0100
+++ b/SqliteDBLink.cpp	Tue Feb 18 17:08:06 2014 +0100
@@ -48,6 +48,12 @@
   }
 
 
+  preparedBeginQuery = new QSqlQuery(db);
+  preparedBeginQuery->prepare("BEGIN");
+
+  preparedEndQuery = new QSqlQuery(db);
+  preparedEndQuery->prepare("END");
+
   preparedSizePrefixQuery = new QSqlQuery(db);
   preparedSizePrefixQuery->prepare("SELECT * FROM files WHERE path LIKE :prefix AND size = :size");
 
@@ -233,14 +239,34 @@
 				      const QStringList& files,
 				      bool lazy)
 {
-  QStringList list;
-  foreach(dbinf_ptr_t info, values(prefix)) {
-    if (!files.contains(info->path())) {
-      list << info->path();
-    }
+  QString keepQuerySQL =
+    "DELETE FROM files WHERE %1 path NOT IN ( %2 )";
+
+  bool first = true;
+  QString inList = "";
+  foreach (const QString& file, files) {
+    if (first)
+      first = false;
+    else
+      inList+=", ";
+
+    inList+="'"+QString(file).replace("'","''")+"'";
   }
-  foreach(QString path, list) {
-    deleteFileFromDB(path, lazy);
+
+  if (prefix.isEmpty()) {
+    keepQuerySQL = keepQuerySQL.arg("");
+  }
+  else {
+    keepQuerySQL = keepQuerySQL.arg("path LIKE :prefix1 AND ");
+  }
+  keepQuerySQL = keepQuerySQL.arg(inList);
+  QSqlQuery keepQuery(db);
+  keepQuery.prepare(keepQuerySQL);
+  if (prefix.size() > 0) {
+    keepQuery.bindValue(":prefix", QString("%1%").arg(prefix));
+  }
+  if (!keepQuery.exec()) {
+    throw SQLException(keepQuery);
   }
 }