core: re-insert only migrated items

Previously, we were re-inserting all items regardless of whether they
were changed or not. This raised a lot of issues, not to mention
unnecessary load on our servers because after each migration
all the data is re-synced. Since migration takes place independently on
each device, this multiplies exponentially.
Hopefully after this update, this will only happen much more granually.
This commit is contained in:
Abdullah Atta
2022-10-26 10:52:27 +05:00
parent 9f25d623bb
commit 082b9755db
3 changed files with 41 additions and 32 deletions

View File

@@ -201,7 +201,8 @@ export default class Backup {
this._db, this._db,
collections, collections,
(id) => data[id], (id) => data[id],
version version,
true
); );
}); });
} }

View File

@@ -21,7 +21,7 @@ import { sendMigrationProgressEvent } from "../common";
import { migrateCollection, migrateItem } from "../migrations"; import { migrateCollection, migrateItem } from "../migrations";
class Migrator { class Migrator {
async migrate(db, collections, get, version) { async migrate(db, collections, get, version, restore = false) {
for (let collection of collections) { for (let collection of collections) {
if (!collection.index || !collection.dbCollection) continue; if (!collection.index || !collection.dbCollection) continue;
@@ -56,23 +56,26 @@ class Migrator {
await collection.dbCollection?._collection?.addItem(item); await collection.dbCollection?._collection?.addItem(item);
continue; continue;
} }
const itemId = item.id; const itemId = item.id;
item = await migrateItem( const migrated = await migrateItem(
item, item,
version, version,
item.type || collection.type || collection.dbCollection.type, item.type || collection.type || collection.dbCollection.type,
db db
); );
if (collection.dbCollection.merge) { if (migrated || restore) {
await collection.dbCollection.merge(item); if (collection.dbCollection.merge) {
} else if (collection.dbCollection.add) { await collection.dbCollection.merge(item);
await collection.dbCollection.add(item); } else if (collection.dbCollection.add) {
} await collection.dbCollection.add(item);
}
// if id changed after migration, we need to delete the old one. // if id changed after migration, we need to delete the old one.
if (item.id !== itemId) { if (item.id !== itemId) {
await collection.dbCollection?._collection?.deleteItem(itemId); await collection.dbCollection?._collection?.deleteItem(itemId);
}
} }
} }
} }

View File

@@ -33,12 +33,12 @@ const migrations = [
attachment: replaceDateEditedWithDateModified(true), attachment: replaceDateEditedWithDateModified(true),
trash: replaceDateEditedWithDateModified(), trash: replaceDateEditedWithDateModified(),
tiny: (item) => { tiny: (item) => {
item = replaceDateEditedWithDateModified(false)(item); replaceDateEditedWithDateModified(false)(item);
if (!item.data || item.data.iv) return item; if (!item.data || item.data.iv) return true;
item.data = removeToxClassFromChecklist(wrapTablesWithDiv(item.data)); item.data = removeToxClassFromChecklist(wrapTablesWithDiv(item.data));
return item; return true;
}, },
settings: replaceDateEditedWithDateModified(true) settings: replaceDateEditedWithDateModified(true)
} }
@@ -47,9 +47,9 @@ const migrations = [
version: 5.3, version: 5.3,
items: { items: {
tiny: (item) => { tiny: (item) => {
if (!item.data || item.data.iv) return item; if (!item.data || item.data.iv) return false;
item.data = decodeWrappedTableHtml(item.data); item.data = decodeWrappedTableHtml(item.data);
return item; return true;
} }
} }
}, },
@@ -57,10 +57,10 @@ const migrations = [
version: 5.4, version: 5.4,
items: { items: {
tiny: (item) => { tiny: (item) => {
if (!item.data || item.data.iv) return item; if (!item.data || item.data.iv) return false;
item.type = "tiptap"; item.type = "tiptap";
item.data = tinyToTiptap(item.data); item.data = tinyToTiptap(item.data);
return item; return true;
} }
} }
}, },
@@ -72,16 +72,16 @@ const migrations = [
version: 5.6, version: 5.6,
items: { items: {
notebook: (item) => { notebook: (item) => {
if (!item.topics) return item; if (!item.topics) return false;
item.topics = item.topics.map((topic) => { item.topics = item.topics.map((topic) => {
delete topic.notes; delete topic.notes;
return topic; return topic;
}); });
return item; return item.topics.length > 0;
}, },
settings: async (item, db) => { settings: async (item, db) => {
if (!item.pins) return item; if (!item.pins) return false;
for (const pin of item.pins) { for (const pin of item.pins) {
if (!pin.data) continue; if (!pin.data) continue;
@@ -94,7 +94,7 @@ const migrations = [
}); });
} }
delete item.pins; delete item.pins;
return item; return true;
} }
} }
}, },
@@ -102,26 +102,28 @@ const migrations = [
version: 5.7, version: 5.7,
items: { items: {
tiny: (item) => { tiny: (item) => {
if (!item.data || item.data.iv) return item; if (!item.data || item.data.iv) return false;
item.type = "tiptap"; item.type = "tiptap";
return changeSessionContentType(item); return changeSessionContentType(item);
}, },
content: (item) => { content: (item) => {
if (!item.data || item.data.iv) return item; if (!item.data || item.data.iv) return false;
const oldType = item.type;
item.type = "tiptap"; item.type = "tiptap";
return item; return oldType !== item.type;
}, },
shortcut: (item) => { shortcut: (item) => {
if (item.id === item.item.id) return item; if (item.id === item.item.id) return false;
item.id = item.item.id; item.id = item.item.id;
return item; return true;
}, },
tiptap: (item) => { tiptap: (item) => {
return changeSessionContentType(item); return changeSessionContentType(item);
}, },
notehistory: (item) => { notehistory: (item) => {
const oldType = item.type;
item.type = "session"; item.type = "session";
return item; return oldType !== item.type;
} }
}, },
collection: async (collection) => { collection: async (collection) => {
@@ -144,15 +146,17 @@ export async function migrateItem(item, version, type, database) {
); );
} }
let count = 0;
for (; migrationStartIndex < migrations.length; ++migrationStartIndex) { for (; migrationStartIndex < migrations.length; ++migrationStartIndex) {
const migration = migrations[migrationStartIndex]; const migration = migrations[migrationStartIndex];
if (migration.version === CURRENT_DATABASE_VERSION) break; if (migration.version === CURRENT_DATABASE_VERSION) break;
const itemMigrator = migration.items && migration.items[type]; const itemMigrator = migration.items && migration.items[type];
if (!itemMigrator) continue; if (!itemMigrator) continue;
item = await itemMigrator(item, database); if (await itemMigrator(item, database)) count++;
} }
return item;
return count > 0;
} }
export async function migrateCollection(collection, version) { export async function migrateCollection(collection, version) {
@@ -182,7 +186,7 @@ function replaceDateEditedWithDateModified(removeDateEditedProperty = false) {
item.dateModified = item.dateEdited; item.dateModified = item.dateEdited;
if (removeDateEditedProperty) delete item.dateEdited; if (removeDateEditedProperty) delete item.dateEdited;
delete item.persistDateEdited; delete item.persistDateEdited;
return item; return true;
}; };
} }
@@ -280,6 +284,7 @@ function changeSessionContentType(item) {
if (item.id.endsWith("_content")) { if (item.id.endsWith("_content")) {
item.contentType = item.type; item.contentType = item.type;
item.type = "sessioncontent"; item.type = "sessioncontent";
return true;
} }
return item; return false;
} }