[Pkg-owncloud-commits] [owncloud-client] 171/484: Propagate: Store computed checksums in db during upload #3735
Sandro Knauß
hefee-guest at moszumanska.debian.org
Wed Dec 16 00:37:39 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 dff37e11eb3addc4c746bee8c5f8b0fefc5bc3f0
Author: Christian Kamm <mail at ckamm.de>
Date: Wed Oct 14 15:45:44 2015 +0200
Propagate: Store computed checksums in db during upload #3735
---
src/libsync/propagateupload.cpp | 35 +++++++++++++++++++++++++++--------
src/libsync/syncjournaldb.cpp | 32 ++++++++++++++++++++++++++++++++
src/libsync/syncjournaldb.h | 2 ++
3 files changed, 61 insertions(+), 8 deletions(-)
diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp
index edcfc88..c2b0730 100644
--- a/src/libsync/propagateupload.cpp
+++ b/src/libsync/propagateupload.cpp
@@ -209,19 +209,32 @@ void PropagateUploadFileQNAM::start()
_stopWatch.start();
- // do whatever is needed to add a checksum to the http upload request.
- // in any case, the validator will emit signal startUpload to let the flow
- // continue in slotStartUpload here.
+ auto supportedChecksumTypes = _propagator->account()->capabilities().supportedChecksumTypes();
+
+ // If we already have a checksum header and the checksum type is supported
+ // by the server, we keep that - otherwise recompute.
+ if (!_item->_checksumHeader.isEmpty()) {
+ QByteArray checksumType;
+ QByteArray checksum;
+ if (parseChecksumHeader(_item->_checksumHeader, &checksumType, &checksum)
+ && supportedChecksumTypes.contains(checksumType)) {
+ // TODO: We could validate the old checksum and thereby determine whether
+ // an upload is necessary or not.
+ slotStartUpload(checksumType, checksum);
+ return;
+ }
+ }
+
+ // Compute a new checksum.
auto computeChecksum = new ComputeChecksum(this);
// If the config file does not specify a checksum type but the
- // server supports it choose a type based on that.
+ // server supports it, choose a type based on that.
if (computeChecksum->checksumType().isEmpty()) {
- auto checksumTypes = _propagator->account()->capabilities().supportedChecksumTypes();
- if (!checksumTypes.isEmpty()) {
+ if (!supportedChecksumTypes.isEmpty()) {
// TODO: We might want to prefer some types over others instead
// of choosing the first.
- computeChecksum->setChecksumType(checksumTypes.first());
+ computeChecksum->setChecksumType(supportedChecksumTypes.first());
}
}
@@ -232,8 +245,14 @@ void PropagateUploadFileQNAM::start()
void PropagateUploadFileQNAM::slotStartUpload(const QByteArray& checksumType, const QByteArray& checksum)
{
+ // Store the computed checksum in the database, if different
+ auto newChecksumHeader = makeChecksumHeader(checksumType, checksum);
+ if (newChecksumHeader != _item->_checksumHeader) {
+ _item->_checksumHeader = newChecksumHeader;
+ _propagator->_journal->updateFileRecordChecksumHeader(_item->_file, _item->_checksumHeader);
+ }
+
const QString fullFilePath = _propagator->getFilePath(_item->_file);
- _item->_checksumHeader = makeChecksumHeader(checksumType, checksum);
if (!FileSystem::fileExists(fullFilePath)) {
done(SyncFileItem::SoftError, tr("File Removed"));
diff --git a/src/libsync/syncjournaldb.cpp b/src/libsync/syncjournaldb.cpp
index 0b099ee..db1814e 100644
--- a/src/libsync/syncjournaldb.cpp
+++ b/src/libsync/syncjournaldb.cpp
@@ -355,6 +355,9 @@ bool SyncJournalDb::checkConnect()
"(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm, filesize, ignoredChildrenRemote, checksumHeader) "
"VALUES (?1 , ?2, ?3 , ?4 , ?5 , ?6 , ?7, ?8 , ?9 , ?10, ?11, ?12, ?13, ?14, ?15);" );
+ _setFileRecordChecksumHeaderQuery.reset(new SqlQuery(_db) );
+ _setFileRecordChecksumHeaderQuery->prepare("UPDATE metadata SET checksumHeader = ?2 WHERE phash == ?1;");
+
_getDownloadInfoQuery.reset(new SqlQuery(_db) );
_getDownloadInfoQuery->prepare( "SELECT tmpfile, etag, errorcount FROM "
"downloadinfo WHERE path=?1" );
@@ -835,6 +838,35 @@ int SyncJournalDb::getFileRecordCount()
return 0;
}
+bool SyncJournalDb::updateFileRecordChecksumHeader(const QString &filename, const QByteArray &checksumHeader)
+{
+ QMutexLocker locker(&_mutex);
+
+ qlonglong phash = getPHash(filename);
+ if( !checkConnect() ) {
+ qDebug() << "Failed to connect database.";
+ return false;
+ }
+
+ auto & query = _setFileRecordChecksumHeaderQuery;
+
+ query->reset();
+ query->bindValue(1, QString::number(phash));
+ query->bindValue(2, checksumHeader);
+
+ if( !query->exec() ) {
+ qWarning() << "Error SQL statement setFileRecordChecksumHeaderQuery: "
+ << query->lastQuery() << " :"
+ << query->error();
+ return false;
+ }
+
+ qDebug() << query->lastQuery() << phash << checksumHeader;
+
+ 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 c0a51ef..226fa31 100644
--- a/src/libsync/syncjournaldb.h
+++ b/src/libsync/syncjournaldb.h
@@ -42,6 +42,7 @@ public:
bool setFileRecord( const SyncJournalFileRecord& record );
bool deleteFileRecord( const QString& filename, bool recursively = false );
int getFileRecordCount();
+ bool updateFileRecordChecksumHeader(const QString& filename, const QByteArray& checksumHeader);
bool exists();
void walCheckpoint();
@@ -159,6 +160,7 @@ private:
int _transaction;
QScopedPointer<SqlQuery> _getFileRecordQuery;
QScopedPointer<SqlQuery> _setFileRecordQuery;
+ QScopedPointer<SqlQuery> _setFileRecordChecksumHeaderQuery;
QScopedPointer<SqlQuery> _getDownloadInfoQuery;
QScopedPointer<SqlQuery> _setDownloadInfoQuery;
QScopedPointer<SqlQuery> _deleteDownloadInfoQuery;
--
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