diff options
author | Mikolaj Boc <mikolaj.boc@qt.io> | 2023-08-09 16:08:01 +0200 |
---|---|---|
committer | Piotr Wierciński <piotr.wiercinski@qt.io> | 2023-10-18 19:01:45 +0200 |
commit | 0607c25f3e6906707d1464306cee047fdd755294 (patch) | |
tree | 9379ee5cc3fca2efec8718b6cfc43437fc6e765f /src | |
parent | 8a6a9295ebd3409b1b818c6e04dc210ca93e51c0 (diff) |
Make WASM IDB settings use the fallback mechanism correctly
Change-Id: Ibb65efc0faa5ec6e6c60782747c9295e4fc5ff21
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/io/qsettings_p.h | 3 | ||||
-rw-r--r-- | src/corelib/io/qsettings_wasm.cpp | 46 |
2 files changed, 29 insertions, 20 deletions
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<QConfFile *> &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, |