From c0eaed863025543bd36268df7b588576d5696dd1 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 21 Feb 2014 15:43:49 +0100 Subject: [PATCH] Improve performance of writing settings By wrapping related ones in a single transaction, instead of (implicitly) doing a transaction per settings value that is written. Task-number: QTCREATORBUG-11524 Change-Id: I28e06c9d6cd4ebad024f9c277796abb37df5f992 Reviewed-by: hjk Reviewed-by: Joerg Bornemann --- .../coreplugin/editormanager/editormanager.cpp | 2 ++ src/plugins/coreplugin/locator/locator.cpp | 2 ++ src/plugins/coreplugin/settingsdatabase.cpp | 14 ++++++++++++++ src/plugins/coreplugin/settingsdatabase.h | 3 +++ src/plugins/updateinfo/updateinfoplugin.cpp | 2 ++ 5 files changed, 23 insertions(+) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 146c8367189..fa7d79fecff 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -2287,10 +2287,12 @@ static const char autoSaveIntervalKey[] = "EditorManager/AutoSaveInterval"; void EditorManager::saveSettings() { SettingsDatabase *settings = ICore::settingsDatabase(); + settings->beginTransaction(); settings->setValue(QLatin1String(documentStatesKey), d->m_editorStates); settings->setValue(QLatin1String(reloadBehaviorKey), d->m_reloadSetting); settings->setValue(QLatin1String(autoSaveEnabledKey), d->m_autoSaveEnabled); settings->setValue(QLatin1String(autoSaveIntervalKey), d->m_autoSaveInterval); + settings->endTransaction(); } void EditorManager::readSettings() diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index 4b644e94942..7e2a423f1ca 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -186,6 +186,7 @@ void Locator::saveSettings() { if (m_settingsInitialized) { SettingsDatabase *s = ICore::settingsDatabase(); + s->beginTransaction(); s->beginGroup(QLatin1String("QuickOpen")); s->remove(QString()); s->setValue(QLatin1String("RefreshInterval"), refreshInterval()); @@ -202,6 +203,7 @@ void Locator::saveSettings() } s->endGroup(); s->endGroup(); + s->endTransaction(); } } diff --git a/src/plugins/coreplugin/settingsdatabase.cpp b/src/plugins/coreplugin/settingsdatabase.cpp index 4f68fcbe76e..efa10da44c7 100644 --- a/src/plugins/coreplugin/settingsdatabase.cpp +++ b/src/plugins/coreplugin/settingsdatabase.cpp @@ -252,6 +252,20 @@ QStringList SettingsDatabase::childKeys() const return children; } +void SettingsDatabase::beginTransaction() +{ + if (!d->m_db.isOpen()) + return; + d->m_db.exec(QLatin1String("BEGIN TRANSACTION;")); +} + +void SettingsDatabase::endTransaction() +{ + if (!d->m_db.isOpen()) + return; + d->m_db.exec(QLatin1String("END TRANSACTION;")); +} + void SettingsDatabase::sync() { // TODO: Delay writing of dirty keys and save them here diff --git a/src/plugins/coreplugin/settingsdatabase.h b/src/plugins/coreplugin/settingsdatabase.h index 71c81adf650..dd03d7d8ae2 100644 --- a/src/plugins/coreplugin/settingsdatabase.h +++ b/src/plugins/coreplugin/settingsdatabase.h @@ -57,6 +57,9 @@ public: QString group() const; QStringList childKeys() const; + void beginTransaction(); + void endTransaction(); + void sync(); private: diff --git a/src/plugins/updateinfo/updateinfoplugin.cpp b/src/plugins/updateinfo/updateinfoplugin.cpp index d52b042d1b9..2ae25aef5a6 100644 --- a/src/plugins/updateinfo/updateinfoplugin.cpp +++ b/src/plugins/updateinfo/updateinfoplugin.cpp @@ -150,6 +150,7 @@ void UpdateInfoPlugin::saveSettings() { SettingsDatabase *settings = ICore::settingsDatabase(); if (settings) { + settings->beginTransaction(); settings->beginGroup(QLatin1String("Updater")); settings->setValue(QLatin1String("Application"), d->updaterProgram); settings->setValue(QLatin1String("LastDayChecked"), d->m_lastDayChecked); @@ -157,6 +158,7 @@ void UpdateInfoPlugin::saveSettings() settings->setValue(QLatin1String("CheckOnlyArgument"), d->updaterCheckOnlyArgument); settings->setValue(QLatin1String("ScheduledUpdateTime"), d->m_scheduledUpdateTime); settings->endGroup(); + settings->endTransaction(); } }