From c8ba07a4aecc45b5ce017a116da5d1cdbded167d Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 23 Nov 2019 11:13:57 +0100 Subject: [PATCH 1/2] fix migration script in case of not fully consistent database (missing note_contents for note). closes #717 --- db/migrations/0152__add_contentLength_to_note.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrations/0152__add_contentLength_to_note.sql b/db/migrations/0152__add_contentLength_to_note.sql index 4d4cf0c8c..60e38df86 100644 --- a/db/migrations/0152__add_contentLength_to_note.sql +++ b/db/migrations/0152__add_contentLength_to_note.sql @@ -20,7 +20,7 @@ SELECT noteId, title, -1, isProtected, type, mime, hash, isDeleted, isErased, da DROP TABLE notes; ALTER TABLE notes_mig RENAME TO notes; -UPDATE notes SET contentLength = (SELECT COALESCE(LENGTH(content), 0) FROM note_contents WHERE note_contents.noteId = notes.noteId); +UPDATE notes SET contentLength = COALESCE((SELECT COALESCE(LENGTH(content), 0) FROM note_contents WHERE note_contents.noteId = notes.noteId), -1); CREATE INDEX `IDX_notes_isDeleted` ON `notes` (`isDeleted`); CREATE INDEX `IDX_notes_title` ON `notes` (`title`); From 434d8ef48c3db56cf8846c77e6e8934ce1eba4b7 Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 23 Nov 2019 19:56:52 +0100 Subject: [PATCH 2/2] added extra autofixers for completely missing note_contents or note_revision_contents row --- src/services/consistency_checks.js | 39 ++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/services/consistency_checks.js b/src/services/consistency_checks.js index d0c2dfc73..a8f81bd31 100644 --- a/src/services/consistency_checks.js +++ b/src/services/consistency_checks.js @@ -311,6 +311,25 @@ async function findLogicIssues() { } }); + await findAndFixIssues(` + SELECT notes.noteId + FROM notes + LEFT JOIN note_contents USING(noteId) + WHERE + note_contents.noteId IS NULL`, + async ({noteId}, autoFix) => { + if (autoFix) { + const note = await repository.getNote(noteId); + // empty string might be wrong choice for some note types (and protected notes) but it's a best guess + await note.setContent(note.isErased ? null : ''); + + logFix(`Note ${noteId} content was set to empty string since there was no corresponding row`); + } + else { + logError(`Note ${noteId} content row does not exist`); + } + }); + await findAndFixIssues(` SELECT noteId FROM notes @@ -321,6 +340,7 @@ async function findLogicIssues() { async ({noteId}, autoFix) => { if (autoFix) { const note = await repository.getNote(noteId); + // empty string might be wrong choice for some note types (and protected notes) but it's a best guess await note.setContent(''); logFix(`Note ${noteId} content was set to empty string since it was null even though it is not deleted`); @@ -360,6 +380,25 @@ async function findLogicIssues() { } }); + await findAndFixIssues(` + SELECT note_revisions.noteRevisionId + FROM note_revisions + LEFT JOIN note_revision_contents USING(noteRevisionId) + WHERE note_revision_contents.noteRevisionId IS NULL`, + async ({noteRevisionId}, autoFix) => { + if (autoFix) { + const noteRevision = await repository.getNoteRevision(noteRevisionId); + await noteRevision.setContent(null); + noteRevision.isErased = true; + await noteRevision.save(); + + logFix(`Note revision content ${noteRevisionId} was created and set to erased since it did not exist.`); + } + else { + logError(`Note revision content ${noteRevisionId} does not exist`); + } + }); + await findAndFixIssues(` SELECT noteRevisionId FROM note_revisions