Mercurial > dedupe
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); } }
