bool SyncJournalDb::setFileRecord( const SyncJournalFileRecord& record ) { QMutexLocker locker(&_mutex); qlonglong phash = getPHash(record._path); if( checkConnect() ) { QByteArray arr = record._path.toUtf8(); int plen = arr.length(); // _setFileRecordQuery->prepare("INSERT OR REPLACE INTO metadata " // "(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5, fileid) " // "VALUES ( ? , ?, ? , ? , ? , ? , ?, ? , ? , ?, ? )" ); QString etag( record._etag ); if( etag.isEmpty() ) etag = ""; QString fileId( record._fileId); if( fileId.isEmpty() ) fileId = ""; _setFileRecordQuery->bindValue(0, QString::number(phash)); _setFileRecordQuery->bindValue(1, plen); _setFileRecordQuery->bindValue(2, record._path ); _setFileRecordQuery->bindValue(3, record._inode ); _setFileRecordQuery->bindValue(4, record._uid ); _setFileRecordQuery->bindValue(5, record._gid ); _setFileRecordQuery->bindValue(6, record._mode ); _setFileRecordQuery->bindValue(7, QString::number(record._modtime.toTime_t())); _setFileRecordQuery->bindValue(8, QString::number(record._type) ); _setFileRecordQuery->bindValue(9, etag ); _setFileRecordQuery->bindValue(10, fileId ); if( !_setFileRecordQuery->exec() ) { qWarning() << "Error SQL statement setFileRecord: " << _setFileRecordQuery->lastQuery() << " :" << _setFileRecordQuery->lastError().text(); return false; } qDebug() << _setFileRecordQuery->lastQuery() << phash << plen << record._path << record._inode << record._uid << record._gid << record._mode << QString::number(record._modtime.toTime_t()) << QString::number(record._type) << record._etag << record._fileId; _setFileRecordQuery->finish(); return true; } else { qDebug() << "Failed to connect database."; return false; // checkConnect failed. } }
SyncJournalFileRecord SyncJournalDb::getFileRecord( const QString& filename ) { QMutexLocker locker(&_mutex); qlonglong phash = getPHash( filename ); SyncJournalFileRecord rec; /* CREATE TABLE "metadata"(phash INTEGER(8),pathlen INTEGER,path VARCHAR(4096),inode INTEGER,uid INTEGER,gid INTEGER,mode INTEGER,modtime INTEGER(8),type INTEGER,md5 VARCHAR(32),PRIMARY KEY(phash)); CREATE INDEX metadata_inode ON metadata(inode); CREATE INDEX metadata_phash ON metadata(phash); */ if( checkConnect() ) { _getFileRecordQuery->bindValue(":ph", QString::number(phash)); if (!_getFileRecordQuery->exec()) { QString err = _getFileRecordQuery->lastError().text(); qDebug() << "Error creating prepared statement: " << _getFileRecordQuery->lastQuery() << ", Error:" << err;; return rec; } if( _getFileRecordQuery->next() ) { bool ok; rec._path = _getFileRecordQuery->value(0).toString(); rec._inode = _getFileRecordQuery->value(1).toInt(&ok); rec._uid = _getFileRecordQuery->value(2).toInt(&ok); rec._gid = _getFileRecordQuery->value(3).toInt(&ok); rec._mode = _getFileRecordQuery->value(4).toInt(&ok); rec._modtime = QDateTime::fromTime_t(_getFileRecordQuery->value(5).toLongLong(&ok)); rec._type = _getFileRecordQuery->value(6).toInt(&ok); rec._etag = _getFileRecordQuery->value(7).toString(); rec._fileId = _getFileRecordQuery->value(8).toString(); _getFileRecordQuery->finish(); } else { QString err = _getFileRecordQuery->lastError().text(); qDebug() << "Can not query " << _getFileRecordQuery->lastQuery() << ", Error:" << err; } } return rec; }
bool SyncJournalDb::deleteFileRecord(const QString& filename, bool recursively) { QMutexLocker locker(&_mutex); if( checkConnect() ) { // if (!recursively) { // always delete the actual file. qlonglong phash = getPHash(filename); _deleteFileRecordPhash->bindValue( 0, QString::number(phash) ); if( !_deleteFileRecordPhash->exec() ) { qWarning() << "Exec error of SQL statement: " << _deleteFileRecordPhash->lastQuery() << " : " << _deleteFileRecordPhash->lastError().text(); return false; } qDebug() << _deleteFileRecordPhash->executedQuery() << phash << filename; _deleteFileRecordPhash->finish(); if( recursively) { _deleteFileRecordRecursively->bindValue(0, filename); if( !_deleteFileRecordRecursively->exec() ) { qWarning() << "Exec error of SQL statement: " << _deleteFileRecordRecursively->lastQuery() << " : " << _deleteFileRecordRecursively->lastError().text(); return false; } qDebug() << _deleteFileRecordRecursively->executedQuery() << filename; _deleteFileRecordRecursively->finish(); } return true; } else { qDebug() << "Failed to connect database."; return false; // checkConnect failed. } }
SyncJournalFileRecord record = _record; QMutexLocker locker(&_mutex); if (!_avoidReadFromDbOnNextSyncFilter.isEmpty()) { // If we are a directory that should not be read from db next time, don't write the etag QString prefix = record._path + "/"; foreach(const QString &it, _avoidReadFromDbOnNextSyncFilter) { if (it.startsWith(prefix)) { qDebug() << "Filtered writing the etag of" << prefix << "because it is a prefix of" << it; record._etag = "_invalid_"; break; } } } qlonglong phash = getPHash(record._path); if( checkConnect() ) { QByteArray arr = record._path.toUtf8(); int plen = arr.length(); 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) _setFileRecordQuery->bindValue(0, QString::number(phash)); _setFileRecordQuery->bindValue(1, plen); _setFileRecordQuery->bindValue(2, record._path ); _setFileRecordQuery->bindValue(3, record._inode );