[Pkg-owncloud-commits] [owncloud-client] 71/211: Sql: New implementation of ownSql class to go away from Qt's own Sql
Sandro Knauß
hefee-guest at moszumanska.debian.org
Sat Oct 25 09:10:27 UTC 2014
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository owncloud-client.
commit 09b0ba31ef9c0aad854936dd700533fd027932d5
Author: Klaas Freitag <freitag at owncloud.com>
Date: Tue Oct 14 11:14:57 2014 +0200
Sql: New implementation of ownSql class to go away from Qt's own Sql
---
src/CMakeLists.txt | 1 +
src/mirall/ownsql.cpp | 199 ++++++++++++++++++++++++++++++
src/mirall/ownsql.h | 72 +++++++++++
src/mirall/syncjournaldb.cpp | 281 ++++++++++++++++++++-----------------------
src/mirall/syncjournaldb.h | 29 +++--
5 files changed, 417 insertions(+), 165 deletions(-)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index a3b07bf..a097f15 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -75,6 +75,7 @@ set(libsync_SRCS
mirall/propagator_legacy.cpp
mirall/syncjournalfilerecord.cpp
mirall/syncjournaldb.cpp
+ mirall/ownsql.cpp
mirall/theme.cpp
mirall/owncloudtheme.cpp
mirall/logger.cpp
diff --git a/src/mirall/ownsql.cpp b/src/mirall/ownsql.cpp
new file mode 100644
index 0000000..ee18274
--- /dev/null
+++ b/src/mirall/ownsql.cpp
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) by Klaas Freitag <freitag at owncloud.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+
+#include <QDateTime>
+#include <QString>
+
+#include "ownsql.h"
+
+#define SQLITE_DO(A) if(1) { _errId = SQLITE_OK; \
+ if( A != SQLITE_OK ) { _error= QString::fromUtf8(sqlite3_errmsg(_db)); \
+ _errId = sqlite3_extended_errcode(_db ); } }
+
+SqlDatabase::SqlDatabase()
+{
+
+}
+
+bool SqlDatabase::isOpen()
+{
+ return _db != NULL;
+}
+
+bool SqlDatabase::open( const QString& filename )
+{
+ SQLITE_DO( sqlite3_open_v2(filename.toUtf8().constData(), &_db, SQLITE_OPEN_NOMUTEX, NULL) );
+
+ if( _errId != SQLITE_OK ) {
+ close(); // FIXME: Correct?
+ _db = NULL;
+ }
+ return isOpen();
+}
+
+QString SqlDatabase::error() const
+{
+ const QString err(_error);
+ // _error.clear();
+ return err;
+}
+
+void SqlDatabase::close()
+{
+ if( _db ) {
+ SQLITE_DO(sqlite3_close_v2(_db) );
+ }
+}
+
+bool SqlDatabase::transaction()
+{
+ return true;
+}
+
+bool SqlDatabase::commit()
+{
+ return true;
+}
+
+sqlite3* SqlDatabase::sqliteDb()
+{
+ return _db;
+}
+
+/* =========================================================================================== */
+
+SqlQuery::SqlQuery( SqlDatabase db )
+ :_db(db.sqliteDb())
+{
+
+}
+
+SqlQuery::~SqlQuery()
+{
+ if( _stmt ) {
+ sqlite3_finalize(_stmt);
+ }
+}
+
+SqlQuery::SqlQuery(const QString& sql, SqlDatabase db)
+ :_db(db.sqliteDb())
+{
+ prepare(sql);
+}
+
+void SqlQuery::prepare( const QString& sql)
+{
+ SQLITE_DO(sqlite3_prepare_v2(_db, sql.toUtf8(), -1, &_stmt, NULL));
+}
+
+bool SqlQuery::exec()
+{
+ SQLITE_DO(sqlite3_step(_stmt));
+
+ return (_errId == SQLITE_ROW || _errId == SQLITE_DONE);
+}
+
+void SqlQuery::bindValue(int pos, const QVariant& value)
+{
+ int res;
+ if( _stmt ) {
+ switch (value.type()) {
+ case QVariant::Int:
+ case QVariant::Bool:
+ res = sqlite3_bind_int(_stmt, pos, value.toInt());
+ break;
+ case QVariant::Double:
+ res = sqlite3_bind_double(_stmt, pos, value.toDouble());
+ break;
+ case QVariant::UInt:
+ case QVariant::LongLong:
+ res = sqlite3_bind_int64(_stmt, pos, value.toLongLong());
+ break;
+ case QVariant::DateTime: {
+ const QDateTime dateTime = value.toDateTime();
+ const QString str = dateTime.toString(QLatin1String("yyyy-MM-ddThh:mm:ss.zzz"));
+ res = sqlite3_bind_text16(_stmt, pos, str.utf16(),
+ str.size() * sizeof(ushort), SQLITE_TRANSIENT);
+ break;
+ }
+ case QVariant::Time: {
+ const QTime time = value.toTime();
+ const QString str = time.toString(QLatin1String("hh:mm:ss.zzz"));
+ res = sqlite3_bind_text16(_stmt, pos, str.utf16(),
+ str.size() * sizeof(ushort), SQLITE_TRANSIENT);
+ break;
+ }
+ case QVariant::String: {
+ // lifetime of string == lifetime of its qvariant
+ const QString *str = static_cast<const QString*>(value.constData());
+ res = sqlite3_bind_text16(_stmt, pos, str->utf16(),
+ (str->size()) * sizeof(QChar), SQLITE_STATIC);
+ break; }
+ default: {
+ QString str = value.toString();
+ // SQLITE_TRANSIENT makes sure that sqlite buffers the data
+ res = sqlite3_bind_text16(_stmt, pos, str.utf16(),
+ (str.size()) * sizeof(QChar), SQLITE_TRANSIENT);
+ break; }
+ }
+ }
+}
+
+QString SqlQuery::stringValue(int index)
+{
+ return QString::fromUtf16(static_cast<const ushort*>(sqlite3_column_text16(_stmt, index)));
+}
+
+int SqlQuery::intValue(int index)
+{
+ return sqlite3_column_int(_stmt, index);
+}
+
+quint64 SqlQuery::int64Value(int index)
+{
+ return sqlite3_column_int64(_stmt, index);
+}
+
+QByteArray SqlQuery::baValue(int index)
+{
+ return QByteArray( static_cast<const char*>(sqlite3_column_blob(_stmt, index)),
+ sqlite3_column_bytes(_stmt, index));
+}
+
+bool SqlQuery::next()
+{
+ SQLITE_DO(sqlite3_step(_stmt));
+ return _errId == SQLITE_ROW;
+}
+
+QString SqlQuery::error() const
+{
+ return QString("ERROR - not yet implemented");
+}
+
+QString SqlQuery::lastQuery() const
+{
+ return QString("Last Query");
+}
+
+int SqlQuery::numRowsAffected()
+{
+ return 1;
+}
+
+void SqlQuery::finish()
+{
+ SQLITE_DO(sqlite3_finalize(_stmt));
+ _stmt = NULL;
+}
diff --git a/src/mirall/ownsql.h b/src/mirall/ownsql.h
new file mode 100644
index 0000000..28f822c
--- /dev/null
+++ b/src/mirall/ownsql.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) by Klaas Freitag <freitag at owncloud.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#ifndef OWNSQL_H
+#define OWNSQL_H
+
+#include <sqlite3.h>
+
+#include <QObject>
+#include <QVariant>
+
+class SqlDatabase
+{
+public:
+ explicit SqlDatabase();
+
+ bool isOpen();
+ bool open( const QString& filename );
+ bool transaction();
+ bool commit();
+ void close();
+ QString error() const;
+ sqlite3* sqliteDb();
+
+private:
+ sqlite3 *_db;
+ QString _error; // last error string
+ int _errId;
+
+};
+
+class SqlQuery
+{
+public:
+ explicit SqlQuery();
+ explicit SqlQuery(SqlDatabase db);
+ explicit SqlQuery(const QString& sql, SqlDatabase db);
+
+ ~SqlQuery();
+ QString error() const;
+
+ QString stringValue(int index);
+ int intValue(int index);
+ quint64 int64Value(int index);
+ QByteArray baValue(int index);
+
+ bool exec();
+ void prepare( const QString& sql );
+ bool next();
+ void bindValue(int pos, const QVariant& value);
+ QString lastQuery() const;
+ int numRowsAffected();
+ void finish();
+
+private:
+ sqlite3 *_db;
+ sqlite3_stmt *_stmt;
+ QString _error;
+ int _errId;
+};
+
+#endif // OWNSQL_H
diff --git a/src/mirall/syncjournaldb.cpp b/src/mirall/syncjournaldb.cpp
index 71dd849..d774514 100644
--- a/src/mirall/syncjournaldb.cpp
+++ b/src/mirall/syncjournaldb.cpp
@@ -14,8 +14,7 @@
#include <QFile>
#include <QStringList>
#include <QDebug>
-#include <QSqlError>
-#include <QSqlQuery>
+#include "mirall/ownsql.h"
#include <inttypes.h>
@@ -58,7 +57,7 @@ void SyncJournalDb::startTransaction()
{
if( _transaction == 0 ) {
if( !_db.transaction() ) {
- qDebug() << "ERROR starting transaction: " << _db.lastError().text();
+ qDebug() << "ERROR starting transaction: " << _db.error();
return;
}
_transaction = 1;
@@ -72,7 +71,7 @@ void SyncJournalDb::commitTransaction()
{
if( _transaction == 1 ) {
if( ! _db.commit() ) {
- qDebug() << "ERROR committing to the database: " << _db.lastError().text();
+ qDebug() << "ERROR committing to the database: " << _db.error();
return;
}
_transaction = 0;
@@ -82,10 +81,10 @@ void SyncJournalDb::commitTransaction()
}
}
-bool SyncJournalDb::sqlFail( const QString& log, const QSqlQuery& query )
+bool SyncJournalDb::sqlFail( const QString& log, const SqlQuery& query )
{
commitTransaction();
- qWarning() << "SQL Error" << log << query.lastError().text();
+ qWarning() << "SQL Error" << log << query.error();
Q_ASSERT(!"SQL ERROR");
_db.close();
return false;
@@ -102,38 +101,19 @@ bool SyncJournalDb::checkConnect()
return false;
}
- QStringList list = QSqlDatabase::drivers();
- if( list.size() == 0 ) {
- qDebug() << "Database Drivers could not be loaded.";
- return false ;
- } else {
- if( list.indexOf( QSQLITE ) == -1 ) {
- qDebug() << "Database Driver QSQLITE could not be loaded!";
- return false;
- }
- }
-
- // Add the connection
- _db = QSqlDatabase::addDatabase( QSQLITE, _dbFile);
-
- // Open the file
- _db.setDatabaseName(_dbFile);
-
- if (!_db.isOpen()) {
- if( !_db.open() ) {
- QSqlError error = _db.lastError();
- qDebug() << "Error opening the db: " << error.text();
- return false;
- }
+ if( !_db.open(_dbFile) ) {
+ QString error = _db.error();
+ qDebug() << "Error opening the db: " << error;
+ return false;
}
- QSqlQuery pragma1(_db);
+ SqlQuery pragma1(_db);
pragma1.prepare("SELECT sqlite_version();");
if (!pragma1.exec()) {
return sqlFail("SELECT sqlite_version()", pragma1);
} else {
pragma1.next();
- qDebug() << "sqlite3 version" << pragma1.value(0).toString();
+ qDebug() << "sqlite3 version" << pragma1.stringValue(0);
}
pragma1.prepare("PRAGMA synchronous = 1;");
@@ -148,7 +128,7 @@ bool SyncJournalDb::checkConnect()
/* Because insert are so slow, e do everything in a transaction, and one need to call commit */
startTransaction();
- QSqlQuery createQuery(_db);
+ SqlQuery createQuery(_db);
createQuery.prepare("CREATE TABLE IF NOT EXISTS metadata("
"phash INTEGER(8),"
"pathlen INTEGER,"
@@ -219,7 +199,7 @@ bool SyncJournalDb::checkConnect()
return sqlFail("Create table version", createQuery);
}
- QSqlQuery versionQuery("SELECT major, minor FROM version;", _db);
+ SqlQuery versionQuery("SELECT major, minor FROM version;", _db);
if (!versionQuery.next()) {
// If there was no entry in the table, it means we are likely upgrading from 1.5
_possibleUpgradeFromMirall_1_5 = true;
@@ -245,44 +225,44 @@ bool SyncJournalDb::checkConnect()
qDebug() << "WARN: Failed to update the database structure!";
}
- _getFileRecordQuery.reset(new QSqlQuery(_db));
+ _getFileRecordQuery.reset(new SqlQuery(_db));
_getFileRecordQuery->prepare("SELECT path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm FROM "
"metadata WHERE phash=:ph" );
- _setFileRecordQuery.reset(new QSqlQuery(_db) );
+ _setFileRecordQuery.reset(new SqlQuery(_db) );
_setFileRecordQuery->prepare("INSERT OR REPLACE INTO metadata "
"(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm) "
"VALUES ( ? , ?, ? , ? , ? , ? , ?, ? , ? , ?, ?, ? )" );
- _getDownloadInfoQuery.reset(new QSqlQuery(_db) );
+ _getDownloadInfoQuery.reset(new SqlQuery(_db) );
_getDownloadInfoQuery->prepare( "SELECT tmpfile, etag, errorcount FROM "
"downloadinfo WHERE path=:pa" );
- _setDownloadInfoQuery.reset(new QSqlQuery(_db) );
+ _setDownloadInfoQuery.reset(new SqlQuery(_db) );
_setDownloadInfoQuery->prepare( "INSERT OR REPLACE INTO downloadinfo "
"(path, tmpfile, etag, errorcount) "
"VALUES ( ? , ?, ? , ? )" );
- _deleteDownloadInfoQuery.reset(new QSqlQuery(_db) );
+ _deleteDownloadInfoQuery.reset(new SqlQuery(_db) );
_deleteDownloadInfoQuery->prepare( "DELETE FROM downloadinfo WHERE path=?" );
- _getUploadInfoQuery.reset(new QSqlQuery(_db));
+ _getUploadInfoQuery.reset(new SqlQuery(_db));
_getUploadInfoQuery->prepare( "SELECT chunk, transferid, errorcount, size, modtime FROM "
"uploadinfo WHERE path=:pa" );
- _setUploadInfoQuery.reset(new QSqlQuery(_db));
+ _setUploadInfoQuery.reset(new SqlQuery(_db));
_setUploadInfoQuery->prepare( "INSERT OR REPLACE INTO uploadinfo "
"(path, chunk, transferid, errorcount, size, modtime) "
"VALUES ( ? , ?, ? , ? , ? , ? )");
- _deleteUploadInfoQuery.reset(new QSqlQuery(_db));
+ _deleteUploadInfoQuery.reset(new SqlQuery(_db));
_deleteUploadInfoQuery->prepare("DELETE FROM uploadinfo WHERE path=?" );
- _deleteFileRecordPhash.reset(new QSqlQuery(_db));
+ _deleteFileRecordPhash.reset(new SqlQuery(_db));
_deleteFileRecordPhash->prepare("DELETE FROM metadata WHERE phash=?");
- _deleteFileRecordRecursively.reset(new QSqlQuery(_db));
+ _deleteFileRecordRecursively.reset(new SqlQuery(_db));
_deleteFileRecordRecursively->prepare("DELETE FROM metadata WHERE path LIKE(?||'/%')");
QString sql( "SELECT lastTryEtag, lastTryModtime, retrycount, errorstring "
@@ -292,7 +272,7 @@ bool SyncJournalDb::checkConnect()
// case insensitively
sql += QLatin1String(" COLLATE NOCASE");
}
- _blacklistQuery.reset(new QSqlQuery(_db));
+ _blacklistQuery.reset(new SqlQuery(_db));
_blacklistQuery->prepare(sql);
return rc;
@@ -318,8 +298,7 @@ void SyncJournalDb::close()
_possibleUpgradeFromMirall_1_5 = false;
_db.close();
- _db = QSqlDatabase(); // avoid the warning QSqlDatabasePrivate::removeDatabase: connection [...] still in use
- QSqlDatabase::removeDatabase(_dbFile);
+ _db = SqlDatabase(); // avoid the warning SqlDatabasePrivate::removeDatabase: connection [...] still in use
_avoidReadFromDbOnNextSyncFilter.clear();
}
@@ -335,7 +314,7 @@ bool SyncJournalDb::updateDatabaseStructure()
}
if( columns.indexOf(QLatin1String("fileid")) == -1 ) {
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare("ALTER TABLE metadata ADD COLUMN fileid VARCHAR(128);");
if( !query.exec() ) {
sqlFail("updateDatabaseStructure: Add column fileid", query);
@@ -351,7 +330,7 @@ bool SyncJournalDb::updateDatabaseStructure()
}
if( columns.indexOf(QLatin1String("remotePerm")) == -1 ) {
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare("ALTER TABLE metadata ADD COLUMN remotePerm VARCHAR(128);");
if( !query.exec()) {
sqlFail("updateDatabaseStructure: add column remotePerm", query);
@@ -361,7 +340,7 @@ bool SyncJournalDb::updateDatabaseStructure()
}
if( 1 ) {
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare("CREATE INDEX IF NOT EXISTS metadata_inode ON metadata(inode);");
if( !query.exec()) {
sqlFail("updateDatabaseStructure: create index inode", query);
@@ -372,7 +351,7 @@ bool SyncJournalDb::updateDatabaseStructure()
}
if( 1 ) {
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare("CREATE INDEX IF NOT EXISTS metadata_pathlen ON metadata(pathlen);");
if( !query.exec()) {
sqlFail("updateDatabaseStructure: create index pathlen", query);
@@ -391,17 +370,17 @@ QStringList SyncJournalDb::tableColumns( const QString& table )
if( checkConnect() ) {
QString q = QString("PRAGMA table_info(%1);").arg(table);
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare(q);
if(!query.exec()) {
- QString err = query.lastError().text();
+ QString err = query.error();
qDebug() << "Error creating prepared statement: " << query.lastQuery() << ", Error:" << err;;
return columns;
}
while( query.next() ) {
- columns.append( query.value(1).toString() );
+ columns.append( query.stringValue(1) );
}
}
}
@@ -469,7 +448,7 @@ bool SyncJournalDb::setFileRecord( const SyncJournalFileRecord& _record )
if( !_setFileRecordQuery->exec() ) {
qWarning() << "Error SQL statement setFileRecord: " << _setFileRecordQuery->lastQuery() << " :"
- << _setFileRecordQuery->lastError().text();
+ << _setFileRecordQuery->error();
return false;
}
@@ -500,20 +479,20 @@ bool SyncJournalDb::deleteFileRecord(const QString& filename, bool recursively)
if( !_deleteFileRecordPhash->exec() ) {
qWarning() << "Exec error of SQL statement: "
<< _deleteFileRecordPhash->lastQuery()
- << " : " << _deleteFileRecordPhash->lastError().text();
+ << " : " << _deleteFileRecordPhash->error();
return false;
}
- qDebug() << _deleteFileRecordPhash->executedQuery() << phash << filename;
+ qDebug() << _deleteFileRecordPhash->lastQuery() << phash << filename;
_deleteFileRecordPhash->finish();
if( recursively) {
_deleteFileRecordRecursively->bindValue(0, filename);
if( !_deleteFileRecordRecursively->exec() ) {
qWarning() << "Exec error of SQL statement: "
<< _deleteFileRecordRecursively->lastQuery()
- << " : " << _deleteFileRecordRecursively->lastError().text();
+ << " : " << _deleteFileRecordRecursively->error();
return false;
}
- qDebug() << _deleteFileRecordRecursively->executedQuery() << filename;
+ qDebug() << _deleteFileRecordRecursively->lastQuery() << filename;
_deleteFileRecordRecursively->finish();
}
return true;
@@ -532,30 +511,29 @@ SyncJournalFileRecord SyncJournalDb::getFileRecord( const QString& filename )
SyncJournalFileRecord rec;
if( checkConnect() ) {
- _getFileRecordQuery->bindValue(":ph", QString::number(phash));
+ _getFileRecordQuery->bindValue(1, QString::number(phash));
if (!_getFileRecordQuery->exec()) {
- QString err = _getFileRecordQuery->lastError().text();
+ QString err = _getFileRecordQuery->error();
qDebug() << "Error creating prepared statement: " << _getFileRecordQuery->lastQuery() << ", Error:" << err;;
return rec;
}
if( _getFileRecordQuery->next() ) {
- bool ok;
- rec._path = _getFileRecordQuery->value(0).toString();
- rec._inode = _getFileRecordQuery->value(1).toInt(&ok);
+ rec._path = _getFileRecordQuery->stringValue(0);
+ rec._inode = _getFileRecordQuery->intValue(1);
//rec._uid = _getFileRecordQuery->value(2).toInt(&ok); Not Used
//rec._gid = _getFileRecordQuery->value(3).toInt(&ok); Not Used
- rec._mode = _getFileRecordQuery->value(4).toInt(&ok);
- rec._modtime = Utility::qDateTimeFromTime_t(_getFileRecordQuery->value(5).toLongLong(&ok));
- rec._type = _getFileRecordQuery->value(6).toInt(&ok);
- rec._etag = _getFileRecordQuery->value(7).toByteArray();
- rec._fileId = _getFileRecordQuery->value(8).toByteArray();
- rec._remotePerm = _getFileRecordQuery->value(9).toByteArray();
+ rec._mode = _getFileRecordQuery->intValue(4);
+ rec._modtime = Utility::qDateTimeFromTime_t(_getFileRecordQuery->int64Value(5));
+ rec._type = _getFileRecordQuery->intValue(6);
+ rec._etag = _getFileRecordQuery->baValue(7);
+ rec._fileId = _getFileRecordQuery->baValue(8);
+ rec._remotePerm = _getFileRecordQuery->baValue(9);
_getFileRecordQuery->finish();
} else {
- QString err = _getFileRecordQuery->lastError().text();
+ QString err = _getFileRecordQuery->error();
qDebug() << "No journal entry found for " << filename;
}
}
@@ -570,11 +548,11 @@ bool SyncJournalDb::postSyncCleanup(const QSet<QString> &items )
return false;
}
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare("SELECT phash, path FROM metadata order by path");
if (!query.exec()) {
- QString err = query.lastError().text();
+ QString err = query.error();
qDebug() << "Error creating prepared statement: " << query.lastQuery() << ", Error:" << err;;
return false;
}
@@ -582,20 +560,20 @@ bool SyncJournalDb::postSyncCleanup(const QSet<QString> &items )
QStringList superfluousItems;
while(query.next()) {
- const QString file = query.value(1).toString();
+ const QString file = query.stringValue(1);
bool contained = items.contains(file);
if( !contained ) {
- superfluousItems.append(query.value(0).toString());
+ superfluousItems.append(query.stringValue(0));
}
}
if( superfluousItems.count() ) {
QString sql = "DELETE FROM metadata WHERE phash in ("+ superfluousItems.join(",")+")";
qDebug() << "Sync Journal cleanup: " << sql;
- QSqlQuery delQuery(_db);
+ SqlQuery delQuery(_db);
delQuery.prepare(sql);
if( !delQuery.exec() ) {
- QString err = delQuery.lastError().text();
+ QString err = delQuery.error();
qDebug() << "Error removing superfluous journal entries: " << delQuery.lastQuery() << ", Error:" << err;;
return false;
}
@@ -611,44 +589,47 @@ int SyncJournalDb::getFileRecordCount()
return -1;
}
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare("SELECT COUNT(*) FROM metadata");
if (!query.exec()) {
- QString err = query.lastError().text();
+ QString err = query.error();
qDebug() << "Error creating prepared statement: " << query.lastQuery() << ", Error:" << err;;
return 0;
}
if (query.next()) {
- int count = query.value(0).toInt();
+ int count = query.intValue(0);
return count;
}
return 0;
}
-static void toDownloadInfo(const QSqlQuery & query, SyncJournalDb::DownloadInfo * res)
+static void toDownloadInfo(SqlQuery query, SyncJournalDb::DownloadInfo * res)
{
bool ok = true;
- res->_tmpfile = query.value(0).toString();
- res->_etag = query.value(1).toByteArray();
- res->_errorCount = query.value(2).toInt(&ok);
+ res->_tmpfile = query.stringValue(0);
+ res->_etag = query.baValue(1);
+ res->_errorCount = query.intValue(2);
res->_valid = ok;
}
-static bool deleteBatch(QSqlQuery & query, const QStringList & entries, const QString & name)
+static bool deleteBatch(SqlQuery & query, const QStringList & entries, const QString & name)
{
if (entries.isEmpty())
return true;
qDebug() << "Removing stale " << qPrintable(name) << " entries: " << entries.join(", ");
- query.bindValue(0, entries);
- if (!query.execBatch()) {
- QString err = query.lastError().text();
- qDebug() << "Error removing stale " << qPrintable(name) << " entries: "
- << query.lastQuery() << ", Error:" << err;
- return false;
+ // FIXME: Was ported from execBatch, check if correct!
+ foreach( const QString& entry, entries ) {
+ query.bindValue(0, entry);
+ if (!query.exec()) {
+ QString err = query.error();
+ qDebug() << "Error removing stale " << qPrintable(name) << " entries: "
+ << query.lastQuery() << ", Error:" << err;
+ return false;
+ }
}
query.finish();
return true;
@@ -661,10 +642,10 @@ SyncJournalDb::DownloadInfo SyncJournalDb::getDownloadInfo(const QString& file)
DownloadInfo res;
if( checkConnect() ) {
- _getDownloadInfoQuery->bindValue(":pa", file);
+ _getDownloadInfoQuery->bindValue(1, file);
if (!_getDownloadInfoQuery->exec()) {
- QString err = _getDownloadInfoQuery->lastError().text();
+ QString err = _getDownloadInfoQuery->error();
qDebug() << "Database error for file " << file << " : " << _getDownloadInfoQuery->lastQuery() << ", Error:" << err;;
return res;
}
@@ -692,7 +673,7 @@ void SyncJournalDb::setDownloadInfo(const QString& file, const SyncJournalDb::Do
_setDownloadInfoQuery->bindValue(3, i._errorCount );
if( !_setDownloadInfoQuery->exec() ) {
- qWarning() << "Exec error of SQL statement: " << _setDownloadInfoQuery->lastQuery() << " :" << _setDownloadInfoQuery->lastError().text();
+ qWarning() << "Exec error of SQL statement: " << _setDownloadInfoQuery->lastQuery() << " :" << _setDownloadInfoQuery->error();
return;
}
@@ -703,10 +684,10 @@ void SyncJournalDb::setDownloadInfo(const QString& file, const SyncJournalDb::Do
_deleteDownloadInfoQuery->bindValue( 0, file );
if( !_deleteDownloadInfoQuery->exec() ) {
- qWarning() << "Exec error of SQL statement: " << _deleteDownloadInfoQuery->lastQuery() << " : " << _deleteDownloadInfoQuery->lastError().text();
+ qWarning() << "Exec error of SQL statement: " << _deleteDownloadInfoQuery->lastQuery() << " : " << _deleteDownloadInfoQuery->error();
return;
}
- qDebug() << _deleteDownloadInfoQuery->executedQuery() << file;
+ qDebug() << _deleteDownloadInfoQuery->lastQuery() << file;
_deleteDownloadInfoQuery->finish();
}
}
@@ -720,12 +701,12 @@ QVector<SyncJournalDb::DownloadInfo> SyncJournalDb::getAndDeleteStaleDownloadInf
return empty_result;
}
- QSqlQuery query(_db);
+ SqlQuery query(_db);
// The selected values *must* match the ones expected by toDownloadInfo().
query.prepare("SELECT tmpfile, etag, errorcount, path FROM downloadinfo");
if (!query.exec()) {
- QString err = query.lastError().text();
+ QString err = query.error();
qDebug() << "Error creating prepared statement: " << query.lastQuery() << ", Error:" << err;
return empty_result;
}
@@ -734,7 +715,7 @@ QVector<SyncJournalDb::DownloadInfo> SyncJournalDb::getAndDeleteStaleDownloadInf
QVector<SyncJournalDb::DownloadInfo> deleted_entries;
while (query.next()) {
- const QString file = query.value(3).toString(); // path
+ const QString file = query.stringValue(3); // path
if (!keep.contains(file)) {
superfluousPaths.append(file);
DownloadInfo info;
@@ -757,21 +738,21 @@ SyncJournalDb::UploadInfo SyncJournalDb::getUploadInfo(const QString& file)
if( checkConnect() ) {
- _getUploadInfoQuery->bindValue(":pa", file);
+ _getUploadInfoQuery->bindValue(1, file);
if (!_getUploadInfoQuery->exec()) {
- QString err = _getUploadInfoQuery->lastError().text();
+ QString err = _getUploadInfoQuery->error();
qDebug() << "Database error for file " << file << " : " << _getUploadInfoQuery->lastQuery() << ", Error:" << err;
return res;
}
if( _getUploadInfoQuery->next() ) {
bool ok = true;
- res._chunk = _getUploadInfoQuery->value(0).toInt(&ok);
- res._transferid = _getUploadInfoQuery->value(1).toInt(&ok);
- res._errorCount = _getUploadInfoQuery->value(2).toInt(&ok);
- res._size = _getUploadInfoQuery->value(3).toLongLong(&ok);
- res._modtime = Utility::qDateTimeFromTime_t(_getUploadInfoQuery->value(4).toLongLong(&ok));
+ res._chunk = _getUploadInfoQuery->intValue(0);
+ res._transferid = _getUploadInfoQuery->intValue(1);
+ res._errorCount = _getUploadInfoQuery->intValue(2);
+ res._size = _getUploadInfoQuery->int64Value(3);
+ res._modtime = Utility::qDateTimeFromTime_t(_getUploadInfoQuery->int64Value(4));
res._valid = ok;
}
_getUploadInfoQuery->finish();
@@ -796,7 +777,7 @@ void SyncJournalDb::setUploadInfo(const QString& file, const SyncJournalDb::Uplo
_setUploadInfoQuery->bindValue(5, Utility::qDateTimeToTime_t(i._modtime) );
if( !_setUploadInfoQuery->exec() ) {
- qWarning() << "Exec error of SQL statement: " << _setUploadInfoQuery->lastQuery() << " :" << _setUploadInfoQuery->lastError().text();
+ qWarning() << "Exec error of SQL statement: " << _setUploadInfoQuery->lastQuery() << " :" << _setUploadInfoQuery->error();
return;
}
@@ -806,10 +787,10 @@ void SyncJournalDb::setUploadInfo(const QString& file, const SyncJournalDb::Uplo
_deleteUploadInfoQuery->bindValue(0, file);
if( !_deleteUploadInfoQuery->exec() ) {
- qWarning() << "Exec error of SQL statement: " << _deleteUploadInfoQuery->lastQuery() << " : " << _deleteUploadInfoQuery->lastError().text();
+ qWarning() << "Exec error of SQL statement: " << _deleteUploadInfoQuery->lastQuery() << " : " << _deleteUploadInfoQuery->error();
return;
}
- qDebug() << _deleteUploadInfoQuery->executedQuery() << file;
+ qDebug() << _deleteUploadInfoQuery->lastQuery() << file;
_deleteUploadInfoQuery->finish();
}
}
@@ -822,11 +803,11 @@ bool SyncJournalDb::deleteStaleUploadInfos(const QSet<QString> &keep)
return false;
}
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare("SELECT path FROM uploadinfo");
if (!query.exec()) {
- QString err = query.lastError().text();
+ QString err = query.error();
qDebug() << "Error creating prepared statement: " << query.lastQuery() << ", Error:" << err;
return false;
}
@@ -834,7 +815,7 @@ bool SyncJournalDb::deleteStaleUploadInfos(const QSet<QString> &keep)
QStringList superfluousPaths;
while (query.next()) {
- const QString file = query.value(0).toString();
+ const QString file = query.stringValue(0);
if (!keep.contains(file)) {
superfluousPaths.append(file);
}
@@ -853,19 +834,18 @@ SyncJournalBlacklistRecord SyncJournalDb::blacklistEntry( const QString& file )
// SELECT lastTryEtag, lastTryModtime, retrycount, errorstring
if( checkConnect() ) {
- _blacklistQuery->bindValue( ":path", file );
+ _blacklistQuery->bindValue( 1, file );
if( _blacklistQuery->exec() ){
if( _blacklistQuery->next() ) {
- bool ok;
- entry._lastTryEtag = _blacklistQuery->value(0).toByteArray();
- entry._lastTryModtime = _blacklistQuery->value(1).toLongLong(&ok);
- entry._retryCount = _blacklistQuery->value(2).toInt();
- entry._errorString = _blacklistQuery->value(3).toString();
+ entry._lastTryEtag = _blacklistQuery->baValue(0);
+ entry._lastTryModtime = _blacklistQuery->int64Value(1);
+ entry._retryCount = _blacklistQuery->intValue(2);
+ entry._errorString = _blacklistQuery->stringValue(3);
entry._file = file;
}
} else {
qWarning() << "Exec error blacklist: " << _blacklistQuery->lastQuery() << " : "
- << _blacklistQuery->lastError().text();
+ << _blacklistQuery->error();
}
_blacklistQuery->finish();
}
@@ -881,11 +861,11 @@ bool SyncJournalDb::deleteStaleBlacklistEntries(const QSet<QString> &keep)
return false;
}
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare("SELECT path FROM blacklist");
if (!query.exec()) {
- QString err = query.lastError().text();
+ QString err = query.error();
qDebug() << "Error creating prepared statement: " << query.lastQuery() << ", Error:" << err;
return false;
}
@@ -893,13 +873,13 @@ bool SyncJournalDb::deleteStaleBlacklistEntries(const QSet<QString> &keep)
QStringList superfluousPaths;
while (query.next()) {
- const QString file = query.value(0).toString();
+ const QString file = query.stringValue(0);
if (!keep.contains(file)) {
superfluousPaths.append(file);
}
}
- QSqlQuery delQuery(_db);
+ SqlQuery delQuery(_db);
delQuery.prepare("DELETE FROM blacklist WHERE path = ?");
return deleteBatch(delQuery, superfluousPaths, "blacklist");
}
@@ -910,12 +890,13 @@ int SyncJournalDb::blackListEntryCount()
QMutexLocker locker(&_mutex);
if( checkConnect() ) {
- QSqlQuery query(_db);
- if( ! query.exec("SELECT count(*) FROM blacklist") ) {
+ SqlQuery query("SELECT count(*) FROM blacklist", _db);
+
+ if( ! query.exec() ) {
sqlFail("Count number of blacklist entries failed", query);
}
if( query.next() ) {
- re = query.value(0).toInt();
+ re = query.intValue(0);
}
}
return re;
@@ -925,7 +906,7 @@ int SyncJournalDb::wipeBlacklist()
{
QMutexLocker locker(&_mutex);
if( checkConnect() ) {
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare("DELETE FROM blacklist");
@@ -946,10 +927,10 @@ void SyncJournalDb::wipeBlacklistEntry( const QString& file )
QMutexLocker locker(&_mutex);
if( checkConnect() ) {
- QSqlQuery query(_db);
+ SqlQuery query(_db);
- query.prepare("DELETE FROM blacklist WHERE path=:path");
- query.bindValue(":path", file);
+ query.prepare("DELETE FROM blacklist WHERE path=?1");
+ query.bindValue(1, file);
if( ! query.exec() ) {
sqlFail("Deletion of blacklist item failed.", query);
}
@@ -974,32 +955,32 @@ void SyncJournalDb::updateBlacklistEntry( const SyncJournalBlacklistRecord& item
retries = rec._retryCount;
}
- QSqlQuery iQuery(_db);
+ SqlQuery iQuery(_db);
if( haveRecord ) {
retries--;
if( retries < 0 ) retries = 0;
- iQuery.prepare( "UPDATE blacklist SET lastTryEtag = :etag, lastTryModtime = :modtime, "
- "retrycount = :retries, errorstring = :errStr WHERE path=:path");
- iQuery.bindValue(":etag", item._lastTryEtag);
- iQuery.bindValue(":modtime", QString::number(item._lastTryModtime));
- iQuery.bindValue(":retries", retries);
- iQuery.bindValue(":errStr", item._errorString);
- iQuery.bindValue(":path", item._file);
+ iQuery.prepare( "UPDATE blacklist SET lastTryEtag = ?1, lastTryModtime = ?2, "
+ "retrycount = ?3, errorstring = ?4 WHERE path=?5");
+ iQuery.bindValue(1, item._lastTryEtag);
+ iQuery.bindValue(2, QString::number(item._lastTryModtime));
+ iQuery.bindValue(3, retries);
+ iQuery.bindValue(4, item._errorString);
+ iQuery.bindValue(5, item._file);
} else {
// there is no entry yet.
iQuery.prepare("INSERT INTO blacklist (path, lastTryEtag, lastTryModtime, retrycount, errorstring) "
- "VALUES (:path, :lastEtag, :lastMTime, :retrycount, :errorstring);");
+ "VALUES (?1, ?2, ?3, ?4, ?5;");
- iQuery.bindValue(":path", item._file );
- iQuery.bindValue(":lastEtag", item._lastTryEtag);
- iQuery.bindValue(":lastMTime", QString::number(item._lastTryModtime));
- iQuery.bindValue(":retrycount", item._retryCount);
- iQuery.bindValue(":errorstring", item._errorString);
+ iQuery.bindValue(1, item._file );
+ iQuery.bindValue(2, item._lastTryEtag);
+ iQuery.bindValue(3, QString::number(item._lastTryModtime));
+ iQuery.bindValue(4, item._retryCount);
+ iQuery.bindValue(5, item._errorString);
}
if( !iQuery.exec() ) {
- QString bug = iQuery.lastError().text();
+ QString bug = iQuery.error();
qDebug() << "SQL exec blacklistitem insert/update failed: "<< bug;
}
@@ -1013,14 +994,14 @@ void SyncJournalDb::avoidRenamesOnNextSync(const QString& path)
return;
}
- QSqlQuery query(_db);
+ SqlQuery query(_db);
query.prepare("UPDATE metadata SET fileid = '', inode = '0' WHERE path == ? OR path LIKE(?||'/%')");
query.bindValue(0, path);
query.bindValue(1, path);
if( !query.exec() ) {
- qDebug() << Q_FUNC_INFO << "SQL error in avoidRenamesOnNextSync: "<< query.lastError().text();
+ qDebug() << Q_FUNC_INFO << "SQL error in avoidRenamesOnNextSync: "<< query.error();
} else {
- qDebug() << Q_FUNC_INFO << query.executedQuery() << path << "(" << query.numRowsAffected() << " rows)";
+ qDebug() << Q_FUNC_INFO << query.lastQuery() << path << "(" << query.numRowsAffected() << " rows)";
}
// We also need to remove the ETags so the update phase refreshes the directory paths
@@ -1041,14 +1022,14 @@ void SyncJournalDb::avoidReadFromDbOnNextSync(const QString& fileName)
return;
}
- QSqlQuery query(_db);
+ SqlQuery query(_db);
// This query will match entries for whitch the path is a prefix of fileName
query.prepare("UPDATE metadata SET md5='_invalid_' WHERE ? LIKE(path||'/%') AND type == 2"); // CSYNC_FTW_TYPE_DIR == 2
query.bindValue(0, fileName);
if( !query.exec() ) {
- qDebug() << Q_FUNC_INFO << "SQL error in avoidRenamesOnNextSync: "<< query.lastError().text();
+ qDebug() << Q_FUNC_INFO << "SQL error in avoidRenamesOnNextSync: "<< query.error();
} else {
- qDebug() << Q_FUNC_INFO << query.executedQuery() << fileName << "(" << query.numRowsAffected() << " rows)";
+ qDebug() << Q_FUNC_INFO << query.lastQuery() << fileName << "(" << query.numRowsAffected() << " rows)";
}
// Prevent future overwrite of the etag for this sync
diff --git a/src/mirall/syncjournaldb.h b/src/mirall/syncjournaldb.h
index ad67f12..06160f3 100644
--- a/src/mirall/syncjournaldb.h
+++ b/src/mirall/syncjournaldb.h
@@ -17,11 +17,10 @@
#include <QObject>
#include <qmutex.h>
#include <QDateTime>
-#include <QSqlDatabase>
#include <QHash>
-#include <QSqlQuery>
#include "utility.h"
+#include "ownsql.h"
namespace Mirall {
class SyncJournalFileRecord;
@@ -110,29 +109,29 @@ public:
private:
bool updateDatabaseStructure();
- bool sqlFail(const QString& log, const QSqlQuery &query );
+ bool sqlFail(const QString& log, const SqlQuery &query );
void commitInternal(const QString &context, bool startTrans = true);
void startTransaction();
void commitTransaction();
QStringList tableColumns( const QString& table );
bool checkConnect();
- QSqlDatabase _db;
+ SqlDatabase _db;
QString _dbFile;
QMutex _mutex; // Public functions are protected with the mutex.
int _transaction;
bool _possibleUpgradeFromMirall_1_5;
- QScopedPointer<QSqlQuery> _getFileRecordQuery;
- QScopedPointer<QSqlQuery> _setFileRecordQuery;
- QScopedPointer<QSqlQuery> _getDownloadInfoQuery;
- QScopedPointer<QSqlQuery> _setDownloadInfoQuery;
- QScopedPointer<QSqlQuery> _deleteDownloadInfoQuery;
- QScopedPointer<QSqlQuery> _getUploadInfoQuery;
- QScopedPointer<QSqlQuery> _setUploadInfoQuery;
- QScopedPointer<QSqlQuery> _deleteUploadInfoQuery;
- QScopedPointer<QSqlQuery> _deleteFileRecordPhash;
- QScopedPointer<QSqlQuery> _deleteFileRecordRecursively;
- QScopedPointer<QSqlQuery> _blacklistQuery;
+ QScopedPointer<SqlQuery> _getFileRecordQuery;
+ QScopedPointer<SqlQuery> _setFileRecordQuery;
+ QScopedPointer<SqlQuery> _getDownloadInfoQuery;
+ QScopedPointer<SqlQuery> _setDownloadInfoQuery;
+ QScopedPointer<SqlQuery> _deleteDownloadInfoQuery;
+ QScopedPointer<SqlQuery> _getUploadInfoQuery;
+ QScopedPointer<SqlQuery> _setUploadInfoQuery;
+ QScopedPointer<SqlQuery> _deleteUploadInfoQuery;
+ QScopedPointer<SqlQuery> _deleteFileRecordPhash;
+ QScopedPointer<SqlQuery> _deleteFileRecordRecursively;
+ QScopedPointer<SqlQuery> _blacklistQuery;
/* This is the list of paths we called avoidReadFromDbOnNextSync on.
* It means that they should not be written to the DB in any case since doing
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git
More information about the Pkg-owncloud-commits
mailing list