Move database open to async task

* Wrap key transformation in AsyncTask when reading a database. Significantly reduces user interface lockup.
* Replace root group with new group instead of deleting the pointer (fulfills member validity promise).
This commit is contained in:
Jonathan White 2020-03-04 10:05:33 -05:00
parent 91c6e436b3
commit a8c02fdc3c
4 changed files with 15 additions and 19 deletions

View file

@ -415,27 +415,26 @@ void Database::releaseData()
// Prevent data release while saving // Prevent data release while saving
QMutexLocker locker(&m_saveMutex); QMutexLocker locker(&m_saveMutex);
s_uuidMap.remove(m_uuid);
m_uuid = QUuid();
if (m_modified) { if (m_modified) {
emit databaseDiscarded(); emit databaseDiscarded();
} }
setEmitModified(false);
m_modified = false;
m_modifiedTimer.stop();
s_uuidMap.remove(m_uuid);
m_uuid = QUuid();
m_data.clear(); m_data.clear();
m_metadata->clear(); m_metadata->clear();
if (m_rootGroup && m_rootGroup->parent() == this) { setRootGroup(new Group());
delete m_rootGroup;
}
m_fileWatcher->stop(); m_fileWatcher->stop();
m_deletedObjects.clear(); m_deletedObjects.clear();
m_commonUsernames.clear(); m_commonUsernames.clear();
m_modified = false;
m_modifiedTimer.stop();
} }
/** /**

View file

@ -967,14 +967,7 @@ void Group::removeEntry(Entry* entry)
void Group::connectDatabaseSignalsRecursive(Database* db) void Group::connectDatabaseSignalsRecursive(Database* db)
{ {
if (m_db) { if (m_db) {
disconnect(SIGNAL(groupDataChanged(Group*)), m_db); disconnect(m_db);
disconnect(SIGNAL(groupAboutToRemove(Group*)), m_db);
disconnect(SIGNAL(groupRemoved()), m_db);
disconnect(SIGNAL(groupAboutToAdd(Group*, int)), m_db);
disconnect(SIGNAL(groupAdded()), m_db);
disconnect(SIGNAL(aboutToMove(Group*, Group*, int)), m_db);
disconnect(SIGNAL(groupMoved()), m_db);
disconnect(SIGNAL(groupModified()), m_db);
} }
for (Entry* entry : asConst(m_entries)) { for (Entry* entry : asConst(m_entries)) {

View file

@ -18,6 +18,7 @@
#include "Kdbx3Reader.h" #include "Kdbx3Reader.h"
#include "core/AsyncTask.h"
#include "core/Endian.h" #include "core/Endian.h"
#include "core/Group.h" #include "core/Group.h"
#include "crypto/CryptoHash.h" #include "crypto/CryptoHash.h"
@ -47,7 +48,8 @@ bool Kdbx3Reader::readDatabaseImpl(QIODevice* device,
return false; return false;
} }
if (!db->setKey(key, false)) { bool ok = AsyncTask::runAndWaitForFuture([&] { return db->setKey(key, false); });
if (!ok) {
raiseError(tr("Unable to calculate master key")); raiseError(tr("Unable to calculate master key"));
return false; return false;
} }

View file

@ -19,6 +19,7 @@
#include <QBuffer> #include <QBuffer>
#include "core/AsyncTask.h"
#include "core/Endian.h" #include "core/Endian.h"
#include "core/Group.h" #include "core/Group.h"
#include "crypto/CryptoHash.h" #include "crypto/CryptoHash.h"
@ -47,7 +48,8 @@ bool Kdbx4Reader::readDatabaseImpl(QIODevice* device,
return false; return false;
} }
if (!db->setKey(key, false, false)) { bool ok = AsyncTask::runAndWaitForFuture([&] { return db->setKey(key, false, false); });
if (!ok) {
raiseError(tr("Unable to calculate master key")); raiseError(tr("Unable to calculate master key"));
return false; return false;
} }