[Pkg-owncloud-commits] [owncloud-client] 183/484: Checksum: Don't lose it on metadata update #3735

Sandro Knauß hefee-guest at moszumanska.debian.org
Wed Dec 16 00:37:41 UTC 2015


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 496b1e907df2ae63f3c01570c12b0bdaaa9bbbe6
Author: Christian Kamm <mail at ckamm.de>
Date:   Wed Oct 28 14:42:44 2015 +0100

    Checksum: Don't lose it on metadata update #3735
    
    Also improve tests.
---
 src/libsync/propagateupload.cpp |  2 +-
 src/libsync/syncengine.cpp      |  2 +-
 src/libsync/syncjournaldb.cpp   | 66 +++++++++++++++++++++++++++++++++++++----
 src/libsync/syncjournaldb.h     |  8 +++--
 test/testsyncjournaldb.h        | 20 +++++++++++++
 5 files changed, 88 insertions(+), 10 deletions(-)

diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp
index eb509a2..b34ea21 100644
--- a/src/libsync/propagateupload.cpp
+++ b/src/libsync/propagateupload.cpp
@@ -246,7 +246,7 @@ void PropagateUploadFileQNAM::slotStartUpload(const QByteArray& checksumType, co
             || checksum != _item->_transmissionChecksum) {
         _item->_transmissionChecksum = checksum;
         _item->_transmissionChecksumType = checksumType;
-        _propagator->_journal->updateFileRecordChecksumHeader(
+        _propagator->_journal->updateFileRecordChecksum(
                 _item->_file, checksum, checksumType);
     }
 
diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp
index 7b8f3e1..6e5b3ed 100644
--- a/src/libsync/syncengine.cpp
+++ b/src/libsync/syncengine.cpp
@@ -471,7 +471,7 @@ int SyncEngine::treewalkFile( TREE_WALK_FILE *file, bool remote )
             // the file system in the DB, this is to avoid spurious upload on the next sync
             item->_modtime = file->other.modtime;
 
-            _journal->setFileRecord(SyncJournalFileRecord(*item, _localPath + item->_file));
+            _journal->updateFileRecordMetadata(SyncJournalFileRecord(*item, _localPath + item->_file));
             item->_should_update_metadata = false;
         }
         if (item->_isDirectory && file->should_update_metadata) {
diff --git a/src/libsync/syncjournaldb.cpp b/src/libsync/syncjournaldb.cpp
index 67e2365..358f0f3 100644
--- a/src/libsync/syncjournaldb.cpp
+++ b/src/libsync/syncjournaldb.cpp
@@ -369,7 +369,17 @@ bool SyncJournalDb::checkConnect()
                                  "VALUES (?1 , ?2, ?3 , ?4 , ?5 , ?6 , ?7,  ?8 , ?9 , ?10, ?11, ?12, ?13, ?14, ?15, ?16);" );
 
     _setFileRecordChecksumQuery.reset(new SqlQuery(_db) );
-    _setFileRecordChecksumQuery->prepare("UPDATE metadata SET transmissionChecksum = ?2, transmissionChecksumTypeId = ?3 WHERE phash == ?1;");
+    _setFileRecordChecksumQuery->prepare(
+            "UPDATE metadata"
+            " SET transmissionChecksum = ?2, transmissionChecksumTypeId = ?3"
+            " WHERE phash == ?1;");
+
+    _setFileRecordMetadataQuery.reset(new SqlQuery(_db) );
+    _setFileRecordMetadataQuery->prepare(
+            "UPDATE metadata"
+            " SET inode=?2, mode=?3, modtime=?4, type=?5, md5=?6, fileid=?7,"
+            "  remotePerm=?8, filesize=?9, ignoredChildrenRemote=?10"
+            " WHERE phash == ?1;");
 
     _getDownloadInfoQuery.reset(new SqlQuery(_db) );
     _getDownloadInfoQuery->prepare( "SELECT tmpfile, etag, errorcount FROM "
@@ -872,9 +882,9 @@ int SyncJournalDb::getFileRecordCount()
     return 0;
 }
 
-bool SyncJournalDb::updateFileRecordChecksumHeader(const QString& filename,
-                                                   const QByteArray& transmisisonChecksum,
-                                                   const QByteArray& transmissionChecksumType)
+bool SyncJournalDb::updateFileRecordChecksum(const QString& filename,
+                                             const QByteArray& transmisisonChecksum,
+                                             const QByteArray& transmissionChecksumType)
 {
     QMutexLocker locker(&_mutex);
 
@@ -893,7 +903,7 @@ bool SyncJournalDb::updateFileRecordChecksumHeader(const QString& filename,
     query->bindValue(3, checksumTypeId);
 
     if( !query->exec() ) {
-        qWarning() << "Error SQL statement setFileRecordChecksumHeaderQuery: "
+        qWarning() << "Error SQL statement setFileRecordChecksumQuery: "
                    << query->lastQuery() <<  " :"
                    << query->error();
         return false;
@@ -906,6 +916,52 @@ bool SyncJournalDb::updateFileRecordChecksumHeader(const QString& filename,
     return true;
 }
 
+bool SyncJournalDb::updateFileRecordMetadata(const SyncJournalFileRecord& record)
+{
+    QMutexLocker locker(&_mutex);
+
+    qlonglong phash = getPHash(record._path);
+    QString etag( record._etag );
+    if( etag.isEmpty() ) etag = "";
+    QString fileId( record._fileId);
+    if( fileId.isEmpty() ) fileId = "";
+    QString remotePerm (record._remotePerm);
+    if (remotePerm.isEmpty()) remotePerm = QString(); // have NULL in DB (vs empty)
+
+    if( !checkConnect() ) {
+        qDebug() << "Failed to connect database.";
+        return false;
+    }
+
+    auto & query = _setFileRecordMetadataQuery;
+
+    query->reset();
+    query->bindValue(1, QString::number(phash));
+    query->bindValue(2, record._inode);
+    query->bindValue(3, record._mode);
+    query->bindValue(4, QString::number(Utility::qDateTimeToTime_t(record._modtime)));
+    query->bindValue(5, QString::number(record._type));
+    query->bindValue(6, etag);
+    query->bindValue(7, fileId);
+    query->bindValue(8, remotePerm);
+    query->bindValue(9, record._fileSize);
+    query->bindValue(10, record._serverHasIgnoredFiles ? 1 : 0);
+
+    if( !query->exec() ) {
+        qWarning() << "Error SQL statement setFileRecordMetadataQuery: "
+                   << query->lastQuery() <<  " :"
+                   << query->error();
+        return false;
+    }
+
+    qDebug() << query->lastQuery() << record._path << record._inode << record._mode << record._modtime
+             << record._type << etag << fileId << remotePerm << record._fileSize
+             << record._serverHasIgnoredFiles;
+
+    query->reset();
+    return true;
+}
+
 static void toDownloadInfo(SqlQuery &query, SyncJournalDb::DownloadInfo * res)
 {
     bool ok = true;
diff --git a/src/libsync/syncjournaldb.h b/src/libsync/syncjournaldb.h
index 775c9f4..69c7a76 100644
--- a/src/libsync/syncjournaldb.h
+++ b/src/libsync/syncjournaldb.h
@@ -42,9 +42,10 @@ public:
     bool setFileRecord( const SyncJournalFileRecord& record );
     bool deleteFileRecord( const QString& filename, bool recursively = false );
     int getFileRecordCount();
-    bool updateFileRecordChecksumHeader(const QString& filename,
-                                        const QByteArray& transmisisonChecksum,
-                                        const QByteArray& transmissionChecksumType);
+    bool updateFileRecordChecksum(const QString& filename,
+                                  const QByteArray& transmisisonChecksum,
+                                  const QByteArray& transmissionChecksumType);
+    bool updateFileRecordMetadata(const SyncJournalFileRecord& record);
     bool exists();
     void walCheckpoint();
 
@@ -168,6 +169,7 @@ private:
     QScopedPointer<SqlQuery> _getFileRecordQuery;
     QScopedPointer<SqlQuery> _setFileRecordQuery;
     QScopedPointer<SqlQuery> _setFileRecordChecksumQuery;
+    QScopedPointer<SqlQuery> _setFileRecordMetadataQuery;
     QScopedPointer<SqlQuery> _getDownloadInfoQuery;
     QScopedPointer<SqlQuery> _setDownloadInfoQuery;
     QScopedPointer<SqlQuery> _deleteDownloadInfoQuery;
diff --git a/test/testsyncjournaldb.h b/test/testsyncjournaldb.h
index 618b655..47cd6b4 100644
--- a/test/testsyncjournaldb.h
+++ b/test/testsyncjournaldb.h
@@ -67,6 +67,26 @@ private slots:
         SyncJournalFileRecord storedRecord = _db.getFileRecord("foo");
         QVERIFY(storedRecord == record);
 
+        // Update checksum
+        record._transmissionChecksum = "newchecksum";
+        record._transmissionChecksumType = "Adler32";
+        _db.updateFileRecordChecksum("foo", record._transmissionChecksum, record._transmissionChecksumType);
+        storedRecord = _db.getFileRecord("foo");
+        QVERIFY(storedRecord == record);
+
+        // Update metadata
+        record._inode = 12345;
+        record._modtime = dropMsecs(QDateTime::currentDateTime().addDays(1));
+        record._type = 7;
+        record._etag = "789FFF";
+        record._fileId = "efg";
+        record._remotePerm = "777";
+        record._mode = 12;
+        record._fileSize = 289055;
+        _db.updateFileRecordMetadata(record);
+        storedRecord = _db.getFileRecord("foo");
+        QVERIFY(storedRecord == record);
+
         QVERIFY(_db.deleteFileRecord("foo"));
         record = _db.getFileRecord("foo");
         QVERIFY(!record.isValid());

-- 
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