[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