From b7823dc648f22ee0aa33f6d918b24341b0954acf Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 28 Oct 2015 11:00:03 +0100 Subject: [PATCH] Checksum: Put checksum type into separate column #3735 --- src/libsync/ownsql.cpp | 5 + src/libsync/ownsql.h | 3 + src/libsync/propagatedownload.cpp | 17 +-- src/libsync/propagatedownload.h | 2 +- src/libsync/propagateupload.cpp | 35 +++--- src/libsync/syncfileitem.h | 3 +- src/libsync/syncjournaldb.cpp | 108 +++++++++++++++--- src/libsync/syncjournaldb.h | 13 ++- src/libsync/syncjournalfilerecord.cpp | 8 +- src/libsync/syncjournalfilerecord.h | 3 +- src/libsync/transmissionchecksumvalidator.cpp | 4 +- src/libsync/transmissionchecksumvalidator.h | 2 +- test/testsyncjournaldb.h | 27 +++++ test/testtranschecksumvalidator.h | 2 +- 14 files changed, 179 insertions(+), 53 deletions(-) diff --git a/src/libsync/ownsql.cpp b/src/libsync/ownsql.cpp index 9245c8654..0f2c59275 100644 --- a/src/libsync/ownsql.cpp +++ b/src/libsync/ownsql.cpp @@ -316,6 +316,11 @@ void SqlQuery::bindValue(int pos, const QVariant& value) Q_ASSERT( res == SQLITE_OK ); } +bool SqlQuery::nullValue(int index) +{ + return sqlite3_column_type(_stmt, index) == SQLITE_NULL; +} + QString SqlQuery::stringValue(int index) { return QString::fromUtf16(static_cast(sqlite3_column_text16(_stmt, index))); diff --git a/src/libsync/ownsql.h b/src/libsync/ownsql.h index bcff7f58e..3da2e75c8 100644 --- a/src/libsync/ownsql.h +++ b/src/libsync/ownsql.h @@ -66,6 +66,9 @@ public: ~SqlQuery(); QString error() const; + /// Checks whether the value at the given column index is NULL + bool nullValue(int index); + QString stringValue(int index); int intValue(int index); quint64 int64Value(int index); diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp index 1f0a1b7b2..3636d2ca3 100644 --- a/src/libsync/propagatedownload.cpp +++ b/src/libsync/propagatedownload.cpp @@ -353,8 +353,8 @@ void PropagateDownloadFileQNAM::start() _tmpFile.close(); // Unfortunately we lost the checksum header, if any... - QByteArray checksumHeader; - downloadFinished(checksumHeader); + QByteArray noChecksumData; + downloadFinished(noChecksumData, noChecksumData); return; } } @@ -535,8 +535,10 @@ void PropagateDownloadFileQNAM::slotGetFinished() // will also emit the validated() signal to continue the flow in slot downloadFinished() // as this is (still) also correct. ValidateChecksumHeader *validator = new ValidateChecksumHeader(this); - connect(validator, SIGNAL(validated(QByteArray)), this, SLOT(downloadFinished(QByteArray))); - connect(validator, SIGNAL(validationFailed(QString)), this, SLOT(slotChecksumFail(QString))); + connect(validator, SIGNAL(validated(QByteArray,QByteArray)), + SLOT(downloadFinished(QByteArray,QByteArray))); + connect(validator, SIGNAL(validationFailed(QString)), + SLOT(slotChecksumFail(QString))); auto checksumHeader = job->reply()->rawHeader(checkSumHeaderC); if (!downloadChecksumEnabled()) { checksumHeader.clear(); @@ -618,10 +620,11 @@ static void handleRecallFile(const QString &fn) } } // end namespace -void PropagateDownloadFileQNAM::downloadFinished(const QByteArray& checksumHeader) +void PropagateDownloadFileQNAM::downloadFinished(const QByteArray& checksumType, const QByteArray& checksum) { - if (!checksumHeader.isEmpty()) { - _item->_checksumHeader = checksumHeader; + if (!checksumType.isEmpty()) { + _item->_transmissionChecksum = checksum; + _item->_transmissionChecksumType = checksumType; } QString fn = _propagator->getFilePath(_item->_file); diff --git a/src/libsync/propagatedownload.h b/src/libsync/propagatedownload.h index 9a5c2b326..2a8877ed1 100644 --- a/src/libsync/propagatedownload.h +++ b/src/libsync/propagatedownload.h @@ -117,7 +117,7 @@ public: private slots: void slotGetFinished(); void abort() Q_DECL_OVERRIDE; - void downloadFinished(const QByteArray& checksumHeader); + void downloadFinished(const QByteArray& checksumType, const QByteArray& checksum); void slotDownloadProgress(qint64,qint64); void slotChecksumFail( const QString& errMsg ); diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp index 3412c0e29..10724a417 100644 --- a/src/libsync/propagateupload.cpp +++ b/src/libsync/propagateupload.cpp @@ -213,14 +213,11 @@ void PropagateUploadFileQNAM::start() // 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)) { + if (!_item->_transmissionChecksumType.isEmpty()) { + if (supportedChecksumTypes.contains(_item->_transmissionChecksumType)) { // TODO: We could validate the old checksum and thereby determine whether // an upload is necessary or not. - slotStartUpload(checksumType, checksum); + slotStartUpload(_item->_transmissionChecksumType, _item->_transmissionChecksum); return; } } @@ -241,10 +238,12 @@ 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); + if (checksumType != _item->_transmissionChecksumType + || checksum != _item->_transmissionChecksum) { + _item->_transmissionChecksum = checksum; + _item->_transmissionChecksumType = checksumType; + _propagator->_journal->updateFileRecordChecksumHeader( + _item->_file, checksum, checksumType); } const QString fullFilePath = _propagator->getFilePath(_item->_file); @@ -477,6 +476,7 @@ void PropagateUploadFileQNAM::startNextChunk() UploadDevice *device = new UploadDevice(&_propagator->_bandwidthManager); qint64 chunkStart = 0; qint64 currentChunkSize = fileSize; + bool isFinalChunk = false; if (_chunkCount > 1) { int sendingChunk = (_currentChunk + _startChunk) % _chunkCount; // XOR with chunk size to make sure everything goes well if chunk size changes between runs @@ -493,15 +493,16 @@ void PropagateUploadFileQNAM::startNextChunk() if( currentChunkSize == 0 ) { // if the last chunk pretends to be 0, its actually the full chunk size. currentChunkSize = chunkSize(); } - if( !_item->_checksumHeader.isEmpty() ) { - headers[checkSumHeaderC] = _item->_checksumHeader; - } + isFinalChunk = true; } } else { - // checksum if its only one chunk - if( !_item->_checksumHeader.isEmpty() ) { - headers[checkSumHeaderC] = _item->_checksumHeader; - } + // if there's only one chunk, it's the final one + isFinalChunk = true; + } + + if (isFinalChunk && !_item->_transmissionChecksumType.isEmpty()) { + headers[checkSumHeaderC] = makeChecksumHeader( + _item->_transmissionChecksumType, _item->_transmissionChecksum); } if (! device->prepareAndOpen(_propagator->getFilePath(_item->_file), chunkStart, currentChunkSize)) { diff --git a/src/libsync/syncfileitem.h b/src/libsync/syncfileitem.h index b6a655854..0ded88efc 100644 --- a/src/libsync/syncfileitem.h +++ b/src/libsync/syncfileitem.h @@ -157,7 +157,8 @@ public: quint64 _inode; QByteArray _fileId; QByteArray _remotePerm; - QByteArray _checksumHeader; + QByteArray _transmissionChecksum; + QByteArray _transmissionChecksumType; QString _directDownloadUrl; QString _directDownloadCookies; diff --git a/src/libsync/syncjournaldb.cpp b/src/libsync/syncjournaldb.cpp index db1814eb9..67e236505 100644 --- a/src/libsync/syncjournaldb.cpp +++ b/src/libsync/syncjournaldb.cpp @@ -206,7 +206,8 @@ bool SyncJournalDb::checkConnect() "md5 VARCHAR(32)," /* This is the etag. Called md5 for compatibility */ // updateDatabaseStructure() will add a fileid column // updateDatabaseStructure() will add a remotePerm column - // updateDatabaseStructure() will add a checksumHeader column + // updateDatabaseStructure() will add a transmissionChecksum column + // updateDatabaseStructure() will add a transmissionChecksumTypeId column "PRIMARY KEY(phash)" ");"); @@ -272,6 +273,14 @@ bool SyncJournalDb::checkConnect() return sqlFail("Create table selectivesync", createQuery); } + // create the checksumtype table. + createQuery.prepare("CREATE TABLE IF NOT EXISTS checksumtype(" + "id INTEGER PRIMARY KEY," + "name TEXT UNIQUE" + ");"); + if (!createQuery.exec()) { + return sqlFail("Create table version", createQuery); + } createQuery.prepare("CREATE TABLE IF NOT EXISTS version(" @@ -347,16 +356,20 @@ bool SyncJournalDb::checkConnect() } _getFileRecordQuery.reset(new SqlQuery(_db)); - _getFileRecordQuery->prepare("SELECT path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm, filesize, ignoredChildrenRemote, checksumHeader FROM " - "metadata WHERE phash=?1" ); + _getFileRecordQuery->prepare( + "SELECT path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm, filesize," + " ignoredChildrenRemote, transmissionChecksum, checksumtype.name" + " FROM metadata" + " LEFT JOIN checksumtype ON metadata.transmissionChecksumTypeId == checksumtype.id" + " WHERE phash=?1" ); _setFileRecordQuery.reset(new SqlQuery(_db) ); _setFileRecordQuery->prepare("INSERT OR REPLACE INTO metadata " - "(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);" ); + "(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm, filesize, ignoredChildrenRemote, transmissionChecksum, transmissionChecksumTypeId) " + "VALUES (?1 , ?2, ?3 , ?4 , ?5 , ?6 , ?7, ?8 , ?9 , ?10, ?11, ?12, ?13, ?14, ?15, ?16);" ); - _setFileRecordChecksumHeaderQuery.reset(new SqlQuery(_db) ); - _setFileRecordChecksumHeaderQuery->prepare("UPDATE metadata SET checksumHeader = ?2 WHERE phash == ?1;"); + _setFileRecordChecksumQuery.reset(new SqlQuery(_db) ); + _setFileRecordChecksumQuery->prepare("UPDATE metadata SET transmissionChecksum = ?2, transmissionChecksumTypeId = ?3 WHERE phash == ?1;"); _getDownloadInfoQuery.reset(new SqlQuery(_db) ); _getDownloadInfoQuery->prepare( "SELECT tmpfile, etag, errorcount FROM " @@ -407,6 +420,12 @@ bool SyncJournalDb::checkConnect() _getSelectiveSyncListQuery.reset(new SqlQuery(_db)); _getSelectiveSyncListQuery->prepare("SELECT path FROM selectivesync WHERE type=?1"); + _getChecksumTypeIdQuery.reset(new SqlQuery(_db)); + _getChecksumTypeIdQuery->prepare("SELECT id FROM checksumtype WHERE name=?1"); + + _insertChecksumTypeQuery.reset(new SqlQuery(_db)); + _insertChecksumTypeQuery->prepare("INSERT OR IGNORE INTO checksumtype (name) VALUES (?1)"); + // don't start a new transaction now commitInternal(QString("checkConnect End"), false); @@ -532,16 +551,26 @@ bool SyncJournalDb::updateMetadataTableStructure() commitInternal("update database structure: add ignoredChildrenRemote col"); } - if( columns.indexOf(QLatin1String("checksumHeader")) == -1 ) { + if( columns.indexOf(QLatin1String("transmissionChecksum")) == -1 ) { + SqlQuery query(_db); + query.prepare("ALTER TABLE metadata ADD COLUMN transmissionChecksum TEXT;"); + if( !query.exec()) { + sqlFail("updateMetadataTableStructure: add transmissionChecksum column", query); + re = false; + } + commitInternal("update database structure: add transmissionChecksum col"); + } + if( columns.indexOf(QLatin1String("transmissionChecksumTypeId")) == -1 ) { SqlQuery query(_db); - query.prepare("ALTER TABLE metadata ADD COLUMN checksumHeader TEXT;"); + query.prepare("ALTER TABLE metadata ADD COLUMN transmissionChecksumTypeId INTEGER;"); if( !query.exec()) { - sqlFail("updateMetadataTableStructure: add checksumHeader column", query); + sqlFail("updateMetadataTableStructure: add transmissionChecksumTypeId column", query); re = false; } - commitInternal("update database structure: add checksumHeader col"); + commitInternal("update database structure: add transmissionChecksumTypeId col"); } + return re; } @@ -642,6 +671,7 @@ bool SyncJournalDb::setFileRecord( const SyncJournalFileRecord& _record ) if( fileId.isEmpty() ) fileId = ""; QString remotePerm (record._remotePerm); if (remotePerm.isEmpty()) remotePerm = QString(); // have NULL in DB (vs empty) + int checksumTypeId = mapChecksumType(record._transmissionChecksumType); _setFileRecordQuery->reset(); _setFileRecordQuery->bindValue(1, QString::number(phash)); _setFileRecordQuery->bindValue(2, plen); @@ -657,7 +687,8 @@ bool SyncJournalDb::setFileRecord( const SyncJournalFileRecord& _record ) _setFileRecordQuery->bindValue(12, remotePerm ); _setFileRecordQuery->bindValue(13, record._fileSize ); _setFileRecordQuery->bindValue(14, record._serverHasIgnoredFiles ? 1:0); - _setFileRecordQuery->bindValue(15, record._checksumHeader ); + _setFileRecordQuery->bindValue(15, record._transmissionChecksum ); + _setFileRecordQuery->bindValue(16, checksumTypeId ); if( !_setFileRecordQuery->exec() ) { qWarning() << "Error SQL statement setFileRecord: " << _setFileRecordQuery->lastQuery() << " :" @@ -669,7 +700,7 @@ bool SyncJournalDb::setFileRecord( const SyncJournalFileRecord& _record ) << record._mode << QString::number(Utility::qDateTimeToTime_t(record._modtime)) << QString::number(record._type) << record._etag << record._fileId << record._remotePerm << record._fileSize << (record._serverHasIgnoredFiles ? 1:0) - << record._checksumHeader; + << record._transmissionChecksum << record._transmissionChecksumType << checksumTypeId; _setFileRecordQuery->reset(); return true; @@ -749,7 +780,10 @@ SyncJournalFileRecord SyncJournalDb::getFileRecord( const QString& filename ) rec._remotePerm = _getFileRecordQuery->baValue(9); rec._fileSize = _getFileRecordQuery->int64Value(10); rec._serverHasIgnoredFiles = (_getFileRecordQuery->intValue(11) > 0); - rec._checksumHeader = _getFileRecordQuery->baValue(12); + rec._transmissionChecksum = _getFileRecordQuery->baValue(12); + if( !_getFileRecordQuery->nullValue(13) ) { + rec._transmissionChecksumType = _getFileRecordQuery->baValue(13); + } } else { QString err = _getFileRecordQuery->error(); qDebug() << "No journal entry found for " << filename; @@ -838,7 +872,9 @@ int SyncJournalDb::getFileRecordCount() return 0; } -bool SyncJournalDb::updateFileRecordChecksumHeader(const QString &filename, const QByteArray &checksumHeader) +bool SyncJournalDb::updateFileRecordChecksumHeader(const QString& filename, + const QByteArray& transmisisonChecksum, + const QByteArray& transmissionChecksumType) { QMutexLocker locker(&_mutex); @@ -848,11 +884,13 @@ bool SyncJournalDb::updateFileRecordChecksumHeader(const QString &filename, cons return false; } - auto & query = _setFileRecordChecksumHeaderQuery; + int checksumTypeId = mapChecksumType(transmissionChecksumType); + auto & query = _setFileRecordChecksumQuery; query->reset(); query->bindValue(1, QString::number(phash)); - query->bindValue(2, checksumHeader); + query->bindValue(2, transmisisonChecksum); + query->bindValue(3, checksumTypeId); if( !query->exec() ) { qWarning() << "Error SQL statement setFileRecordChecksumHeaderQuery: " @@ -861,7 +899,8 @@ bool SyncJournalDb::updateFileRecordChecksumHeader(const QString &filename, cons return false; } - qDebug() << query->lastQuery() << phash << checksumHeader; + qDebug() << query->lastQuery() << phash << transmisisonChecksum + << transmissionChecksumType << checksumTypeId; query->reset(); return true; @@ -1436,6 +1475,39 @@ void SyncJournalDb::forceRemoteDiscoveryNextSyncLocked() } } +int SyncJournalDb::mapChecksumType(const QByteArray& checksumType) +{ + if (checksumType.isEmpty()) { + return 0; + } + + // Ensure the checksum type is in the db + _insertChecksumTypeQuery->reset(); + _insertChecksumTypeQuery->bindValue(1, checksumType); + if( !_insertChecksumTypeQuery->exec() ) { + qWarning() << "Error SQL statement insertChecksumType: " + << _insertChecksumTypeQuery->lastQuery() << " :" + << _insertChecksumTypeQuery->error(); + return 0; + } + + // Retrieve the id + _getChecksumTypeIdQuery->reset(); + _getChecksumTypeIdQuery->bindValue(1, checksumType); + if( !_getChecksumTypeIdQuery->exec() ) { + qWarning() << "Error SQL statement getChecksumTypeId: " + << _getChecksumTypeIdQuery->lastQuery() << " :" + << _getChecksumTypeIdQuery->error(); + return 0; + } + + if( !_getChecksumTypeIdQuery->next() ) { + qDebug() << "No checksum type mapping found for" << checksumType; + return 0; + } + return _getChecksumTypeIdQuery->intValue(0); +} + void SyncJournalDb::commit(const QString& context, bool startTrans) { diff --git a/src/libsync/syncjournaldb.h b/src/libsync/syncjournaldb.h index 226fa3167..775c9f4fc 100644 --- a/src/libsync/syncjournaldb.h +++ b/src/libsync/syncjournaldb.h @@ -42,7 +42,9 @@ 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 updateFileRecordChecksumHeader(const QString& filename, + const QByteArray& transmisisonChecksum, + const QByteArray& transmissionChecksumType); bool exists(); void walCheckpoint(); @@ -154,13 +156,18 @@ private: // Same as forceRemoteDiscoveryNextSync but without acquiring the lock void forceRemoteDiscoveryNextSyncLocked(); + // Returns the integer id of the checksum type + // + // Returns 0 on failure and for empty checksum types. + int mapChecksumType(const QByteArray& checksumType); + SqlDatabase _db; QString _dbFile; QMutex _mutex; // Public functions are protected with the mutex. int _transaction; QScopedPointer _getFileRecordQuery; QScopedPointer _setFileRecordQuery; - QScopedPointer _setFileRecordChecksumHeaderQuery; + QScopedPointer _setFileRecordChecksumQuery; QScopedPointer _getDownloadInfoQuery; QScopedPointer _setDownloadInfoQuery; QScopedPointer _deleteDownloadInfoQuery; @@ -172,6 +179,8 @@ private: QScopedPointer _getErrorBlacklistQuery; QScopedPointer _setErrorBlacklistQuery; QScopedPointer _getSelectiveSyncListQuery; + QScopedPointer _getChecksumTypeIdQuery; + QScopedPointer _insertChecksumTypeQuery; /* 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 diff --git a/src/libsync/syncjournalfilerecord.cpp b/src/libsync/syncjournalfilerecord.cpp index 22ee38b1c..8c03f7760 100644 --- a/src/libsync/syncjournalfilerecord.cpp +++ b/src/libsync/syncjournalfilerecord.cpp @@ -36,7 +36,8 @@ SyncJournalFileRecord::SyncJournalFileRecord(const SyncFileItem &item, const QSt : _path(item._file), _modtime(Utility::qDateTimeFromTime_t(item._modtime)), _type(item._type), _etag(item._etag), _fileId(item._fileId), _fileSize(item._size), _remotePerm(item._remotePerm), _mode(0), _serverHasIgnoredFiles(item._serverHasIgnoredFiles), - _checksumHeader(item._checksumHeader) + _transmissionChecksum(item._transmissionChecksum), + _transmissionChecksumType(item._transmissionChecksumType) { // use the "old" inode coming with the item for the case where the // filesystem stat fails. That can happen if the the file was removed @@ -151,9 +152,12 @@ bool operator==(const SyncJournalFileRecord & lhs, && lhs._type == rhs._type && lhs._etag == rhs._etag && lhs._fileId == rhs._fileId + && lhs._fileSize == rhs._fileSize && lhs._remotePerm == rhs._remotePerm && lhs._mode == rhs._mode - && lhs._fileSize == rhs._fileSize; + && lhs._serverHasIgnoredFiles == rhs._serverHasIgnoredFiles + && lhs._transmissionChecksum == rhs._transmissionChecksum + && lhs._transmissionChecksumType == rhs._transmissionChecksumType; } } diff --git a/src/libsync/syncjournalfilerecord.h b/src/libsync/syncjournalfilerecord.h index d3a2a7013..4165cafbc 100644 --- a/src/libsync/syncjournalfilerecord.h +++ b/src/libsync/syncjournalfilerecord.h @@ -47,7 +47,8 @@ public: QByteArray _remotePerm; int _mode; bool _serverHasIgnoredFiles; - QByteArray _checksumHeader; + QByteArray _transmissionChecksum; + QByteArray _transmissionChecksumType; }; bool OWNCLOUDSYNC_EXPORT diff --git a/src/libsync/transmissionchecksumvalidator.cpp b/src/libsync/transmissionchecksumvalidator.cpp index 1a0caaf76..15923bd2d 100644 --- a/src/libsync/transmissionchecksumvalidator.cpp +++ b/src/libsync/transmissionchecksumvalidator.cpp @@ -119,7 +119,7 @@ void ValidateChecksumHeader::start(const QString& filePath, const QByteArray& ch { // If the incoming header is empty no validation can happen. Just continue. if( checksumHeader.isEmpty() ) { - emit validated(QByteArray()); + emit validated(QByteArray(), QByteArray()); return; } @@ -148,7 +148,7 @@ void ValidateChecksumHeader::slotChecksumCalculated(const QByteArray& checksumTy emit validationFailed(tr("The downloaded file does not match the checksum, it will be resumed.")); return; } - emit validated(makeChecksumHeader(checksumType, checksum)); + emit validated(checksumType, checksum); } } diff --git a/src/libsync/transmissionchecksumvalidator.h b/src/libsync/transmissionchecksumvalidator.h index 9ae1a1132..3a37c6948 100644 --- a/src/libsync/transmissionchecksumvalidator.h +++ b/src/libsync/transmissionchecksumvalidator.h @@ -92,7 +92,7 @@ public: void start(const QString& filePath, const QByteArray& checksumHeader); signals: - void validated(const QByteArray& checksumHeader); + void validated(const QByteArray& checksumType, const QByteArray& checksum); void validationFailed( const QString& errMsg ); private slots: diff --git a/test/testsyncjournaldb.h b/test/testsyncjournaldb.h index 7ca65b754..618b6550d 100644 --- a/test/testsyncjournaldb.h +++ b/test/testsyncjournaldb.h @@ -60,6 +60,8 @@ private slots: record._remotePerm = "744"; record._mode = -17; record._fileSize = 213089055; + record._transmissionChecksum = "mychecksum"; + record._transmissionChecksumType = "MD5"; QVERIFY(_db.setFileRecord(record)); SyncJournalFileRecord storedRecord = _db.getFileRecord("foo"); @@ -70,6 +72,31 @@ private slots: QVERIFY(!record.isValid()); } + void testFileRecordChecksum() + { + // Try with and without a checksum + { + SyncJournalFileRecord record; + record._path = "foo-checksum"; + record._remotePerm = "744"; + record._transmissionChecksum = "mychecksum"; + record._transmissionChecksumType = "MD5"; + QVERIFY(_db.setFileRecord(record)); + + SyncJournalFileRecord storedRecord = _db.getFileRecord("foo-checksum"); + QVERIFY(storedRecord == record); + } + { + SyncJournalFileRecord record; + record._path = "foo-nochecksum"; + record._remotePerm = "744"; + QVERIFY(_db.setFileRecord(record)); + + SyncJournalFileRecord storedRecord = _db.getFileRecord("foo-nochecksum"); + QVERIFY(storedRecord == record); + } + } + void testDownloadInfo() { typedef SyncJournalDb::DownloadInfo Info; diff --git a/test/testtranschecksumvalidator.h b/test/testtranschecksumvalidator.h index 2e0833377..7c1cf438f 100644 --- a/test/testtranschecksumvalidator.h +++ b/test/testtranschecksumvalidator.h @@ -128,7 +128,7 @@ using namespace OCC; _successDown = false; ValidateChecksumHeader *vali = new ValidateChecksumHeader(this); - connect(vali, SIGNAL(validated(QByteArray)), this, SLOT(slotDownValidated())); + connect(vali, SIGNAL(validated(QByteArray,QByteArray)), this, SLOT(slotDownValidated())); connect(vali, SIGNAL(validationFailed(QString)), this, SLOT(slotDownError(QString))); vali->start(_testfile, adler); -- 2.30.2