diff --git a/db/migrations/0173__move_hash_to_entity_changes.sql b/db/migrations/0173__move_hash_to_entity_changes.sql index e69de29bb..559166f73 100644 --- a/db/migrations/0173__move_hash_to_entity_changes.sql +++ b/db/migrations/0173__move_hash_to_entity_changes.sql @@ -0,0 +1,194 @@ +CREATE TABLE IF NOT EXISTS "mig_entity_changes" ( + `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + `entityName` TEXT NOT NULL, + `entityId` TEXT NOT NULL, + `hash` TEXT NOT NULL, + `sourceId` TEXT NOT NULL, + `isSynced` INTEGER NOT NULL); + +INSERT INTO mig_entity_changes (entityName, entityId, hash, sourceId, isSynced) + SELECT entityName, entityId, '', sourceId, isSynced FROM entity_changes; + +UPDATE mig_entity_changes SET hash = (SELECT hash FROM api_tokens WHERE apiTokenId = entityId) WHERE entityName = 'api_tokens'; +UPDATE mig_entity_changes SET hash = (SELECT hash FROM attributes WHERE attributeId = entityId) WHERE entityName = 'attributes'; +UPDATE mig_entity_changes SET hash = (SELECT hash FROM branches WHERE branchId = entityId) WHERE entityName = 'branches'; +UPDATE mig_entity_changes SET hash = (SELECT hash FROM notes WHERE noteId = entityId) WHERE entityName = 'notes'; +UPDATE mig_entity_changes SET hash = (SELECT hash FROM note_contents WHERE noteId = entityId) WHERE entityName = 'note_contents'; +UPDATE mig_entity_changes SET hash = (SELECT hash FROM note_revisions WHERE noteRevisionId = entityId) WHERE entityName = 'note_revisions'; +UPDATE mig_entity_changes SET hash = (SELECT hash FROM note_revision_contents WHERE noteRevisionId = entityId) WHERE entityName = 'note_revision_contents'; +UPDATE mig_entity_changes SET hash = (SELECT hash FROM options WHERE name = entityId) WHERE entityName = 'options'; +UPDATE mig_entity_changes SET hash = (SELECT hash FROM recent_notes WHERE noteId = entityId) WHERE entityName = 'recent_notes'; + +DROP TABLE entity_changes; +ALTER TABLE mig_entity_changes RENAME TO entity_changes; + +CREATE UNIQUE INDEX `IDX_entityChanges_entityName_entityId` ON "entity_changes" ( + `entityName`, + `entityId` + ); + +CREATE TABLE IF NOT EXISTS "mig_api_tokens" +( + apiTokenId TEXT PRIMARY KEY NOT NULL, + token TEXT NOT NULL, + utcDateCreated TEXT NOT NULL, + isDeleted INT NOT NULL DEFAULT 0); + +INSERT INTO mig_api_tokens (apiTokenId, token, utcDateCreated, isDeleted) +SELECT apiTokenId, token, utcDateCreated, isDeleted FROM api_tokens; + +CREATE TABLE IF NOT EXISTS "mig_attributes" +( + attributeId TEXT not null primary key, + noteId TEXT not null, + type TEXT not null, + name TEXT not null, + value TEXT default '' not null, + position INT default 0 not null, + utcDateCreated TEXT not null, + utcDateModified TEXT not null, + isDeleted INT not null, + `deleteId` TEXT DEFAULT NULL, + isInheritable int DEFAULT 0 NULL); + +INSERT INTO mig_attributes (attributeId, noteId, type, name, value, position, utcDateCreated, utcDateModified, isDeleted, deleteId, isInheritable) +SELECT attributeId, noteId, type, name, value, position, utcDateCreated, utcDateModified, isDeleted, deleteId, isInheritable FROM attributes; + +DROP TABLE attributes; +ALTER TABLE mig_attributes RENAME TO attributes; + +CREATE INDEX IDX_attributes_name_value + on attributes (name, value); +CREATE INDEX IDX_attributes_noteId_index + on attributes (noteId); +CREATE INDEX IDX_attributes_value_index + on attributes (value); + +CREATE TABLE IF NOT EXISTS "mig_branches" ( + `branchId` TEXT NOT NULL, + `noteId` TEXT NOT NULL, + `parentNoteId` TEXT NOT NULL, + `notePosition` INTEGER NOT NULL, + `prefix` TEXT, + `isExpanded` INTEGER NOT NULL DEFAULT 0, + `isDeleted` INTEGER NOT NULL DEFAULT 0, + `deleteId` TEXT DEFAULT NULL, + `utcDateModified` TEXT NOT NULL, + utcDateCreated TEXT NOT NULL, + PRIMARY KEY(`branchId`)); + +INSERT INTO mig_branches (branchId, noteId, parentNoteId, notePosition, prefix, isExpanded, isDeleted, deleteId, utcDateModified, utcDateCreated) +SELECT branchId, noteId, parentNoteId, notePosition, prefix, isExpanded, isDeleted, deleteId, utcDateModified, utcDateCreated FROM branches; + +DROP TABLE branches; +ALTER TABLE mig_branches RENAME TO branches; + +CREATE INDEX `IDX_branches_noteId_parentNoteId` ON `branches` (`noteId`,`parentNoteId`); +CREATE INDEX IDX_branches_parentNoteId ON branches (parentNoteId); + +CREATE TABLE IF NOT EXISTS "mig_notes" ( + `noteId` TEXT NOT NULL, + `title` TEXT NOT NULL DEFAULT "note", + `isProtected` INT NOT NULL DEFAULT 0, + `type` TEXT NOT NULL DEFAULT 'text', + `mime` TEXT NOT NULL DEFAULT 'text/html', + `isDeleted` INT NOT NULL DEFAULT 0, + `deleteId` TEXT DEFAULT NULL, + `isErased` INT NOT NULL DEFAULT 0, + `dateCreated` TEXT NOT NULL, + `dateModified` TEXT NOT NULL, + `utcDateCreated` TEXT NOT NULL, + `utcDateModified` TEXT NOT NULL, + PRIMARY KEY(`noteId`)); + +INSERT INTO mig_notes (noteId, title, isProtected, type, mime, isDeleted, deleteId, isErased, dateCreated, dateModified, utcDateCreated, utcDateModified) +SELECT noteId, title, isProtected, type, mime, isDeleted, deleteId, isErased, dateCreated, dateModified, utcDateCreated, utcDateModified FROM notes; + +DROP TABLE notes; +ALTER TABLE mig_notes RENAME TO notes; + +CREATE INDEX `IDX_notes_isDeleted` ON `notes` (`isDeleted`); +CREATE INDEX `IDX_notes_title` ON `notes` (`title`); +CREATE INDEX `IDX_notes_type` ON `notes` (`type`); +CREATE INDEX `IDX_notes_dateCreated` ON `notes` (`dateCreated`); +CREATE INDEX `IDX_notes_dateModified` ON `notes` (`dateModified`); +CREATE INDEX `IDX_notes_utcDateModified` ON `notes` (`utcDateModified`); +CREATE INDEX `IDX_notes_utcDateCreated` ON `notes` (`utcDateCreated`); + +CREATE TABLE IF NOT EXISTS "mig_note_contents" ( + `noteId` TEXT NOT NULL, + `content` TEXT NULL DEFAULT NULL, + `dateModified` TEXT NOT NULL, + `utcDateModified` TEXT NOT NULL, + PRIMARY KEY(`noteId`) +); + +INSERT INTO mig_note_contents (noteId, content, dateModified, utcDateModified) +SELECT noteId, content, dateModified, utcDateModified FROM note_contents; + +DROP TABLE note_contents; +ALTER TABLE mig_note_contents RENAME TO note_contents; + +CREATE TABLE IF NOT EXISTS "mig_note_revisions" (`noteRevisionId` TEXT NOT NULL PRIMARY KEY, + `noteId` TEXT NOT NULL, + type TEXT DEFAULT '' NOT NULL, + mime TEXT DEFAULT '' NOT NULL, + `title` TEXT, + `isErased` INT NOT NULL DEFAULT 0, + `isProtected` INT NOT NULL DEFAULT 0, + `utcDateLastEdited` TEXT NOT NULL, + `utcDateCreated` TEXT NOT NULL, + `utcDateModified` TEXT NOT NULL, + `dateLastEdited` TEXT NOT NULL, + `dateCreated` TEXT NOT NULL); + +INSERT INTO mig_note_revisions (noteRevisionId, noteId, type, mime, title, isErased, isProtected, utcDateLastEdited, utcDateCreated, utcDateModified, dateLastEdited, dateCreated) +SELECT noteRevisionId, noteId, type, mime, title, isErased, isProtected, utcDateLastEdited, utcDateCreated, utcDateModified, dateLastEdited, dateCreated FROM note_revisions; + +DROP TABLE note_revisions; +ALTER TABLE mig_note_revisions RENAME TO note_revisions; + +CREATE INDEX `IDX_note_revisions_noteId` ON `note_revisions` (`noteId`); +CREATE INDEX `IDX_note_revisions_utcDateCreated` ON `note_revisions` (`utcDateCreated`); +CREATE INDEX `IDX_note_revisions_utcDateLastEdited` ON `note_revisions` (`utcDateLastEdited`); +CREATE INDEX `IDX_note_revisions_dateCreated` ON `note_revisions` (`dateCreated`); +CREATE INDEX `IDX_note_revisions_dateLastEdited` ON `note_revisions` (`dateLastEdited`); + +CREATE TABLE IF NOT EXISTS "mig_note_revision_contents" (`noteRevisionId` TEXT NOT NULL PRIMARY KEY, + `content` TEXT, + `utcDateModified` TEXT NOT NULL); + +INSERT INTO mig_note_revision_contents (noteRevisionId, content, utcDateModified) +SELECT noteRevisionId, content, utcDateModified FROM note_revision_contents; + +DROP TABLE note_revision_contents; +ALTER TABLE mig_note_revision_contents RENAME TO note_revision_contents; + +CREATE TABLE IF NOT EXISTS "mig_options" +( + name TEXT not null PRIMARY KEY, + value TEXT, + isSynced INTEGER default 0 not null, + utcDateCreated TEXT not null, + utcDateModified TEXT NOT NULL +); + +INSERT INTO mig_options (name, value, isSynced, utcDateCreated, utcDateModified) +SELECT name, value, isSynced, utcDateCreated, utcDateModified FROM options; + +DROP TABLE options; +ALTER TABLE mig_options RENAME TO options; + +CREATE TABLE mig_recent_notes +( + noteId TEXT not null primary key, + notePath TEXT not null, + utcDateCreated TEXT not null, + isDeleted INT NOT NULL DEFAULT 0 +); + +INSERT INTO mig_recent_notes (noteId, notePath, utcDateCreated, isDeleted) +SELECT noteId, notePath, utcDateCreated, isDeleted FROM recent_notes; + +DROP TABLE recent_notes; +ALTER TABLE mig_recent_notes RENAME TO recent_notes; diff --git a/db/schema.sql b/db/schema.sql index 5115c48ac..42dbf81fe 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -39,8 +39,6 @@ CREATE TABLE IF NOT EXISTS "branches" ( utcDateCreated TEXT NOT NULL, hash TEXT DEFAULT "" NOT NULL, PRIMARY KEY(`branchId`)); -CREATE INDEX `IDX_branches_noteId_parentNoteId` ON `branches` (`noteId`,`parentNoteId`); -CREATE INDEX IDX_branches_parentNoteId ON branches (parentNoteId); CREATE TABLE IF NOT EXISTS "attributes" ( attributeId TEXT not null primary key, @@ -55,12 +53,6 @@ CREATE TABLE IF NOT EXISTS "attributes" `deleteId` TEXT DEFAULT NULL, hash TEXT default "" not null, isInheritable int DEFAULT 0 NULL); -CREATE INDEX IDX_attributes_name_value - on attributes (name, value); -CREATE INDEX IDX_attributes_noteId_index - on attributes (noteId); -CREATE INDEX IDX_attributes_value_index - on attributes (value); CREATE TABLE IF NOT EXISTS "entity_changes" ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `entityName` TEXT NOT NULL, @@ -68,13 +60,6 @@ CREATE TABLE IF NOT EXISTS "entity_changes" ( `sourceId` TEXT NOT NULL, `isSynced` INTEGER default 0 not null, `utcChangedDate` TEXT NOT NULL); -CREATE UNIQUE INDEX `IDX_entityChanges_entityName_entityId` ON "entity_changes" ( - `entityName`, - `entityId` - ); -CREATE INDEX `IDX_entityChanges_utcChangedDate` ON "entity_changes" ( - `utcChangedDate` - ); CREATE TABLE IF NOT EXISTS "notes" ( `noteId` TEXT NOT NULL, `title` TEXT NOT NULL DEFAULT "note", @@ -90,13 +75,6 @@ CREATE TABLE IF NOT EXISTS "notes" ( `utcDateCreated` TEXT NOT NULL, `utcDateModified` TEXT NOT NULL, PRIMARY KEY(`noteId`)); -CREATE INDEX `IDX_notes_isDeleted` ON `notes` (`isDeleted`); -CREATE INDEX `IDX_notes_title` ON `notes` (`title`); -CREATE INDEX `IDX_notes_type` ON `notes` (`type`); -CREATE INDEX `IDX_notes_dateCreated` ON `notes` (`dateCreated`); -CREATE INDEX `IDX_notes_dateModified` ON `notes` (`dateModified`); -CREATE INDEX `IDX_notes_utcDateModified` ON `notes` (`utcDateModified`); -CREATE INDEX `IDX_notes_utcDateCreated` ON `notes` (`utcDateCreated`); CREATE TABLE IF NOT EXISTS "note_revisions" (`noteRevisionId` TEXT NOT NULL PRIMARY KEY, `noteId` TEXT NOT NULL, `title` TEXT, @@ -110,11 +88,6 @@ CREATE TABLE IF NOT EXISTS "note_revisions" (`noteRevisionId` TEXT NOT NULL PRIM type TEXT DEFAULT '' NOT NULL, mime TEXT DEFAULT '' NOT NULL, hash TEXT DEFAULT '' NOT NULL); -CREATE INDEX `IDX_note_revisions_noteId` ON `note_revisions` (`noteId`); -CREATE INDEX `IDX_note_revisions_utcDateCreated` ON `note_revisions` (`utcDateCreated`); -CREATE INDEX `IDX_note_revisions_utcDateLastEdited` ON `note_revisions` (`utcDateLastEdited`); -CREATE INDEX `IDX_note_revisions_dateCreated` ON `note_revisions` (`dateCreated`); -CREATE INDEX `IDX_note_revisions_dateLastEdited` ON `note_revisions` (`dateLastEdited`); CREATE TABLE IF NOT EXISTS "note_contents" ( `noteId` TEXT NOT NULL, `content` TEXT NULL DEFAULT NULL, @@ -123,3 +96,30 @@ CREATE TABLE IF NOT EXISTS "note_contents" ( `utcDateModified` TEXT NOT NULL, PRIMARY KEY(`noteId`) ); +CREATE INDEX `IDX_branches_noteId_parentNoteId` ON `branches` (`noteId`,`parentNoteId`); +CREATE INDEX IDX_branches_parentNoteId ON branches (parentNoteId); +CREATE INDEX IDX_attributes_name_value + on attributes (name, value); +CREATE INDEX IDX_attributes_noteId_index + on attributes (noteId); +CREATE INDEX IDX_attributes_value_index + on attributes (value); +CREATE UNIQUE INDEX `IDX_entityChanges_entityName_entityId` ON "entity_changes" ( + `entityName`, + `entityId` + ); +CREATE INDEX `IDX_entityChanges_utcChangedDate` ON "entity_changes" ( + `utcChangedDate` + ); +CREATE INDEX `IDX_notes_isDeleted` ON `notes` (`isDeleted`); +CREATE INDEX `IDX_notes_title` ON `notes` (`title`); +CREATE INDEX `IDX_notes_type` ON `notes` (`type`); +CREATE INDEX `IDX_notes_dateCreated` ON `notes` (`dateCreated`); +CREATE INDEX `IDX_notes_dateModified` ON `notes` (`dateModified`); +CREATE INDEX `IDX_notes_utcDateModified` ON `notes` (`utcDateModified`); +CREATE INDEX `IDX_notes_utcDateCreated` ON `notes` (`utcDateCreated`); +CREATE INDEX `IDX_note_revisions_noteId` ON `note_revisions` (`noteId`); +CREATE INDEX `IDX_note_revisions_utcDateCreated` ON `note_revisions` (`utcDateCreated`); +CREATE INDEX `IDX_note_revisions_utcDateLastEdited` ON `note_revisions` (`utcDateLastEdited`); +CREATE INDEX `IDX_note_revisions_dateCreated` ON `note_revisions` (`dateCreated`); +CREATE INDEX `IDX_note_revisions_dateLastEdited` ON `note_revisions` (`dateLastEdited`); diff --git a/src/entities/note.js b/src/entities/note.js index 840c0d7d7..0bad7c1c8 100644 --- a/src/entities/note.js +++ b/src/entities/note.js @@ -70,9 +70,9 @@ class Note extends Entity { /** @returns {*} */ getContent(silentNotFoundError = false) { if (this.content === undefined) { - const res = sql.getRow(`SELECT content, hash FROM note_contents WHERE noteId = ?`, [this.noteId]); + const content = sql.getValue(`SELECT content FROM note_contents WHERE noteId = ?`, [this.noteId]); - if (!res) { + if (!content) { if (silentNotFoundError) { return undefined; } @@ -81,7 +81,7 @@ class Note extends Entity { } } - this.content = res.content; + this.content = content; if (this.isProtected) { if (this.isContentAvailable) { diff --git a/src/services/entity_changes.js b/src/services/entity_changes.js index 3c1f63441..4cdec8920 100644 --- a/src/services/entity_changes.js +++ b/src/services/entity_changes.js @@ -1,7 +1,6 @@ const sql = require('./sql'); -const repository = require('repository'); +const repository = require('./repository'); const sourceIdService = require('./source_id'); -const dateUtils = require('./date_utils'); const log = require('./log'); const cls = require('./cls'); @@ -12,7 +11,6 @@ function insertEntityChange(entityName, entityId, hash, sourceId = null, isSynce entityName: entityName, entityId: entityId, hash: hash, - utcChangedDate: dateUtils.utcNowDateTime(), sourceId: sourceId || cls.getSourceId() || sourceIdService.getCurrentSourceId(), isSynced: isSynced ? 1 : 0 }; @@ -31,9 +29,9 @@ function addEntityChange(entityName, entityId, hash, sourceId, isSynced) { } function moveEntityChangeToTop(entityName, entityId) { - const entityChange = sql.getRow(`SELECT * FROM entity_changes WHERE entityName = ? AND entityId = ?`, [entityName, entityId]); + const [hash, isSynced] = sql.getRow(`SELECT * FROM entity_changes WHERE entityName = ? AND entityId = ?`, [entityName, entityId]); - addEntityChange(entityName, entityId, entityChange.hash, null, entityChange.isSynced); + addEntityChange(entityName, entityId, hash, null, isSynced); } function addEntityChangesForSector(entityName, entityPrimaryKey, sector) { @@ -81,11 +79,10 @@ function fillEntityChanges(entityName, entityPrimaryKey, condition = '') { if (existingRows === 0) { createdCount++; - sql.insert("sync", { + sql.insert("entity_changes", { entityName: entityName, entityId: entityId, sourceId: "SYNC_FILL", - utcChangedDate: dateUtils.utcNowDateTime(), isSynced: 1 }); } diff --git a/src/services/repository.js b/src/services/repository.js index 7c9fc4335..bd0474eb6 100644 --- a/src/services/repository.js +++ b/src/services/repository.js @@ -115,7 +115,7 @@ function updateEntity(entity) { const isSynced = entityName !== 'options' || entity.isSynced; - entityChangesService.addEntityChange(entityName, primaryKey, null, isSynced); + entityChangesService.addEntityChange(entityName, primaryKey, entity.generateHash(), null, isSynced); if (!cls.isEntityEventsDisabled()) { const eventPayload = {