diff --git a/src/services/consistency_checks.js b/src/services/consistency_checks.js index e669b63b6..20b6c7375 100644 --- a/src/services/consistency_checks.js +++ b/src/services/consistency_checks.js @@ -8,9 +8,10 @@ const syncMutexService = require('./sync_mutex'); const repository = require('./repository'); const cls = require('./cls'); const syncTableService = require('./sync_table'); +const optionsService = require('./options'); const Branch = require('../entities/branch'); -let unrecoverableConsistencyErrors = false; +let unrecoveredConsistencyErrors = false; let fixedIssues = false; async function findIssues(query, errorCb) { @@ -19,7 +20,7 @@ async function findIssues(query, errorCb) { for (const res of results) { logError(errorCb(res)); - unrecoverableConsistencyErrors = true; + unrecoveredConsistencyErrors = true; } return results; @@ -29,9 +30,14 @@ async function findAndFixIssues(query, fixerCb) { const results = await sql.getRows(query); for (const res of results) { - await fixerCb(res); + if (await optionsService.getOptionInt('autoFixConsistencyIssues')) { + await fixerCb(res); - fixedIssues = true; + fixedIssues = true; + } + else { + unrecoveredConsistencyErrors = true; + } } return results; @@ -57,7 +63,7 @@ async function checkTreeCycles() { if (!childToParents[noteId] || childToParents[noteId].length === 0) { logError(`No parents found for note ${noteId}`); - unrecoverableConsistencyErrors = true; + unrecoveredConsistencyErrors = true; return; } @@ -65,7 +71,7 @@ async function checkTreeCycles() { if (path.includes(parentNoteId)) { logError(`Tree cycle detected at parent-child relationship: ${parentNoteId} - ${noteId}, whole path: ${path}`); - unrecoverableConsistencyErrors = true; + unrecoveredConsistencyErrors = true; } else { const newPath = path.slice(); @@ -84,7 +90,7 @@ async function checkTreeCycles() { if (childToParents['root'].length !== 1 || childToParents['root'][0] !== 'none') { logError('Incorrect root parent: ' + JSON.stringify(childToParents['root'])); - unrecoverableConsistencyErrors = true; + unrecoveredConsistencyErrors = true; } } @@ -366,7 +372,7 @@ async function findSyncRowsIssues() { } async function runAllChecks() { - unrecoverableConsistencyErrors = false; + unrecoveredConsistencyErrors = false; fixedIssues = false; await findBrokenReferenceIssues(); @@ -377,13 +383,13 @@ async function runAllChecks() { await findSyncRowsIssues(); - if (unrecoverableConsistencyErrors) { + if (unrecoveredConsistencyErrors) { // we run this only if basic checks passed since this assumes basic data consistency await checkTreeCycles(); } - return !unrecoverableConsistencyErrors; + return !unrecoveredConsistencyErrors; } async function runChecks() { @@ -401,7 +407,7 @@ async function runChecks() { ws.refreshTree(); } - if (unrecoverableConsistencyErrors) { + if (unrecoveredConsistencyErrors) { log.info(`Consistency checks failed (took ${elapsedTimeMs}ms)`); ws.sendMessageToAllClients({type: 'consistency-checks-failed'}); diff --git a/src/services/options.js b/src/services/options.js index 31ec697de..ed5d2b1c3 100644 --- a/src/services/options.js +++ b/src/services/options.js @@ -10,6 +10,9 @@ async function getOption(name) { return option.value; } +/** + * @return {Promise} + */ async function getOptionInt(name) { const val = await getOption(name); @@ -22,6 +25,19 @@ async function getOptionInt(name) { return intVal; } +/** + * @return {Promise} + */ +async function getOptionBool(name) { + const val = await getOption(name); + + if (!['true', 'false'].includes(val)) { + throw new Error(`Could not parse "${val}" into boolean for option "${name}"`); + } + + return val === 'true'; +} + async function setOption(name, value) { const option = await require('./repository').getOption(name); @@ -64,6 +80,7 @@ async function getOptionsMap(allowedOptions) { module.exports = { getOption, getOptionInt, + getOptionBool, setOption, createOption, getOptions, diff --git a/src/services/options_init.js b/src/services/options_init.js index 63d2fc102..2fc6472a8 100644 --- a/src/services/options_init.js +++ b/src/services/options_init.js @@ -78,7 +78,8 @@ const defaultOptions = [ { name: 'spellCheckLanguageCode', value: 'en-US', isSynced: false }, { name: 'hideTabRowForOneTab', value: 'false', isSynced: false }, { name: 'imageMaxWidthHeight', value: '1200', isSynced: true }, - { name: 'imageJpegQuality', value: '75', isSynced: true } + { name: 'imageJpegQuality', value: '75', isSynced: true }, + { name: 'autoFixConsistencyIssues', value: 'true', isSynced: false } ]; async function initStartupOptions() {