annotate SqliteDBLink.cpp @ 104:6bc013d5788b

Avoid unnecessary updates. Fix problems with wrong subset being selected for update with prefix. Fix some problems with to much verbosity in debug statements.
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Sat, 15 Feb 2014 13:34:10 +0100
parents 6c6f3a5f96ea
children e9b798e80bad
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
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
51 preparedSizePrefixQuery = new QSqlQuery(db);
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
52 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
53
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
54 preparedSizeQuery = new QSqlQuery(db);
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
55 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
56
90
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
57 preparedTryAddQuery = new QSqlQuery(db);
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
58 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
59 " VALUES (:path, :size, :mtime, :checksum)");
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
60
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
61 preparedUpdateQuery = new QSqlQuery(db);
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
62 preparedUpdateQuery->prepare(
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
63 "UPDATE files "
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
64 "SET size=:size, mtime=:mtime, checksum=:checksum "
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
65 "WHERE path=:path");
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
66
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
67 preparedDeleteQuery = new QSqlQuery(db);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
68 preparedDeleteQuery->prepare("DELETE FROM files WHERE path = :path");
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
69 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
70
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
71 SqliteDBLink::~SqliteDBLink()
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
72 {
88
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
73 delete preparedSizePrefixQuery;
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
74 delete preparedSizeQuery;
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
75 delete preparedTryAddQuery;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
76 delete preparedUpdateQuery;
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
77 db.close();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
78 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
79
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
80 bool SqliteDBLink::exists(const QString& path)
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
81 {
16
06166d6c083b Add configuration processing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 9
diff changeset
82 QSqlQuery query(db);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
83 query.prepare("SELECT path FROM files WHERE path = :path;");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
84 query.bindValue(":path", path);
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
85 if (!query.exec()) {
31
bf3dce7fedcb Remove all references to QDebug
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 16
diff changeset
86 throw SQLException(query);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
87 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
88 return query.last();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
89 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
90
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
91 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
92 const QDateTime& mtime)
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
93 {
16
06166d6c083b Add configuration processing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 9
diff changeset
94 QSqlQuery query(db);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
95 query.prepare("SELECT mtime FROM files WHERE path = :path;");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
96 query.bindValue(":path", path);
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
97 if (!query.exec()) {
31
bf3dce7fedcb Remove all references to QDebug
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 16
diff changeset
98 throw SQLException(query);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
99 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
100 if (query.next()) {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
101 int dateIndex = query.record().indexOf("mtime");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
102 QDateTime mtimeEntry = query.value(dateIndex).toDateTime();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
103 if (mtimeEntry == mtime)
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
104 return SAME;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
105 return MTIME_DIFFERENT;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
106 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
107 return NONE;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
108 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
109
86
af7962f3274b Use quint64 for sizes, rather than qint64.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 85
diff changeset
110 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
111 const QDateTime& dtime, const QByteArray& hash,
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
112 bool lazy)
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
113 {
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
114 addFile(DBInfo(path, size, dtime, hash), lazy);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
115 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
116
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
117 bool SqliteDBLink::tryAddFile(const DBInfo& dbinfo)
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
118 {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
119 if (exists(dbinfo.path()))
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
120 return false;
90
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
121 preparedTryAddQuery->bindValue(":path", dbinfo.path());
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
122 preparedTryAddQuery->bindValue(":size", dbinfo.size());
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
123 preparedTryAddQuery->bindValue(":mtime", dbinfo.mtime());
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
124 preparedTryAddQuery->bindValue(":checksum", dbinfo.checksum());
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
125 if (!preparedTryAddQuery->exec()) {
7b7a959c993b Prepare some more queries.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 88
diff changeset
126 throw SQLException(*preparedTryAddQuery);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
127 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
128 return true;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
129 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
130
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
131 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
132 quint64 size, const QDateTime& dtime,
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
133 const QByteArray& hash, bool lazy)
7
d6fdca3bf24e Make sure everything works for MemoryDBLink.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 5
diff changeset
134 {
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
135 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
136 }
d6fdca3bf24e Make sure everything works for MemoryDBLink.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 5
diff changeset
137
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
138 void SqliteDBLink::updateFile(const DBInfo& dbinfo, bool lazy)
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
139 {
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
140 if (lazy) {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
141 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
142 }
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
143 else {
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
144 preparedUpdateQuery->bindValue(":path", dbinfo.path());
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
145 preparedUpdateQuery->bindValue(":size", dbinfo.size());
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
146 preparedUpdateQuery->bindValue(":mtime", dbinfo.mtime());
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
147 preparedUpdateQuery->bindValue(":checksum", dbinfo.checksum());
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
148 if (!preparedUpdateQuery->exec()) {
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
149 throw SQLException(*preparedUpdateQuery);
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
150 }
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
151 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
152 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
153
92
f49023c61dac Support for bulk insertion.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 90
diff changeset
154 void SqliteDBLink::addFile(const DBInfo& dbinfo, bool lazy)
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
155 {
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
156 if (lazy) {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
157 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
158 }
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
159 else {
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
160 if (!tryAddFile(dbinfo)) {
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
161 abort(); //Should throw exception
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
162 }
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
163 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
164 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
165
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
166
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
167 QStringList SqliteDBLink::toStringList()
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
168 {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
169 abort();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
170 QStringList list;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
171 /*
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
172 foreach(dbinf_ptr_t info, entries) {
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
173 list << info->serialize();
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 */
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
176 return list;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
177 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
178
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
179 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
180 SqliteDBLink::values(const QString& prefix) const
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
181 {
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
182 QList<FileDBLink::dbinf_ptr_t > values;
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
183
16
06166d6c083b Add configuration processing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 9
diff changeset
184 QSqlQuery query(db);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
185
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
186 if (prefix.size() > 0) {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
187 query.prepare("SELECT * FROM files WHERE path LIKE :prefix");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
188 query.bindValue(":prefix", QString("%1%").arg(prefix));
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
189 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
190 else {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
191 query.prepare("SELECT * FROM files");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
192 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
193
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
194 if (!query.exec()) {
31
bf3dce7fedcb Remove all references to QDebug
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 16
diff changeset
195 throw SQLException(query);
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
196 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
197
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
198 int pathIndex = query.record().indexOf("path");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
199 int sizeIndex = query.record().indexOf("size");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
200 int dateIndex = query.record().indexOf("mtime");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
201 int checksumIndex = query.record().indexOf("checksum");
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
202 while (query.next()) {
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
203 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
204 quint64 size = query.value(sizeIndex).toInt();
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
205 QDateTime mtime = query.value(dateIndex).toDateTime();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
206 QByteArray checksum = query.value(checksumIndex).toByteArray();
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
207
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
208 values <<
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
209 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
210 size, mtime, checksum));
2
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
211 }
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
212
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
213 return values;
2833b7f8884a Sql backend is working.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
214 }
5
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
215
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
216 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
217 {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
218 if (lazy) {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
219 operations.push_back(new DeleteOperation(path));
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
220 }
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
221 else {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
222 QSqlQuery query(db);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
223 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
224 query.bindValue(":path", path);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
225 if (!query.exec()) {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
226 throw SQLException(query);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
227 }
16
06166d6c083b Add configuration processing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 9
diff changeset
228 }
5
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
229 }
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
230
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
231
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
232 void SqliteDBLink::keepOnlyFromPrefix(const QString& prefix,
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
233 const QStringList& files,
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
234 bool lazy)
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 QStringList list;
64
b9515dc35fe4 Make sure no file has greater linewidth than 80.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 62
diff changeset
237 foreach(dbinf_ptr_t info, values(prefix)) {
5
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
238 if (!files.contains(info->path())) {
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
239 list << info->path();
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
240 }
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
241 }
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
242 foreach(QString path, list) {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
243 deleteFileFromDB(path, lazy);
5
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
244 }
5e4985407feb Add commandline tool updateDeDupe.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
245 }
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
246
86
af7962f3274b Use quint64 for sizes, rather than qint64.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 85
diff changeset
247 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
248 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
249 {
88
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
250 QList<dbinf_ptr_t > values;
87
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
251
88
6e1d4d2fc49b Prepare size query only once.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 87
diff changeset
252 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
253
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
254 if (prefix.size() > 0) {
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
255 query.bindValue(":prefix", QString("%1%").arg(prefix));
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
256 }
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
257 query.bindValue(":size", QString("%1%").arg(size));
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
258
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
259
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
260 if (!query.exec()) {
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
261 throw SQLException(query);
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
262 }
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
263
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
264 int pathIndex = query.record().indexOf("path");
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
265 int sizeIndex = query.record().indexOf("size");
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
266 int dateIndex = query.record().indexOf("mtime");
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
267 int checksumIndex = query.record().indexOf("checksum");
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
268 while (query.next()) {
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
269 QString path = query.value(pathIndex).toString();
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
270 quint64 size = query.value(sizeIndex).toInt();
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
271 QDateTime mtime = query.value(dateIndex).toDateTime();
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
272 QByteArray checksum = query.value(checksumIndex).toByteArray();
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
273
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
274 values <<
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
275 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
276 size, mtime, checksum));
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
277 }
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
278
9e337bd96bd3 Improve efficiency of SqliteDBLink::filesWithSize
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 86
diff changeset
279 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
280 }
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
281
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
282 void SqliteDBLink::executeOperation(QVariantList& paths,
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
283 QVariantList& sizes,
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
284 QVariantList& mtimes,
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
285 QVariantList& checksums,
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
286 OperationType operation)
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
287 {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
288 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
289 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
290 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
291 QSqlQuery* query;
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
292 bool infoQuery;
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
293 switch (operation) {
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
294 case Add:
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
295 query = preparedTryAddQuery;
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
296 infoQuery = true;
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
297 break;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
298 case Update:
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
299 query = preparedUpdateQuery;
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
300 infoQuery = true;
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
301 break;
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
302 case Delete:
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
303 query = preparedDeleteQuery;
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
304 infoQuery = false;
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
305 break;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
306 case None:
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
307 assert(paths.size() == 0);
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
308 return;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
309 }
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
310 query->bindValue("path", paths);
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
311 if (infoQuery) {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
312 query->bindValue("size", sizes);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
313 query->bindValue("mtime", mtimes);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
314 query->bindValue("checksum", checksums);
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
315 }
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
316
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
317 if (!query->execBatch())
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
318 throw SQLException(*query);
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
319
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
320 paths.clear();
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
321 sizes.clear();
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
322 mtimes.clear();
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
323 checksums.clear();
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
324 }
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
325
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
326 const char* SqliteDBLink::typeString(OperationType type)
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
327 {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
328 switch(type) {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
329 case Add:
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
330 return "Add";
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
331 case Update:
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
332 return "Update";
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
333 case Delete:
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
334 return "Delete";
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
335 case None:
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
336 return "None";
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
337 }
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
338
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
339 return "";
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
340 }
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
341
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
342
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
343 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
344 {
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
345 OperationType last = None;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
346 QVariantList paths, sizes, mtimes, hashes;
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
347
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
348 const Operation* operation =
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
349 (operations.empty()) ? NULL : operations.takeFirst();
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
350
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
351 while (operation) {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
352 if (operation->type() != last) {
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
353 executeOperation(paths, sizes, mtimes, hashes, last);
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
354 }
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
355
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
356 switch (operation->type()) {
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
357 case Add:
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
358 case Update: {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
359 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
360 paths.push_back(iOperation->info().path());
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
361 sizes.push_back(iOperation->info().size());
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
362 mtimes.push_back(iOperation->info().mtime());
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
363 hashes.push_back(iOperation->info().checksum());
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
364 dirty = true;
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
365 break;
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
366 }
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
367 case Delete: {
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
368 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
369 paths.push_back(dOperation->path());
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
370 }
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
371 case None:
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
372 break;
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
373 }
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
374 last = operation->type();
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
375 delete operation;
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
376 operation = (operations.empty()) ? NULL : operations.takeFirst();
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
377 }
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
378 if (last != None) {
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
379 qDebug() << "Execute Operation" << typeString(last);
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
380 foreach(QVariant path, paths) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
381 qDebug() << path.toString();
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
382 }
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
383 executeOperation(paths, sizes, mtimes, hashes, last);
101
6c6f3a5f96ea Better support for batch operations.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 96
diff changeset
384 qDebug() << "Execute Operation Done";
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
385 }
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
386
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
387 if (dirty) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
388 QSqlQuery whatToUpdate(db);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
389 QString whatToUpdateQuery =
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
390 "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
391 "(SELECT size FROM files WHERE size <> 0 %2 "
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
392 "GROUP BY size HAVING count(*) > 1) ORDER BY size";
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
393 if (prefix.isEmpty()) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
394 whatToUpdateQuery = whatToUpdateQuery.arg("");
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
395 }
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
396 else {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
397 whatToUpdateQuery = whatToUpdateQuery.arg("AND path LIKE :prefix1");
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
398 whatToUpdateQuery = whatToUpdateQuery.arg("AND path LIKE :prefix2");
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
399 }
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
400 whatToUpdate.prepare(whatToUpdateQuery);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
401 if (!prefix.isEmpty()) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
402 whatToUpdate.bindValue("prefix1", QString("%1%").arg(prefix));
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
403 whatToUpdate.bindValue("prefix2", QString("%1%").arg(prefix));
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
404 }
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
405
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
406 qDebug() << "Before whatToUpdate";
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
407 if (!whatToUpdate.exec()) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
408 throw SQLException(whatToUpdate);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
409 }
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
410 qDebug() << "After whatToUpdate";
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
411
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
412 int pathIndex = whatToUpdate.record().indexOf("path");
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
413 QStringList updatePaths;
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
414 while (whatToUpdate.next()) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
415 updatePaths << whatToUpdate.value(pathIndex).toString();
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
416 }
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
417 int n = 0;
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
418 int max = updatePaths.size();
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
419 emit progressUpdate(0, max);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
420 QSqlQuery updateChecksum(db);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
421 updateChecksum.prepare("UPDATE files "
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
422 "SET checksum=:checksum "
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
423 "WHERE path=:path");
94
93981e675d67 Full support for bulkcommits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 93
diff changeset
424
104
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
425 foreach (const QString& path, updatePaths) {
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
426 qDebug() << path;
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
427 QByteArray ohash = computeHash(path);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
428 emit progressUpdate(++n, max);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
429 updateChecksum.bindValue("checksum", ohash);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
430 updateChecksum.bindValue("path", path);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
431 if (!updateChecksum.exec())
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
432 throw SQLException(updateChecksum);
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
433
6bc013d5788b Avoid unnecessary updates.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 101
diff changeset
434 }
93
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
435 }
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
436 return true;
308a718812ba Small refactoring to allow lazy commits.
Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
parents: 92
diff changeset
437 }