Notes/src/share/shaca/shaca_loader.ts

98 lines
2.8 KiB
TypeScript
Raw Normal View History

2021-10-16 22:13:34 +02:00
"use strict";
import sql = require('../sql');
import shaca = require('./shaca');
import log = require('../../services/log');
import SNote = require('./entities/snote');
import SBranch = require('./entities/sbranch');
import SAttribute = require('./entities/sattribute');
import SAttachment = require('./entities/sattachment');
import shareRoot = require('../share_root');
import eventService = require('../../services/events');
2021-10-16 22:13:34 +02:00
function load() {
const start = Date.now();
shaca.reset();
2023-06-30 11:18:34 +02:00
// using a raw query and passing arrays to avoid allocating new objects
2021-10-16 22:13:34 +02:00
2021-10-17 14:44:59 +02:00
const noteIds = sql.getColumn(`
WITH RECURSIVE
tree(noteId) AS (
SELECT ?
UNION
SELECT branches.noteId FROM branches
JOIN tree ON branches.parentNoteId = tree.noteId
2021-10-17 14:44:59 +02:00
WHERE branches.isDeleted = 0
)
SELECT noteId FROM tree`, [shareRoot.SHARE_ROOT_NOTE_ID]);
2021-10-16 22:13:34 +02:00
2021-10-17 14:44:59 +02:00
if (noteIds.length === 0) {
shaca.loaded = true;
2021-10-16 22:13:34 +02:00
return;
}
2021-10-17 14:44:59 +02:00
const noteIdStr = noteIds.map(noteId => `'${noteId}'`).join(",");
2021-10-16 22:13:34 +02:00
const rawNoteRows = sql.getRawRows<SNoteRow>(`
2023-03-16 11:02:07 +01:00
SELECT noteId, title, type, mime, blobId, utcDateModified, isProtected
2021-12-23 12:54:21 +01:00
FROM notes
WHERE isDeleted = 0
AND noteId IN (${noteIdStr})`);
for (const row of rawNoteRows) {
new SNote(row);
2021-10-16 22:13:34 +02:00
}
const rawBranchRows = sql.getRawRows<SBranchRow>(`
2021-12-23 12:54:21 +01:00
SELECT branchId, noteId, parentNoteId, prefix, isExpanded, utcDateModified
FROM branches
WHERE isDeleted = 0
AND parentNoteId IN (${noteIdStr})
ORDER BY notePosition`);
for (const row of rawBranchRows) {
new SBranch(row);
2021-10-16 22:13:34 +02:00
}
const rawAttributeRows = sql.getRawRows<SAttributeRow>(`
2021-12-07 23:03:49 +01:00
SELECT attributeId, noteId, type, name, value, isInheritable, position, utcDateModified
FROM attributes
WHERE isDeleted = 0
AND noteId IN (${noteIdStr})`);
2021-12-07 23:03:49 +01:00
2021-12-23 12:54:21 +01:00
for (const row of rawAttributeRows) {
new SAttribute(row);
2021-10-16 22:13:34 +02:00
}
const rawAttachmentRows = sql.getRawRows<SAttachmentRow>(`
SELECT attachmentId, ownerId, role, mime, title, blobId, utcDateModified
2023-06-05 23:05:05 +02:00
FROM attachments
WHERE isDeleted = 0
AND ownerId IN (${noteIdStr})`);
2023-06-05 23:05:05 +02:00
for (const row of rawAttachmentRows) {
new SAttachment(row);
}
2021-10-17 14:44:59 +02:00
shaca.loaded = true;
2021-10-16 22:13:34 +02:00
2023-06-05 23:05:05 +02:00
log.info(`Shaca loaded ${rawNoteRows.length} notes, ${rawBranchRows.length} branches, ${rawAttachmentRows.length} attributes took ${Date.now() - start}ms`);
2021-10-16 22:13:34 +02:00
}
2021-10-17 14:44:59 +02:00
function ensureLoad() {
if (!shaca.loaded) {
load();
2021-10-16 22:13:34 +02:00
}
}
2024-04-09 21:51:23 +03:00
eventService.subscribe([eventService.ENTITY_CREATED, eventService.ENTITY_CHANGED, eventService.ENTITY_DELETED, eventService.ENTITY_CHANGE_SYNCED, eventService.ENTITY_DELETE_SYNCED], ({ entityName, entity }) => {
2021-12-07 23:03:49 +01:00
shaca.reset();
});
2021-10-16 22:13:34 +02:00
export = {
2021-10-16 22:13:34 +02:00
load,
2021-10-17 14:44:59 +02:00
ensureLoad
2021-10-16 22:13:34 +02:00
};