Fix mutex usage in the journal

All public function must lock the mutex. And therefore none of the journal
function may call public function because the mutex is already locked.

So have a public commit that lock the mutex,  and a private  commitInternal
that assume the mutex is locked
This commit is contained in:
Olivier Goffart 2013-11-25 15:11:37 +01:00
parent ca3885de2a
commit 6f17131e3c
2 changed files with 15 additions and 6 deletions

View file

@ -189,7 +189,7 @@ bool SyncJournalDb::checkConnect()
return sqlFail("Create table blacklist", createQuery);
}
commit("checkConnect");
commitInternal("checkConnect");
bool rc = updateDatabaseStructure();
if( rc ) {
@ -282,7 +282,7 @@ bool SyncJournalDb::updateDatabaseStructure()
query.prepare("CREATE INDEX metadata_file_id ON metadata(fileid);");
re = re && query.exec();
commit("update database structure");
commitInternal("update database structure");
}
return re;
@ -735,9 +735,17 @@ void SyncJournalDb::updateBlacklistEntry( const SyncJournalBlacklistRecord& item
if( !iQuery.exec() ) {
qDebug() << "SQL exec blacklistitem insert/update failed: "<< iQuery.lastError().text();
}
}
void SyncJournalDb::commit(const QString& context, bool startTrans )
void SyncJournalDb::commit(const QString& context, bool startTrans)
{
QMutexLocker lock(&_mutex);
commitInternal(context, startTrans);
}
void SyncJournalDb::commitInternal(const QString& context, bool startTrans )
{
qDebug() << "Transaction Start " << context;
commitTransaction();

View file

@ -36,7 +36,6 @@ public:
bool deleteFileRecord( const QString& filename, bool recursively = false );
int getFileRecordCount();
bool exists();
QStringList tableColumns( const QString& table );
void updateBlacklistEntry( const SyncJournalBlacklistRecord& item );
void wipeBlacklistEntry(const QString& file);
@ -72,8 +71,6 @@ public:
void close();
void startTransaction();
void commitTransaction();
signals:
@ -83,6 +80,10 @@ private:
qint64 getPHash(const QString& ) const;
bool updateDatabaseStructure();
bool sqlFail(const QString& log, const QSqlQuery &query );
void commitInternal(const QString &context, bool startTrans = true);
void startTransaction();
void commitTransaction();
QStringList tableColumns( const QString& table );
bool checkConnect();
QSqlDatabase _db;