From 18749092ffdfe8e80bb960e302c67601e38a3534 Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 2 Jul 2020 22:57:17 +0200 Subject: [PATCH] sql_init/migration fixes --- db/demo.zip | Bin 820717 -> 820675 bytes db/migrations/0161__drop_source_ids.sql | 1 + db/schema.sql | 7 ---- src/services/app_info.js | 2 +- src/services/backup.js | 10 ++---- src/services/migration.js | 37 ++++++++++++++++---- src/services/source_id.js | 43 +++--------------------- src/services/sql_init.js | 42 ++++++----------------- src/services/sync.js | 2 +- 9 files changed, 51 insertions(+), 93 deletions(-) create mode 100644 db/migrations/0161__drop_source_ids.sql diff --git a/db/demo.zip b/db/demo.zip index 1965708ab1469356c1c0fa7f77474a59086f6293..8d9dba14d9c9fa9e25ed3dc1105e3883bab9cab8 100644 GIT binary patch delta 22211 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 delta 21979 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 { - setInterval(cls.wrap(regularBackup), 4 * 60 * 60 * 1000); - - // kickoff first backup soon after start up - setTimeout(cls.wrap(regularBackup), 5 * 60 * 1000); -}); - module.exports = { backupNow, - anonymize + anonymize, + regularBackup }; diff --git a/src/services/migration.js b/src/services/migration.js index be84464d2..4ad904594 100644 --- a/src/services/migration.js +++ b/src/services/migration.js @@ -5,12 +5,13 @@ const fs = require('fs-extra'); const log = require('./log'); const utils = require('./utils'); const resourceDir = require('./resource_dir'); +const appInfo = require('./app_info'); -function migrate() { +async function migrate() { const migrations = []; // backup before attempting migration - backupService.backupNow("before-migration"); + await backupService.backupNow("before-migration"); const currentDbVersion = parseInt(optionService.getOption('dbVersion')); @@ -73,14 +74,38 @@ function migrate() { utils.crash(); } } +} - const sqlInit = require('./sql_init'); +function getDbVersion() { + return parseInt(sql.getValue("SELECT value FROM options WHERE name = 'dbVersion'")); +} - if (sqlInit.isDbUpToDate()) { - sqlInit.initDbConnection(); +function isDbUpToDate() { + const dbVersion = getDbVersion(); + + const upToDate = dbVersion >= appInfo.dbVersion; + + if (!upToDate) { + log.info("App db version is " + appInfo.dbVersion + ", while db version is " + dbVersion + ". Migration needed."); + } + + return upToDate; +} + +async function migrateIfNecessary() { + const currentDbVersion = getDbVersion(); + + if (currentDbVersion > appInfo.dbVersion) { + log.error(`Current DB version ${currentDbVersion} is newer than app db version ${appInfo.dbVersion} which means that it was created by newer and incompatible version of Trilium. Upgrade to latest version of Trilium to resolve this issue.`); + + utils.crash(); + } + + if (!isDbUpToDate()) { + await migrate(); } } module.exports = { - migrate + migrateIfNecessary }; diff --git a/src/services/source_id.js b/src/services/source_id.js index bdffb92e9..f5917da8e 100644 --- a/src/services/source_id.js +++ b/src/services/source_id.js @@ -1,53 +1,20 @@ const utils = require('./utils'); -const dateUtils = require('./date_utils'); -const log = require('./log'); -const sql = require('./sql'); -const sqlInit = require('./sql_init'); -const cls = require('./cls'); -function saveSourceId(sourceId) { - sql.insert("source_ids", { - sourceId: sourceId, - utcDateCreated: dateUtils.utcNowDateTime() - }); - - refreshSourceIds(); -} - -function createSourceId() { - const sourceId = utils.randomString(12); - - log.info("Generated sourceId=" + sourceId); - return sourceId; -} +const localSourceIds = {}; function generateSourceId() { - const sourceId = createSourceId(); + const sourceId = utils.randomString(12); - saveSourceId(sourceId); + localSourceIds[sourceId] = true; return sourceId; } -function refreshSourceIds() { - const sourceIdsArr = sql.getColumn("SELECT sourceId FROM source_ids ORDER BY utcDateCreated DESC"); - - allSourceIds = {}; - - for (const sourceId of sourceIdsArr) { - allSourceIds[sourceId] = true; - } -} - -let allSourceIds = {}; - function isLocalSourceId(srcId) { - return !!allSourceIds[srcId]; + return !!localSourceIds[srcId]; } -const currentSourceId = createSourceId(); - -sqlInit.dbReady.then(cls.wrap(() => saveSourceId(currentSourceId))); +const currentSourceId = generateSourceId(); function getCurrentSourceId() { return currentSourceId; diff --git a/src/services/sql_init.js b/src/services/sql_init.js index 7a734a5e0..46675f6a9 100644 --- a/src/services/sql_init.js +++ b/src/services/sql_init.js @@ -8,6 +8,7 @@ const optionService = require('./options'); const port = require('./port'); const Option = require('../entities/option'); const TaskContext = require('./task_context.js'); +const migrationService = require('./migration'); const dbReady = utils.deferred(); @@ -28,27 +29,14 @@ function isDbInitialized() { return initialized === 'true'; } -function initDbConnection() { +async function initDbConnection() { if (!isDbInitialized()) { log.info(`DB not initialized, please visit setup page` + (utils.isElectron() ? '' : ` - http://[your-server-host]:${port} to see instructions on how to initialize Trilium.`)); return; } - const currentDbVersion = getDbVersion(); - - if (currentDbVersion > appInfo.dbVersion) { - log.error(`Current DB version ${currentDbVersion} is newer than app db version ${appInfo.dbVersion} which means that it was created by newer and incompatible version of Trilium. Upgrade to latest version of Trilium to resolve this issue.`); - - utils.crash(); - } - - if (!isDbUpToDate()) { - // avoiding circular dependency - const migrationService = require('./migration'); - - migrationService.migrate(); - } + await migrationService.migrateIfNecessary(); require('./options_init').initStartupOptions(); @@ -136,22 +124,6 @@ function createDatabaseForSync(options, syncServerHost = '', syncProxy = '') { log.info("Schema and not synced options generated."); } -function getDbVersion() { - return parseInt(sql.getValue("SELECT value FROM options WHERE name = 'dbVersion'")); -} - -function isDbUpToDate() { - const dbVersion = getDbVersion(); - - const upToDate = dbVersion >= appInfo.dbVersion; - - if (!upToDate) { - log.info("App db version is " + appInfo.dbVersion + ", while db version is " + dbVersion + ". Migration needed."); - } - - return upToDate; -} - function setDbAsInitialized() { if (!isDbInitialized()) { optionService.setOption('initialized', 'true'); @@ -160,6 +132,13 @@ function setDbAsInitialized() { } } +dbReady.then(() => { + setInterval(() => require('./backup').regularBackup(), 4 * 60 * 60 * 1000); + + // kickoff first backup soon after start up + setTimeout(() => require('./backup').regularBackup(), 5 * 60 * 1000); +}); + log.info("DB size: " + sql.getValue("SELECT page_count * page_size / 1000 as size FROM pragma_page_count(), pragma_page_size()") + " KB"); module.exports = { @@ -167,7 +146,6 @@ module.exports = { schemaExists, isDbInitialized, initDbConnection, - isDbUpToDate, createInitialDatabase, createDatabaseForSync, setDbAsInitialized diff --git a/src/services/sync.js b/src/services/sync.js index 376fd7aec..ee8b5ac5a 100644 --- a/src/services/sync.js +++ b/src/services/sync.js @@ -104,7 +104,7 @@ async function doLogin() { }); if (sourceIdService.isLocalSourceId(resp.sourceId)) { - throw new Error(`Sync server has source ID ${resp.sourceId} which is also local. Try restarting sync server.`); + throw new Error(`Sync server has source ID ${resp.sourceId} which is also local. Your sync setup is probably trying to connect to itself.`); } syncContext.sourceId = resp.sourceId;