From e36bc425193634da5c5ad247329e7bd89503dadd Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 18 Nov 2021 22:33:08 +0100 Subject: [PATCH] added changeId into entity_changes to have cross-sync change ID --- .../0187__add_changeId_to_entity_changes.sql | 23 +++++++++++++++++++ db/schema.sql | 1 + src/services/app_info.js | 2 +- src/services/cls.js | 7 +----- src/services/entity_changes.js | 5 ++++ src/services/sync.js | 6 ++--- 6 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 db/migrations/0187__add_changeId_to_entity_changes.sql diff --git a/db/migrations/0187__add_changeId_to_entity_changes.sql b/db/migrations/0187__add_changeId_to_entity_changes.sql new file mode 100644 index 000000000..e897b58da --- /dev/null +++ b/db/migrations/0187__add_changeId_to_entity_changes.sql @@ -0,0 +1,23 @@ +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, + `isErased` INT NOT NULL, + `changeId` TEXT NOT NULL, + `sourceId` TEXT NOT NULL, + `isSynced` INTEGER NOT NULL, + `utcDateChanged` TEXT NOT NULL +); + +INSERT INTO mig_entity_changes (entityName, entityId, hash, isErased, changeId, sourceId, isSynced, utcDateChanged) + SELECT entityName, entityId, hash, isErased, '', sourceId, isSynced, utcDateChanged FROM entity_changes; + +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` + ); diff --git a/db/schema.sql b/db/schema.sql index 3a2ed7240..a4a49c399 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -4,6 +4,7 @@ CREATE TABLE IF NOT EXISTS "entity_changes" ( `entityId` TEXT NOT NULL, `hash` TEXT NOT NULL, `isErased` INT NOT NULL, + `changeId` TEXT NOT NULL, `sourceId` TEXT NOT NULL, `isSynced` INTEGER NOT NULL, `utcDateChanged` TEXT NOT NULL diff --git a/src/services/app_info.js b/src/services/app_info.js index db6a20728..97ee78b14 100644 --- a/src/services/app_info.js +++ b/src/services/app_info.js @@ -4,7 +4,7 @@ const build = require('./build'); const packageJson = require('../../package'); const {TRILIUM_DATA_DIR} = require('./data_dir'); -const APP_DB_VERSION = 186; +const APP_DB_VERSION = 187; const SYNC_VERSION = 21; const CLIPPER_PROTOCOL_VERSION = "1.0"; diff --git a/src/services/cls.js b/src/services/cls.js index 53d6a40db..7f594fdda 100644 --- a/src/services/cls.js +++ b/src/services/cls.js @@ -44,14 +44,10 @@ function isEntityEventsDisabled() { return !!namespace.get('disableEntityEvents'); } -function clearEntityChangeIds() { - namespace.set('entityChangeIds', []); -} - function getAndClearEntityChangeIds() { const entityChangeIds = namespace.get('entityChangeIds') || []; - clearEntityChangeIds(); + namespace.set('entityChangeIds', []); return entityChangeIds; } @@ -89,7 +85,6 @@ module.exports = { disableEntityEvents, isEntityEventsDisabled, reset, - clearEntityChangeIds, getAndClearEntityChangeIds, addEntityChange, ignoreEntityChangeIds diff --git a/src/services/entity_changes.js b/src/services/entity_changes.js index 38fc34499..b02b4c538 100644 --- a/src/services/entity_changes.js +++ b/src/services/entity_changes.js @@ -3,6 +3,7 @@ const sourceIdService = require('./source_id'); const dateUtils = require('./date_utils'); const log = require('./log'); const cls = require('./cls'); +const utils = require('./utils'); const becca = require("../becca/becca"); let maxEntityChangeId = 0; @@ -12,6 +13,10 @@ function addEntityChange(origEntityChange) { delete ec.id; + if (!ec.changeId) { + ec.changeId = utils.randomString(12); + } + ec.sourceId = ec.sourceId || cls.getSourceId() || sourceIdService.getCurrentSourceId(); ec.isSynced = ec.isSynced ? 1 : 0; ec.isErased = ec.isErased ? 1 : 0; diff --git a/src/services/sync.js b/src/services/sync.js index 1dd2b6937..3325fb023 100644 --- a/src/services/sync.js +++ b/src/services/sync.js @@ -149,10 +149,10 @@ async function pullChanges(syncContext) { sql.transactional(() => { for (const {entityChange, entity} of entityChanges) { - // FIXME: temporary fix - const existsAlready = !!sql.getValue("SELECT id FROM entity_changes WHERE entityName = ? AND entityId = ? AND utcDateChanged = ? AND hash = ?", [entityChange.entityName, entityChange.entityId, entityChange.utcDateChanged, entityChange.hash]); + const changeAppliedAlready = !entityChange.changeId + || !!sql.getValue("SELECT id FROM entity_changes WHERE changeId = ?", [entityChange.changeId]); - if (!existsAlready && !sourceIdService.isLocalSourceId(entityChange.sourceId)) { + if (!changeAppliedAlready && !sourceIdService.isLocalSourceId(entityChange.sourceId)) { if (!atLeastOnePullApplied) { // send only for first ws.syncPullInProgress();