mirror of
https://github.com/zadam/trilium.git
synced 2025-03-01 14:22:32 +01:00
implemented bulk sync pull for increased performance
This commit is contained in:
parent
b09463d1b2
commit
64336ffbee
@ -58,7 +58,52 @@ async function forceNoteSync(req) {
|
|||||||
async function getChanged(req) {
|
async function getChanged(req) {
|
||||||
const lastSyncId = parseInt(req.query.lastSyncId);
|
const lastSyncId = parseInt(req.query.lastSyncId);
|
||||||
|
|
||||||
return await sql.getRows("SELECT * FROM sync WHERE id > ?", [lastSyncId]);
|
const records = [];
|
||||||
|
let length = 0;
|
||||||
|
|
||||||
|
for (const sync of await sql.getRows("SELECT * FROM sync WHERE id > ?", [lastSyncId])) {
|
||||||
|
const record = {
|
||||||
|
sync: sync,
|
||||||
|
entity: await getEntityRow(sync.entityName, sync.entityId)
|
||||||
|
};
|
||||||
|
|
||||||
|
records.push(record);
|
||||||
|
|
||||||
|
length += JSON.stringify(record).length;
|
||||||
|
|
||||||
|
if (length > 1000000) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return records;
|
||||||
|
}
|
||||||
|
|
||||||
|
const primaryKeys = {
|
||||||
|
"notes": "noteId",
|
||||||
|
"branches": "branchId",
|
||||||
|
"note_revisions": "noteRevisionId",
|
||||||
|
"option": "name",
|
||||||
|
"recent_notes": "branchId",
|
||||||
|
"images": "imageId",
|
||||||
|
"note_images": "noteImageId",
|
||||||
|
"labels": "labelId",
|
||||||
|
"api_tokens": "apiTokenId"
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getEntityRow(entityName, entityId) {
|
||||||
|
if (entityName === 'note_reordering') {
|
||||||
|
return await getNoteReordering(entityId);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const primaryKey = primaryKeys[entityName];
|
||||||
|
|
||||||
|
if (!primaryKey) {
|
||||||
|
throw new Error("Unknown entity " + entityName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return await sql.getRow(`SELECT * FROM ${entityName} WHERE ${primaryKey} = ?`, [entityId]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getNote(req) {
|
async function getNote(req) {
|
||||||
@ -96,13 +141,8 @@ async function getOption(req) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getNoteReordering(req) {
|
async function getNoteReordering(parentNoteId) {
|
||||||
const parentNoteId = req.params.parentNoteId;
|
return await sql.getMap("SELECT branchId, notePosition FROM branches WHERE parentNoteId = ? AND isDeleted = 0", [parentNoteId])
|
||||||
|
|
||||||
return {
|
|
||||||
parentNoteId: parentNoteId,
|
|
||||||
ordering: await sql.getMap("SELECT branchId, notePosition FROM branches WHERE parentNoteId = ? AND isDeleted = 0", [parentNoteId])
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getRecentNote(req) {
|
async function getRecentNote(req) {
|
||||||
|
@ -104,11 +104,11 @@ async function pullSync(syncContext) {
|
|||||||
|
|
||||||
const changesUri = '/api/sync/changed?lastSyncId=' + lastSyncedPull;
|
const changesUri = '/api/sync/changed?lastSyncId=' + lastSyncedPull;
|
||||||
|
|
||||||
const syncRows = await syncRequest(syncContext, 'GET', changesUri);
|
const rows = await syncRequest(syncContext, 'GET', changesUri);
|
||||||
|
|
||||||
log.info("Pulled " + syncRows.length + " changes from " + changesUri);
|
log.info("Pulled " + rows.length + " changes from " + changesUri);
|
||||||
|
|
||||||
for (const sync of syncRows) {
|
for (const {sync, entity} of rows) {
|
||||||
if (sourceIdService.isLocalSourceId(sync.sourceId)) {
|
if (sourceIdService.isLocalSourceId(sync.sourceId)) {
|
||||||
log.info(`Skipping pull #${sync.id} ${sync.entityName} ${sync.entityId} because ${sync.sourceId} is a local source id.`);
|
log.info(`Skipping pull #${sync.id} ${sync.entityName} ${sync.entityId} because ${sync.sourceId} is a local source id.`);
|
||||||
|
|
||||||
@ -117,40 +117,38 @@ async function pullSync(syncContext) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const resp = await syncRequest(syncContext, 'GET', "/api/sync/" + sync.entityName + "/" + encodeURIComponent(sync.entityId));
|
if (!entity) {
|
||||||
|
|
||||||
if (!resp || (sync.entityName === 'notes' && !resp.entity)) {
|
|
||||||
log.error(`Empty response to pull for sync #${sync.id} ${sync.entityName}, id=${sync.entityId}`);
|
log.error(`Empty response to pull for sync #${sync.id} ${sync.entityName}, id=${sync.entityId}`);
|
||||||
}
|
}
|
||||||
else if (sync.entityName === 'notes') {
|
else if (sync.entityName === 'notes') {
|
||||||
await syncUpdateService.updateNote(resp.entity, syncContext.sourceId);
|
await syncUpdateService.updateNote(entity, syncContext.sourceId);
|
||||||
}
|
}
|
||||||
else if (sync.entityName === 'branches') {
|
else if (sync.entityName === 'branches') {
|
||||||
await syncUpdateService.updateBranch(resp, syncContext.sourceId);
|
await syncUpdateService.updateBranch(entity, syncContext.sourceId);
|
||||||
}
|
}
|
||||||
else if (sync.entityName === 'note_revisions') {
|
else if (sync.entityName === 'note_revisions') {
|
||||||
await syncUpdateService.updateNoteRevision(resp, syncContext.sourceId);
|
await syncUpdateService.updateNoteRevision(entity, syncContext.sourceId);
|
||||||
}
|
}
|
||||||
else if (sync.entityName === 'note_reordering') {
|
else if (sync.entityName === 'note_reordering') {
|
||||||
await syncUpdateService.updateNoteReordering(resp, syncContext.sourceId);
|
await syncUpdateService.updateNoteReordering(entity, syncContext.sourceId);
|
||||||
}
|
}
|
||||||
else if (sync.entityName === 'options') {
|
else if (sync.entityName === 'options') {
|
||||||
await syncUpdateService.updateOptions(resp, syncContext.sourceId);
|
await syncUpdateService.updateOptions(entity, syncContext.sourceId);
|
||||||
}
|
}
|
||||||
else if (sync.entityName === 'recent_notes') {
|
else if (sync.entityName === 'recent_notes') {
|
||||||
await syncUpdateService.updateRecentNotes(resp, syncContext.sourceId);
|
await syncUpdateService.updateRecentNotes(entity, syncContext.sourceId);
|
||||||
}
|
}
|
||||||
else if (sync.entityName === 'images') {
|
else if (sync.entityName === 'images') {
|
||||||
await syncUpdateService.updateImage(resp, syncContext.sourceId);
|
await syncUpdateService.updateImage(entity, syncContext.sourceId);
|
||||||
}
|
}
|
||||||
else if (sync.entityName === 'note_images') {
|
else if (sync.entityName === 'note_images') {
|
||||||
await syncUpdateService.updateNoteImage(resp, syncContext.sourceId);
|
await syncUpdateService.updateNoteImage(entity, syncContext.sourceId);
|
||||||
}
|
}
|
||||||
else if (sync.entityName === 'labels') {
|
else if (sync.entityName === 'labels') {
|
||||||
await syncUpdateService.updateLabel(resp, syncContext.sourceId);
|
await syncUpdateService.updateLabel(entity, syncContext.sourceId);
|
||||||
}
|
}
|
||||||
else if (sync.entityName === 'api_tokens') {
|
else if (sync.entityName === 'api_tokens') {
|
||||||
await syncUpdateService.updateApiToken(resp, syncContext.sourceId);
|
await syncUpdateService.updateApiToken(entity, syncContext.sourceId);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new Error(`Unrecognized entity type ${sync.entityName} in sync #${sync.id}`);
|
throw new Error(`Unrecognized entity type ${sync.entityName} in sync #${sync.id}`);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user