annotate SqliteDBLink.cpp @ 115:404795616b1e default tip

Added a lot of common files to ignore
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Sat, 25 Mar 2017 17:43:57 +0100
parents d4e337567960
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
1
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
2
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
3 #include "SqliteDBLink.hpp"
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
4
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
5 #include <QtCore/QStringList>
31
bf3dce7fedcb Remove all references to QDebug
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 16
diff changeset
6 #include <QtCore/QVariant>
bf3dce7fedcb Remove all references to QDebug
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 16
diff changeset
7
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
8
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
9 #include <QtSql/QSqlQuery>
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
10 #include <QtSql/QSqlRecord>
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
11
31
bf3dce7fedcb Remove all references to QDebug
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 16
diff changeset
12 #include "Exception/SQLException.hpp"
32
c978d4a6514d Replace unnecessary asserts with exceptions.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 31
diff changeset
13 #include "Exception/IOException.hpp"
9
b5943e4bf676 Fix up header includes.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
14
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
15 #include <cassert>
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
16
81
69a30d9f126e Make the DBLink reusable.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 64
diff changeset
17 const QString SqliteDBLink::connectionName("SqliteDBLink");
69a30d9f126e Make the DBLink reusable.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 64
diff changeset
18
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
19 #include <QtCore/QDebug>
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
20
81
69a30d9f126e Make the DBLink reusable.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 64
diff changeset
21
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
22 SqliteDBLink::SqliteDBLink(const QString& dbPath)
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
23 {
81
69a30d9f126e Make the DBLink reusable.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 64
diff changeset
24 if (!QSqlDatabase::contains(connectionName))
69a30d9f126e Make the DBLink reusable.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 64
diff changeset
25 db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
69a30d9f126e Make the DBLink reusable.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 64
diff changeset
26 else {
69a30d9f126e Make the DBLink reusable.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 64
diff changeset
27 db = QSqlDatabase::database(connectionName);
69a30d9f126e Make the DBLink reusable.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 64
diff changeset
28 }
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
29 db.setDatabaseName(dbPath);
32
c978d4a6514d Replace unnecessary asserts with exceptions.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 31
diff changeset
30 if (!db.open())
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
31 throw
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
32 IOException(QString("Unable to open SQLite database with path '%1'")
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
33 .arg(dbPath));
16
06166d6c083b Add configuration processing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 9
diff changeset
34 QSqlQuery query(db);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
35 if (!query.exec(QString("SELECT * FROM files;"))) {
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
36 query.exec("CREATE TABLE files(path VARCHAR PRIMARY KEY ASC,"
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
37 " size INTEGER, mtime TEXT, checksum TEXT);");
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
38 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
39 if (!query.exec(QString("SELECT * FROM files;"))) {
31
bf3dce7fedcb Remove all references to QDebug
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 16
diff changeset
40 throw SQLException("No database");
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
41 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
42
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
43 if (!query.exec(QString("SELECT * FROM human_files;"))) {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
44 query.exec("CREATE VIEW human_files AS SELECT path, size, date(mtime) as mdate, time(mtime) as mtime, hex(checksum) as checksum FROM files;");
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
45 }
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
46 if (!query.exec(QString("SELECT * FROM human_files;"))) {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
47 throw SQLException("No view");
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
48 }
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
49
88
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
50
108
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
51 preparedBeginQuery = new QSqlQuery(db);
109
6cf5eb5b0be1 Embed batch operations in BEGIN-END TRANSACTION for speed improvement.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 108
diff changeset
52 preparedBeginQuery->prepare("BEGIN TRANSACTION");
108
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
53
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
54 preparedEndQuery = new QSqlQuery(db);
109
6cf5eb5b0be1 Embed batch operations in BEGIN-END TRANSACTION for speed improvement.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 108
diff changeset
55 preparedEndQuery->prepare("END TRANSACTION");
108
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
56
88
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
57 preparedSizePrefixQuery = new QSqlQuery(db);
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
58 preparedSizePrefixQuery->prepare("SELECT * FROM files WHERE path LIKE :prefix AND size = :size");
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
59
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
60 preparedSizeQuery = new QSqlQuery(db);
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
61 preparedSizeQuery->prepare("SELECT * FROM files WHERE size = :size");
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
62
90
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
63 preparedTryAddQuery = new QSqlQuery(db);
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
64 preparedTryAddQuery->prepare("INSERT INTO files (path, size, mtime, checksum)"
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
65 " VALUES (:path, :size, :mtime, :checksum)");
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
66
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
67 preparedUpdateQuery = new QSqlQuery(db);
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
68 preparedUpdateQuery->prepare(
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
69 "UPDATE files "
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
70 "SET size=:size, mtime=:mtime, checksum=:checksum "
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
71 "WHERE path=:path");
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
72
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
73 preparedDeleteQuery = new QSqlQuery(db);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
74 preparedDeleteQuery->prepare("DELETE FROM files WHERE path = :path");
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
75 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
76
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
77 SqliteDBLink::~SqliteDBLink()
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
78 {
88
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
79 delete preparedSizePrefixQuery;
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
80 delete preparedSizeQuery;
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
81 delete preparedTryAddQuery;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
82 delete preparedUpdateQuery;
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
83 db.close();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
84 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
85
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
86 bool SqliteDBLink::exists(const QString& path)
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
87 {
16
06166d6c083b Add configuration processing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 9
diff changeset
88 QSqlQuery query(db);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
89 query.prepare("SELECT path FROM files WHERE path = :path;");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
90 query.bindValue(":path", path);
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
91 if (!query.exec()) {
31
bf3dce7fedcb Remove all references to QDebug
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 16
diff changeset
92 throw SQLException(query);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
93 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
94 return query.last();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
95 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
96
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
97 FileDBLink::DBStatus SqliteDBLink::existsWithMtime(const QString& path,
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
98 const QDateTime& mtime)
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
99 {
16
06166d6c083b Add configuration processing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 9
diff changeset
100 QSqlQuery query(db);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
101 query.prepare("SELECT mtime FROM files WHERE path = :path;");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
102 query.bindValue(":path", path);
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
103 if (!query.exec()) {
31
bf3dce7fedcb Remove all references to QDebug
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 16
diff changeset
104 throw SQLException(query);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
105 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
106 if (query.next()) {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
107 int dateIndex = query.record().indexOf("mtime");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
108 QDateTime mtimeEntry = query.value(dateIndex).toDateTime();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
109 if (mtimeEntry == mtime)
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
110 return SAME;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
111 return MTIME_DIFFERENT;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
112 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
113 return NONE;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
114 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
115
86
af7962f3274b Use quint64 for sizes, rather than qint64.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 85
diff changeset
116 void SqliteDBLink::addFile(const QString& path, quint64 size,
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
117 const QDateTime& dtime, const QByteArray& hash,
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
118 bool lazy)
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
119 {
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
120 addFile(DBInfo(path, size, dtime, hash), lazy);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
121 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
122
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
123 bool SqliteDBLink::tryAddFile(const DBInfo& dbinfo)
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
124 {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
125 if (exists(dbinfo.path()))
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
126 return false;
90
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
127 preparedTryAddQuery->bindValue(":path", dbinfo.path());
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
128 preparedTryAddQuery->bindValue(":size", dbinfo.size());
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
129 preparedTryAddQuery->bindValue(":mtime", dbinfo.mtime());
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
130 preparedTryAddQuery->bindValue(":checksum", dbinfo.checksum());
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
131 if (!preparedTryAddQuery->exec()) {
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
132 throw SQLException(*preparedTryAddQuery);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
133 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
134 return true;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
135 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
136
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
137 void SqliteDBLink::updateFile(const QString& path,
86
af7962f3274b Use quint64 for sizes, rather than qint64.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 85
diff changeset
138 quint64 size, const QDateTime& dtime,
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
139 const QByteArray& hash, bool lazy)
7
d6fdca3bf24e Make sure everything works for MemoryDBLink.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 5
diff changeset
140 {
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
141 updateFile(DBInfo(path, size, dtime, hash), lazy);
7
d6fdca3bf24e Make sure everything works for MemoryDBLink.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 5
diff changeset
142 }
d6fdca3bf24e Make sure everything works for MemoryDBLink.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 5
diff changeset
143
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
144 void SqliteDBLink::updateFile(const DBInfo& dbinfo, bool lazy)
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
145 {
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
146 if (lazy) {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
147 operations.push_back(new UpdateOperation(dbinfo));
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
148 }
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
149 else {
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
150 preparedUpdateQuery->bindValue(":path", dbinfo.path());
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
151 preparedUpdateQuery->bindValue(":size", dbinfo.size());
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
152 preparedUpdateQuery->bindValue(":mtime", dbinfo.mtime());
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
153 preparedUpdateQuery->bindValue(":checksum", dbinfo.checksum());
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
154 if (!preparedUpdateQuery->exec()) {
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
155 throw SQLException(*preparedUpdateQuery);
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
156 }
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
157 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
158 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
159
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
160 void SqliteDBLink::addFile(const DBInfo& dbinfo, bool lazy)
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
161 {
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
162 if (lazy) {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
163 operations.push_back(new AddOperation(dbinfo));
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
164 }
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
165 else {
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
166 if (!tryAddFile(dbinfo)) {
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
167 abort(); //Should throw exception
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
168 }
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
169 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
170 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
171
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
172
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
173 QStringList SqliteDBLink::toStringList()
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
174 {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
175 abort();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
176 QStringList list;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
177 /*
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
178 foreach(dbinf_ptr_t info, entries) {
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
179 list << info->serialize();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
180 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
181 */
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
182 return list;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
183 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
184
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
185 const QList<FileDBLink::dbinf_ptr_t >
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
186 SqliteDBLink::values(const QString& prefix) const
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
187 {
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
188 QList<FileDBLink::dbinf_ptr_t > values;
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
189
16
06166d6c083b Add configuration processing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 9
diff changeset
190 QSqlQuery query(db);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
191
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
192 if (prefix.size() > 0) {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
193 query.prepare("SELECT * FROM files WHERE path LIKE :prefix");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
194 query.bindValue(":prefix", QString("%1%").arg(prefix));
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
195 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
196 else {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
197 query.prepare("SELECT * FROM files");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
198 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
199
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
200 if (!query.exec()) {
31
bf3dce7fedcb Remove all references to QDebug
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 16
diff changeset
201 throw SQLException(query);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
202 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
203
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
204 int pathIndex = query.record().indexOf("path");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
205 int sizeIndex = query.record().indexOf("size");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
206 int dateIndex = query.record().indexOf("mtime");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
207 int checksumIndex = query.record().indexOf("checksum");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
208 while (query.next()) {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
209 QString path = query.value(pathIndex).toString();
86
af7962f3274b Use quint64 for sizes, rather than qint64.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 85
diff changeset
210 quint64 size = query.value(sizeIndex).toInt();
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
211 QDateTime mtime = query.value(dateIndex).toDateTime();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
212 QByteArray checksum = query.value(checksumIndex).toByteArray();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
213
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
214 values <<
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
215 FileDBLink::dbinf_ptr_t(new FileDBLink::DBInfo(path,
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
216 size, mtime, checksum));
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
217 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
218
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
219 return values;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
220 }
5
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
221
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
222 void SqliteDBLink::deleteFileFromDB(const QString& path, bool lazy)
5
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
223 {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
224 if (lazy) {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
225 operations.push_back(new DeleteOperation(path));
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
226 }
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
227 else {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
228 QSqlQuery query(db);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
229 query.prepare("DELETE FROM files WHERE path = :path");
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
230 query.bindValue(":path", path);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
231 if (!query.exec()) {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
232 throw SQLException(query);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
233 }
16
06166d6c083b Add configuration processing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 9
diff changeset
234 }
5
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
235 }
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
236
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
237
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
238 void SqliteDBLink::keepOnlyFromPrefix(const QString& prefix,
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
239 const QStringList& files,
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
240 bool lazy)
5
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
241 {
108
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
242 QString keepQuerySQL =
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
243 "DELETE FROM files WHERE %1 path NOT IN ( %2 )";
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
244
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
245 bool first = true;
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
246 QString inList = "";
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
247 foreach (const QString& file, files) {
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
248 if (first)
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
249 first = false;
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
250 else
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
251 inList+=", ";
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
252
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
253 inList+="'"+QString(file).replace("'","''")+"'";
5
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
254 }
108
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
255
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
256 if (prefix.isEmpty()) {
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
257 keepQuerySQL = keepQuerySQL.arg("");
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
258 }
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
259 else {
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
260 keepQuerySQL = keepQuerySQL.arg("path LIKE :prefix1 AND ");
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
261 }
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
262 keepQuerySQL = keepQuerySQL.arg(inList);
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
263 QSqlQuery keepQuery(db);
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
264 keepQuery.prepare(keepQuerySQL);
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
265 if (prefix.size() > 0) {
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
266 keepQuery.bindValue(":prefix", QString("%1%").arg(prefix));
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
267 }
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
268 if (!keepQuery.exec()) {
e9b798e80bad Setup prepared begin, end queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 104
diff changeset
269 throw SQLException(keepQuery);
5
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
270 }
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
271 }
85
1f9e27a0bd7f Allow for lazy calculation of checksums, ignore them, if only one file of given size.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 81
diff changeset
272
86
af7962f3274b Use quint64 for sizes, rather than qint64.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 85
diff changeset
273 const QList<FileDBLink::dbinf_ptr_t>
af7962f3274b Use quint64 for sizes, rather than qint64.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 85
diff changeset
274 SqliteDBLink::filesWithSize(quint64 size, const QString& prefix) const
85
1f9e27a0bd7f Allow for lazy calculation of checksums, ignore them, if only one file of given size.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 81
diff changeset
275 {
88
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
276 QList<dbinf_ptr_t > values;
87
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
277
88
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
278 QSqlQuery & query = (prefix.size() > 0) ? *preparedSizePrefixQuery : *preparedSizeQuery;
87
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
279
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
280 if (prefix.size() > 0) {
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
281 query.bindValue(":prefix", QString("%1%").arg(prefix));
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
282 }
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
283 query.bindValue(":size", QString("%1%").arg(size));
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
284
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
285
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
286 if (!query.exec()) {
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
287 throw SQLException(query);
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
288 }
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
289
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
290 int pathIndex = query.record().indexOf("path");
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
291 int sizeIndex = query.record().indexOf("size");
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
292 int dateIndex = query.record().indexOf("mtime");
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
293 int checksumIndex = query.record().indexOf("checksum");
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
294 while (query.next()) {
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
295 QString path = query.value(pathIndex).toString();
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
296 quint64 size = query.value(sizeIndex).toInt();
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
297 QDateTime mtime = query.value(dateIndex).toDateTime();
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
298 QByteArray checksum = query.value(checksumIndex).toByteArray();
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
299
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
300 values <<
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
301 FileDBLink::dbinf_ptr_t(new FileDBLink::DBInfo(path,
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
302 size, mtime, checksum));
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
303 }
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
304
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
305 return values;
85
1f9e27a0bd7f Allow for lazy calculation of checksums, ignore them, if only one file of given size.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 81
diff changeset
306 }
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
307
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
308 void SqliteDBLink::executeOperation(QVariantList& paths,
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
309 QVariantList& sizes,
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
310 QVariantList& mtimes,
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
311 QVariantList& checksums,
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
312 OperationType operation)
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
313 {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
314 assert(sizes.size() == 0 || paths.size() == sizes.size());
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
315 assert(mtimes.size() == 0 || paths.size() == mtimes.size());
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
316 assert(checksums.size() == 0 || paths.size() == checksums.size());
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
317 QSqlQuery* query;
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
318 bool infoQuery;
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
319 switch (operation) {
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
320 case Add:
114
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
321 qDebug() << "Add";
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
322 query = preparedTryAddQuery;
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
323 infoQuery = true;
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
324 break;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
325 case Update:
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
326 query = preparedUpdateQuery;
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
327 infoQuery = true;
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
328 break;
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
329 case Delete:
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
330 query = preparedDeleteQuery;
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
331 infoQuery = false;
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
332 break;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
333 case None:
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
334 assert(paths.size() == 0);
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
335 return;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
336 }
114
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
337 if (operation != Update)
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
338 query->bindValue("path", paths);
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
339 if (infoQuery) {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
340 query->bindValue("size", sizes);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
341 query->bindValue("mtime", mtimes);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
342 query->bindValue("checksum", checksums);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
343 }
114
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
344 //Because QT for some reason expect the parameters to be given in sequence
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
345 if (operation == Update)
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
346 query->bindValue("path", paths);
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
347
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
348
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
349 if (!query->execBatch())
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
350 throw SQLException(*query);
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
351
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
352 paths.clear();
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
353 sizes.clear();
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
354 mtimes.clear();
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
355 checksums.clear();
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
356 }
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
357
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
358 const char* SqliteDBLink::typeString(OperationType type)
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
359 {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
360 switch(type) {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
361 case Add:
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
362 return "Add";
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
363 case Update:
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
364 return "Update";
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
365 case Delete:
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
366 return "Delete";
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
367 case None:
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
368 return "None";
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
369 }
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
370
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
371 return "";
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
372 }
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
373
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
374
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
375 bool SqliteDBLink::commit(const QString& prefix, bool dirty)
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
376 {
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
377 OperationType last = None;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
378 QVariantList paths, sizes, mtimes, hashes;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
379
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
380 const Operation* operation =
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
381 (operations.empty()) ? NULL : operations.takeFirst();
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
382
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
383 while (operation) {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
384 if (operation->type() != last) {
114
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
385 qDebug() << "Execute Operation first" << typeString(last);
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
386 foreach(QVariant path, paths) {
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
387 qDebug() << path.toString();
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
388 }
109
6cf5eb5b0be1 Embed batch operations in BEGIN-END TRANSACTION for speed improvement.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 108
diff changeset
389 if (!preparedBeginQuery->exec())
6cf5eb5b0be1 Embed batch operations in BEGIN-END TRANSACTION for speed improvement.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 108
diff changeset
390 throw SQLException(*preparedBeginQuery);
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
391 executeOperation(paths, sizes, mtimes, hashes, last);
109
6cf5eb5b0be1 Embed batch operations in BEGIN-END TRANSACTION for speed improvement.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 108
diff changeset
392 if (!preparedEndQuery->exec())
6cf5eb5b0be1 Embed batch operations in BEGIN-END TRANSACTION for speed improvement.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 108
diff changeset
393 throw SQLException(*preparedEndQuery);
114
d4e337567960 Add some debug statements and fix a bug in SQL execution.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 109
diff changeset
394 qDebug() << "Execute Operation Done";
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
395 }
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
396
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
397 switch (operation->type()) {
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
398 case Add:
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
399 case Update: {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
400 const InfoOperation* iOperation = dynamic_cast<const InfoOperation*>(operation);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
401 paths.push_back(iOperation->info().path());
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
402 sizes.push_back(iOperation->info().size());
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
403 mtimes.push_back(iOperation->info().mtime());
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
404 hashes.push_back(iOperation->info().checksum());
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
405 dirty = true;
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
406 break;
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
407 }
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
408 case Delete: {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
409 const DeleteOperation* dOperation = dynamic_cast<const DeleteOperation*>(operation);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
410 paths.push_back(dOperation->path());
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
411 }
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
412 case None:
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
413 break;
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
414 }
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
415 last = operation->type();
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
416 delete operation;
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
417 operation = (operations.empty()) ? NULL : operations.takeFirst();
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
418 }
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
419 if (last != None) {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
420 qDebug() << "Execute Operation" << typeString(last);
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
421 foreach(QVariant path, paths) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
422 qDebug() << path.toString();
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
423 }
109
6cf5eb5b0be1 Embed batch operations in BEGIN-END TRANSACTION for speed improvement.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 108
diff changeset
424 if (!preparedBeginQuery->exec())
6cf5eb5b0be1 Embed batch operations in BEGIN-END TRANSACTION for speed improvement.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 108
diff changeset
425 throw SQLException(*preparedBeginQuery);
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
426 executeOperation(paths, sizes, mtimes, hashes, last);
109
6cf5eb5b0be1 Embed batch operations in BEGIN-END TRANSACTION for speed improvement.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 108
diff changeset
427 if (!preparedEndQuery->exec())
6cf5eb5b0be1 Embed batch operations in BEGIN-END TRANSACTION for speed improvement.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 108
diff changeset
428 throw SQLException(*preparedEndQuery);
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
429 qDebug() << "Execute Operation Done";
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
430 }
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
431
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
432 if (dirty) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
433 QSqlQuery whatToUpdate(db);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
434 QString whatToUpdateQuery =
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
435 "SELECT path FROM files WHERE checksum is NULL %1 AND size in "
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
436 "(SELECT size FROM files WHERE size <> 0 %2 "
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
437 "GROUP BY size HAVING count(*) > 1) ORDER BY size";
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
438 if (prefix.isEmpty()) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
439 whatToUpdateQuery = whatToUpdateQuery.arg("");
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
440 }
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
441 else {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
442 whatToUpdateQuery = whatToUpdateQuery.arg("AND path LIKE :prefix1");
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
443 whatToUpdateQuery = whatToUpdateQuery.arg("AND path LIKE :prefix2");
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
444 }
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
445 whatToUpdate.prepare(whatToUpdateQuery);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
446 if (!prefix.isEmpty()) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
447 whatToUpdate.bindValue("prefix1", QString("%1%").arg(prefix));
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
448 whatToUpdate.bindValue("prefix2", QString("%1%").arg(prefix));
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
449 }
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
450
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
451 qDebug() << "Before whatToUpdate";
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
452 if (!whatToUpdate.exec()) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
453 throw SQLException(whatToUpdate);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
454 }
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
455 qDebug() << "After whatToUpdate";
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
456
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
457 int pathIndex = whatToUpdate.record().indexOf("path");
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
458 QStringList updatePaths;
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
459 while (whatToUpdate.next()) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
460 updatePaths << whatToUpdate.value(pathIndex).toString();
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
461 }
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
462 int n = 0;
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
463 int max = updatePaths.size();
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
464 emit progressUpdate(0, max);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
465 QSqlQuery updateChecksum(db);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
466 updateChecksum.prepare("UPDATE files "
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
467 "SET checksum=:checksum "
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
468 "WHERE path=:path");
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
469
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
470 foreach (const QString& path, updatePaths) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
471 qDebug() << path;
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
472 QByteArray ohash = computeHash(path);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
473 emit progressUpdate(++n, max);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
474 updateChecksum.bindValue("checksum", ohash);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
475 updateChecksum.bindValue("path", path);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
476 if (!updateChecksum.exec())
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
477 throw SQLException(updateChecksum);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
478
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
479 }
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
480 }
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
481 return true;
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
482 }