diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 69c5fd8e8..caa742fa5 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -6,9 +6,6 @@ true org.sqlite.JDBC jdbc:sqlite:$PROJECT_DIR$/../trilium-data/document.db - - - \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c34def86c..6eec5f662 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "trilium", - "version": "0.40.2", + "version": "0.40.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/services/consistency_checks.js b/src/services/consistency_checks.js index 2a2911b3f..871706a11 100644 --- a/src/services/consistency_checks.js +++ b/src/services/consistency_checks.js @@ -323,14 +323,25 @@ class ConsistencyChecks { WHERE isErased = 1 AND content IS NOT NULL`, async ({noteId}) => { - if (this.autoFix) { - await sql.execute(`UPDATE note_contents SET content = NULL WHERE noteId = ?`, [noteId]); - logFix(`Note ${noteId} content has been set to null since the note is erased`); - } - else { - logError(`Note ${noteId} content is not null even though the note is erased`); - } + // we always fix this issue because there does not seem to be a good way to prevent it. + // Scenario in which this can happen: + // 1. user on instance A deletes the note (sync for notes is created, but not for note_contents) and is later erased + // 2. instance B gets synced from instance A, note is updated because of sync row for notes, + // but note_contents is not because erasion does not create sync rows + // 3. therefore note.isErased = true, but note_contents.content remains not updated and not erased. + // + // Considered solutions: + // - don't sync erased notes - this might prevent syncing also of the isDeleted flag and note would continue + // to exist on the other instance + // - create sync rows for erased event - this would be a problem for undeletion since erasion might happen + // on one instance after undelete and thus would win even though there's no user action behind it + // + // So instead we just fix such cases afterwards here. + + await sql.execute(`UPDATE note_contents SET content = NULL WHERE noteId = ?`, [noteId]); + + logFix(`Note ${noteId} content has been set to null since the note is erased`); }); await this.findAndFixIssues(` @@ -547,23 +558,23 @@ class ConsistencyChecks { }); await this.findAndFixIssues(` - SELECT - id, entityId - FROM - sync - LEFT JOIN ${entityName} ON entityId = ${key} - WHERE - sync.entityName = '${entityName}' - AND ${key} IS NULL`, - async ({id, entityId}) => { - if (this.autoFix) { - await sql.execute("DELETE FROM sync WHERE entityName = ? AND entityId = ?", [entityName, entityId]); + SELECT + id, entityId + FROM + sync + LEFT JOIN ${entityName} ON entityId = ${key} + WHERE + sync.entityName = '${entityName}' + AND ${key} IS NULL`, + async ({id, entityId}) => { + if (this.autoFix) { + await sql.execute("DELETE FROM sync WHERE entityName = ? AND entityId = ?", [entityName, entityId]); - logFix(`Deleted extra sync record id=${id}, entityName=${entityName}, entityId=${entityId}`); - } else { - logError(`Unrecognized sync record id=${id}, entityName=${entityName}, entityId=${entityId}`); - } - }); + logFix(`Deleted extra sync record id=${id}, entityName=${entityName}, entityId=${entityId}`); + } else { + logError(`Unrecognized sync record id=${id}, entityName=${entityName}, entityId=${entityId}`); + } + }); } async findSyncRowsIssues() { diff --git a/src/services/notes.js b/src/services/notes.js index ffafb4bb6..068ad0536 100644 --- a/src/services/notes.js +++ b/src/services/notes.js @@ -599,6 +599,7 @@ async function eraseDeletedNotes() { UPDATE notes SET title = '[deleted]', contentLength = 0, + isProtected = 0, isErased = 1 WHERE noteId IN (???)`, noteIdsToErase);