From 0607c25f3e6906707d1464306cee047fdd755294 Mon Sep 17 00:00:00 2001 From: Mikolaj Boc Date: Wed, 9 Aug 2023 16:08:01 +0200 Subject: Make WASM IDB settings use the fallback mechanism correctly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ibb65efc0faa5ec6e6c60782747c9295e4fc5ff21 Reviewed-by: Morten Johan Sørvig --- src/corelib/io/qsettings_p.h | 3 +++ src/corelib/io/qsettings_wasm.cpp | 46 ++++++++++++++++++++++----------------- 2 files changed, 29 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h index d79c10e643..4229abd874 100644 --- a/src/corelib/io/qsettings_p.h +++ b/src/corelib/io/qsettings_p.h @@ -243,6 +243,9 @@ public: qsizetype &lineStart, qsizetype &lineLen, qsizetype &equalsPos); +protected: + const QList &getConfFiles() const { return confFiles; } + private: void initFormat(); virtual void initAccess(); diff --git a/src/corelib/io/qsettings_wasm.cpp b/src/corelib/io/qsettings_wasm.cpp index 960938fb25..7d80ff82d3 100644 --- a/src/corelib/io/qsettings_wasm.cpp +++ b/src/corelib/io/qsettings_wasm.cpp @@ -238,10 +238,11 @@ public: void clear() override; void sync() override; - void flush() override; private: bool writeSettingsToTemporaryFile(const QString &fileName, void *dataPtr, int size); + void loadIndexedDBFiles(); + QString databaseName; QString id; @@ -264,22 +265,7 @@ QWasmIDBSettingsPrivate::QWasmIDBSettingsPrivate(QSettings::Scope scope, databaseName = organization; id = application; - int exists = 0; - int error = 0; - emscripten_idb_exists(DbName, fileName().toLocal8Bit(), &exists, &error); - if (error) { - setStatus(QSettings::AccessError); - return; - } - if (exists) { - void *contents; - int size; - emscripten_idb_load(DbName, fileName().toLocal8Bit(), &contents, &size, &error); - if (error || !writeSettingsToTemporaryFile(fileName(), contents, size)) { - setStatus(QSettings::AccessError); - return; - } - } + loadIndexedDBFiles(); QConfFileSettingsPrivate::initAccess(); } @@ -288,7 +274,6 @@ QWasmIDBSettingsPrivate::~QWasmIDBSettingsPrivate() = default; bool QWasmIDBSettingsPrivate::writeSettingsToTemporaryFile(const QString &fileName, void *dataPtr, int size) - { QFile file(fileName); QFileInfo fileInfo(fileName); @@ -313,6 +298,10 @@ void QWasmIDBSettingsPrivate::clear() void QWasmIDBSettingsPrivate::sync() { + // Reload the files, in case there were any changes in IndexedDB, and flush them to disk. + // Thanks to this, QConfFileSettingsPrivate::sync will handle key merging correctly. + loadIndexedDBFiles(); + QConfFileSettingsPrivate::sync(); QFile file(fileName()); @@ -327,9 +316,26 @@ void QWasmIDBSettingsPrivate::sync() } } -void QWasmIDBSettingsPrivate::flush() +void QWasmIDBSettingsPrivate::loadIndexedDBFiles() { - sync(); + for (const auto *confFile : getConfFiles()) { + int exists = 0; + int error = 0; + emscripten_idb_exists(DbName, confFile->name.toLocal8Bit(), &exists, &error); + if (error) { + setStatus(QSettings::AccessError); + return; + } + if (exists) { + void *contents; + int size; + emscripten_idb_load(DbName, confFile->name.toLocal8Bit(), &contents, &size, &error); + if (error || !writeSettingsToTemporaryFile(confFile->name, contents, size)) { + setStatus(QSettings::AccessError); + return; + } + } + } } QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format, QSettings::Scope scope, -- cgit v1.2.3