[Pkg-owncloud-commits] [owncloud-client] 69/211: SocketAPI: Cache database conections and statements
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 26ffa078ef52803e831b8464f7cfe43102ae1c6a
Author: Klaas Freitag <freitag at owncloud.com>
Date: Mon Oct 13 17:31:40 2014 +0200
SocketAPI: Cache database conections and statements
---
src/mirall/socketapi.cpp | 57 +++++++++++++++++++++++++++++++++---------------
src/mirall/socketapi.h | 11 +++++++++-
2 files changed, 50 insertions(+), 18 deletions(-)
diff --git a/src/mirall/socketapi.cpp b/src/mirall/socketapi.cpp
index 5b32c71..3a9fbd8 100644
--- a/src/mirall/socketapi.cpp
+++ b/src/mirall/socketapi.cpp
@@ -224,6 +224,11 @@ void SocketApi::slotUnregisterPath( const QString& alias )
Folder *f = FolderMan::instance()->folder(alias);
if (f) {
broadcastMessage(QLatin1String("UNREGISTER_PATH"), f->path(), QString::null, true );
+
+ if( _dbConnections.contains(f)) {
+ sqlite3_close_v2(_dbConnections[f]._db);
+ }
+ _dbConnections.remove(f);
}
}
@@ -407,39 +412,58 @@ SyncFileStatus SocketApi::recursiveFolderStatus(Folder *folder, const QString& f
return result;
}
-SyncJournalFileRecord SocketApi::dbFileRecord_capi( Folder *folder, QString fileName )
+SqliteHandle SocketApi::getSqliteHandle( Folder *folder )
{
- if( !(folder && folder->journalDb()) ) {
- return SyncJournalFileRecord();
+ if( _dbConnections.contains(folder) ) {
+ return _dbConnections[folder];
}
+ SqliteHandle h;
+ h._db = NULL;
+ h._stmt = NULL;
- if( fileName.startsWith( folder->path() )) {
- fileName.remove(0, folder->path().length());
+ if( !folder ) {
+ return h;
}
-
- QString dbFileName = folder->journalDb()->databaseFilePath();
-
- sqlite3 *db = NULL;
- sqlite3_stmt *stmt = NULL;
- SyncJournalFileRecord rec;
int rc;
const char* query = "SELECT inode, mode, modtime, type, md5, fileid, remotePerm FROM "
"metadata WHERE phash=:ph";
+ QString dbFileName = folder->journalDb()->databaseFilePath();
- if( sqlite3_open_v2(dbFileName.toUtf8().constData(), &db,
+ if( sqlite3_open_v2(dbFileName.toUtf8().constData(), &(h._db),
SQLITE_OPEN_READONLY+SQLITE_OPEN_NOMUTEX, NULL) == SQLITE_OK ) {
- rc = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+ rc = sqlite3_prepare_v2(h._db, query, strlen(query), &(h._stmt), NULL);
if( rc != SQLITE_OK ) {
qDebug() << "Unable to prepare the query statement.";
- return rec;
+ return h; // do not insert into hash
}
+ _dbConnections.insert( folder, h);
+ }
+ return h;
+}
+
+SyncJournalFileRecord SocketApi::dbFileRecord_capi( Folder *folder, QString fileName )
+{
+ if( !(folder && folder->journalDb()) ) {
+ return SyncJournalFileRecord();
+ }
+
+ if( fileName.startsWith( folder->path() )) {
+ fileName.remove(0, folder->path().length());
+ }
+
+ SqliteHandle h = getSqliteHandle(folder);
+
+ sqlite3_stmt *stmt = h._stmt;
+ SyncJournalFileRecord rec;
+
+ if( h._db && h._stmt ) {
qlonglong phash = SyncJournalDb::getPHash( fileName );
sqlite3_bind_int64(stmt, 1, (long long signed int)phash);
// int column_count = sqlite3_column_count(stmt);
- rc = sqlite3_step(stmt);
+ int rc = sqlite3_step(stmt);
if (rc == SQLITE_ROW ) {
rec._path = fileName;
@@ -451,8 +475,7 @@ SyncJournalFileRecord SocketApi::dbFileRecord_capi( Folder *folder, QString file
rec._fileId = QByteArray((char*)sqlite3_column_text(stmt, 5));
rec._remotePerm = QByteArray((char*)sqlite3_column_text(stmt, 6));
}
- sqlite3_finalize(stmt);
- sqlite3_close(db);
+ sqlite3_reset(stmt);
}
return rec;
}
diff --git a/src/mirall/socketapi.h b/src/mirall/socketapi.h
index 1c36cc4..2913997 100644
--- a/src/mirall/socketapi.h
+++ b/src/mirall/socketapi.h
@@ -20,6 +20,8 @@ extern "C" {
#include <std/c_string.h>
}
+#include <sqlite3.h>
+
#include <QWeakPointer>
#include <QTcpSocket>
#include <QTcpServer>
@@ -38,6 +40,12 @@ typedef QLocalSocket SocketType;
class SyncFileStatus;
class Folder;
+struct SqliteHandle
+{
+ sqlite3 *_db;
+ sqlite3_stmt *_stmt;
+};
+
class SocketApi : public QObject
{
Q_OBJECT
@@ -64,6 +72,7 @@ private:
SyncJournalFileRecord dbFileRecord( Folder *folder, QString fileName );
SyncJournalFileRecord dbFileRecord_capi( Folder *folder, QString fileName );
SyncFileStatus recursiveFolderStatus(Folder *folder, const QString& fileName, c_strlist_t *excludes );
+ SqliteHandle getSqliteHandle( Folder *folder );
void sendMessage(SocketType* socket, const QString& message, bool doWait = false);
void broadcastMessage(const QString& verb, const QString &path, const QString &status = QString::null, bool doWait = false);
@@ -73,7 +82,6 @@ private:
Q_INVOKABLE void command_VERSION(const QString& argument, SocketType* socket);
-private:
#ifdef SOCKETAPI_TCP
QTcpServer _localServer;
#else
@@ -81,6 +89,7 @@ private:
#endif
QList<SocketType*> _listeners;
c_strlist_t *_excludes;
+ QHash<Folder*, SqliteHandle> _dbConnections;
};
}
--
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