From 56378cd0f51499a434437113d571d7263d3dd37d Mon Sep 17 00:00:00 2001 From: zadam Date: Sun, 30 May 2021 22:03:41 +0200 Subject: [PATCH] reorder database initialization so that all critical sections are in the same transaction, #1985 --- src/services/options_init.js | 6 +++--- src/services/sql_init.js | 27 +++++++++++++++++++-------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/services/options_init.js b/src/services/options_init.js index 81ac7b53c..e7a55cff2 100644 --- a/src/services/options_init.js +++ b/src/services/options_init.js @@ -27,10 +27,10 @@ function initSyncedOptions(username, password) { passwordEncryptionService.setDataKey(password, utils.randomSecureToken(16), true); } -function initNotSyncedOptions(initialized, startNotePath = 'root', opts = {}) { +function initNotSyncedOptions(initialized, opts = {}) { optionService.createOption('openTabs', JSON.stringify([ { - notePath: startNotePath, + notePath: 'root', active: true } ]), false); @@ -98,7 +98,7 @@ function initStartupOptions() { if (!(name in optionsMap)) { optionService.createOption(name, value, isSynced); - log.info(`Created missing option "${name}" with default value "${value}"`); + log.info(`Created option "${name}" with default value "${value}"`); } } diff --git a/src/services/sql_init.js b/src/services/sql_init.js index f97a8edb0..b71042286 100644 --- a/src/services/sql_init.js +++ b/src/services/sql_init.js @@ -82,6 +82,13 @@ async function createInitialDatabase(username, password, theme) { isExpanded: true, notePosition: 10 }).save(); + + const optionsInitService = require('./options_init'); + + optionsInitService.initDocumentOptions(); + optionsInitService.initSyncedOptions(username, password); + optionsInitService.initNotSyncedOptions(true, { theme }); + optionsInitService.initStartupOptions(); }); log.info("Importing demo content ..."); @@ -91,16 +98,20 @@ async function createInitialDatabase(username, password, theme) { const zipImportService = require("./import/zip"); await zipImportService.importZip(dummyTaskContext, demoFile, rootNote); - log.info("Initializing options ..."); - sql.transactional(() => { + // this needs to happen after ZIP import + // previous solution was to move option initialization here but then the important parts of initialization + // are not all in one transaction (because ZIP import is async and thus not transactional) + const startNoteId = sql.getValue("SELECT noteId FROM branches WHERE parentNoteId = 'root' AND isDeleted = 0 ORDER BY notePosition"); - const optionsInitService = require('./options_init'); - - optionsInitService.initDocumentOptions(); - optionsInitService.initSyncedOptions(username, password); - optionsInitService.initNotSyncedOptions(true, startNoteId, { theme }); + const optionService = require("./options"); + optionService.setOption('openTabs', JSON.stringify([ + { + notePath: startNoteId, + active: true + } + ])); }); log.info("Schema and initial content generated."); @@ -120,7 +131,7 @@ function createDatabaseForSync(options, syncServerHost = '', syncProxy = '') { sql.transactional(() => { sql.executeScript(schema); - require('./options_init').initNotSyncedOptions(false, 'root', { syncServerHost, syncProxy }); + require('./options_init').initNotSyncedOptions(false, { syncServerHost, syncProxy }); // document options required for sync to kick off for (const opt of options) {