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);