mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-07-27 10:02:59 +08:00
refactor(dev): use es6-string-html for some of the SQL statements (closes #274)
This commit is contained in:
parent
7a879d7cc8
commit
ba506c9c10
@ -17,8 +17,8 @@ interface NoteRevisionContents {
|
|||||||
export default () => {
|
export default () => {
|
||||||
const existingBlobIds = new Set();
|
const existingBlobIds = new Set();
|
||||||
|
|
||||||
for (const noteId of sql.getColumn<string>(`SELECT noteId FROM note_contents`)) {
|
for (const noteId of sql.getColumn<string>(/*sql*/`SELECT noteId FROM note_contents`)) {
|
||||||
const row = sql.getRow<NoteContentsRow>(`SELECT noteId, content, dateModified, utcDateModified FROM note_contents WHERE noteId = ?`, [noteId]);
|
const row = sql.getRow<NoteContentsRow>(/*sql*/`SELECT noteId, content, dateModified, utcDateModified FROM note_contents WHERE noteId = ?`, [noteId]);
|
||||||
const blobId = utils.hashedBlobId(row.content);
|
const blobId = utils.hashedBlobId(row.content);
|
||||||
|
|
||||||
if (!existingBlobIds.has(blobId)) {
|
if (!existingBlobIds.has(blobId)) {
|
||||||
@ -40,8 +40,8 @@ export default () => {
|
|||||||
sql.execute("UPDATE notes SET blobId = ? WHERE noteId = ?", [blobId, row.noteId]);
|
sql.execute("UPDATE notes SET blobId = ? WHERE noteId = ?", [blobId, row.noteId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const noteRevisionId of sql.getColumn(`SELECT noteRevisionId FROM note_revision_contents`)) {
|
for (const noteRevisionId of sql.getColumn(/*sql*/`SELECT noteRevisionId FROM note_revision_contents`)) {
|
||||||
const row = sql.getRow<NoteRevisionContents>(`SELECT noteRevisionId, content, utcDateModified FROM note_revision_contents WHERE noteRevisionId = ?`, [noteRevisionId]);
|
const row = sql.getRow<NoteRevisionContents>(/*sql*/`SELECT noteRevisionId, content, utcDateModified FROM note_revision_contents WHERE noteRevisionId = ?`, [noteRevisionId]);
|
||||||
const blobId = utils.hashedBlobId(row.content);
|
const blobId = utils.hashedBlobId(row.content);
|
||||||
|
|
||||||
if (!existingBlobIds.has(blobId)) {
|
if (!existingBlobIds.has(blobId)) {
|
||||||
|
@ -7,7 +7,7 @@ import sql from "../../src/services/sql";
|
|||||||
export default () => {
|
export default () => {
|
||||||
cls.init(() => {
|
cls.init(() => {
|
||||||
// emergency disabling of image compression since it appears to make problems in migration to 0.61
|
// emergency disabling of image compression since it appears to make problems in migration to 0.61
|
||||||
sql.execute(`UPDATE options SET value = 'false' WHERE name = 'compressImages'`);
|
sql.execute(/*sql*/`UPDATE options SET value = 'false' WHERE name = 'compressImages'`);
|
||||||
|
|
||||||
becca_loader.load();
|
becca_loader.load();
|
||||||
|
|
||||||
|
@ -171,11 +171,11 @@ export default class Becca {
|
|||||||
opts.includeContentLength = !!opts.includeContentLength;
|
opts.includeContentLength = !!opts.includeContentLength;
|
||||||
|
|
||||||
const query = opts.includeContentLength
|
const query = opts.includeContentLength
|
||||||
? `SELECT attachments.*, LENGTH(blobs.content) AS contentLength
|
? /*sql*/`SELECT attachments.*, LENGTH(blobs.content) AS contentLength
|
||||||
FROM attachments
|
FROM attachments
|
||||||
JOIN blobs USING (blobId)
|
JOIN blobs USING (blobId)
|
||||||
WHERE attachmentId = ? AND isDeleted = 0`
|
WHERE attachmentId = ? AND isDeleted = 0`
|
||||||
: `SELECT * FROM attachments WHERE attachmentId = ? AND isDeleted = 0`;
|
: /*sql*/`SELECT * FROM attachments WHERE attachmentId = ? AND isDeleted = 0`;
|
||||||
|
|
||||||
return sql.getRows<AttachmentRow>(query, [attachmentId]).map((row) => new BAttachment(row))[0];
|
return sql.getRows<AttachmentRow>(query, [attachmentId]).map((row) => new BAttachment(row))[0];
|
||||||
}
|
}
|
||||||
|
@ -40,11 +40,11 @@ function load() {
|
|||||||
// using a raw query and passing arrays to avoid allocating new objects,
|
// using a raw query and passing arrays to avoid allocating new objects,
|
||||||
// this is worth it for the becca load since it happens every run and blocks the app until finished
|
// this is worth it for the becca load since it happens every run and blocks the app until finished
|
||||||
|
|
||||||
for (const row of sql.getRawRows(`SELECT noteId, title, type, mime, isProtected, blobId, dateCreated, dateModified, utcDateCreated, utcDateModified FROM notes WHERE isDeleted = 0`)) {
|
for (const row of sql.getRawRows(/*sql*/`SELECT noteId, title, type, mime, isProtected, blobId, dateCreated, dateModified, utcDateCreated, utcDateModified FROM notes WHERE isDeleted = 0`)) {
|
||||||
new BNote().update(row).init();
|
new BNote().update(row).init();
|
||||||
}
|
}
|
||||||
|
|
||||||
const branchRows = sql.getRawRows<BranchRow>(`SELECT branchId, noteId, parentNoteId, prefix, notePosition, isExpanded, utcDateModified FROM branches WHERE isDeleted = 0`);
|
const branchRows = sql.getRawRows<BranchRow>(/*sql*/`SELECT branchId, noteId, parentNoteId, prefix, notePosition, isExpanded, utcDateModified FROM branches WHERE isDeleted = 0`);
|
||||||
// in-memory sort is faster than in the DB
|
// in-memory sort is faster than in the DB
|
||||||
branchRows.sort((a, b) => (a.notePosition || 0) - (b.notePosition || 0));
|
branchRows.sort((a, b) => (a.notePosition || 0) - (b.notePosition || 0));
|
||||||
|
|
||||||
@ -52,15 +52,15 @@ function load() {
|
|||||||
new BBranch().update(row).init();
|
new BBranch().update(row).init();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const row of sql.getRawRows<AttributeRow>(`SELECT attributeId, noteId, type, name, value, isInheritable, position, utcDateModified FROM attributes WHERE isDeleted = 0`)) {
|
for (const row of sql.getRawRows<AttributeRow>(/*sql*/`SELECT attributeId, noteId, type, name, value, isInheritable, position, utcDateModified FROM attributes WHERE isDeleted = 0`)) {
|
||||||
new BAttribute().update(row).init();
|
new BAttribute().update(row).init();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const row of sql.getRows<OptionRow>(`SELECT name, value, isSynced, utcDateModified FROM options`)) {
|
for (const row of sql.getRows<OptionRow>(/*sql*/`SELECT name, value, isSynced, utcDateModified FROM options`)) {
|
||||||
new BOption(row);
|
new BOption(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const row of sql.getRows<EtapiTokenRow>(`SELECT etapiTokenId, name, tokenHash, utcDateCreated, utcDateModified FROM etapi_tokens WHERE isDeleted = 0`)) {
|
for (const row of sql.getRows<EtapiTokenRow>(/*sql*/`SELECT etapiTokenId, name, tokenHash, utcDateCreated, utcDateModified FROM etapi_tokens WHERE isDeleted = 0`)) {
|
||||||
new BEtapiToken(row);
|
new BEtapiToken(row);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -259,7 +259,7 @@ abstract class AbstractBeccaEntity<T extends AbstractBeccaEntity<T>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected _getContent(): string | Buffer {
|
protected _getContent(): string | Buffer {
|
||||||
const row = sql.getRow<{ content: string | Buffer }>(`SELECT content FROM blobs WHERE blobId = ?`, [this.blobId]);
|
const row = sql.getRow<{ content: string | Buffer }>(/*sql*/`SELECT content FROM blobs WHERE blobId = ?`, [this.blobId]);
|
||||||
|
|
||||||
if (!row) {
|
if (!row) {
|
||||||
const constructorData = this.constructor as unknown as ConstructorData<T>;
|
const constructorData = this.constructor as unknown as ConstructorData<T>;
|
||||||
@ -282,7 +282,7 @@ abstract class AbstractBeccaEntity<T extends AbstractBeccaEntity<T>> {
|
|||||||
this.utcDateModified = dateUtils.utcNowDateTime();
|
this.utcDateModified = dateUtils.utcNowDateTime();
|
||||||
|
|
||||||
sql.execute(
|
sql.execute(
|
||||||
`UPDATE ${entityName} SET isDeleted = 1, deleteId = ?, utcDateModified = ?
|
/*sql*/`UPDATE ${entityName} SET isDeleted = 1, deleteId = ?, utcDateModified = ?
|
||||||
WHERE ${constructorData.primaryKeyName} = ?`,
|
WHERE ${constructorData.primaryKeyName} = ?`,
|
||||||
[deleteId, this.utcDateModified, entityId]
|
[deleteId, this.utcDateModified, entityId]
|
||||||
);
|
);
|
||||||
@ -290,7 +290,7 @@ abstract class AbstractBeccaEntity<T extends AbstractBeccaEntity<T>> {
|
|||||||
if (this.dateModified) {
|
if (this.dateModified) {
|
||||||
this.dateModified = dateUtils.localNowDateTime();
|
this.dateModified = dateUtils.localNowDateTime();
|
||||||
|
|
||||||
sql.execute(`UPDATE ${entityName} SET dateModified = ? WHERE ${constructorData.primaryKeyName} = ?`, [this.dateModified, entityId]);
|
sql.execute(/*sql*/`UPDATE ${entityName} SET dateModified = ? WHERE ${constructorData.primaryKeyName} = ?`, [this.dateModified, entityId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
log.info(`Marking ${entityName} ${entityId} as deleted`);
|
log.info(`Marking ${entityName} ${entityId} as deleted`);
|
||||||
@ -308,7 +308,7 @@ abstract class AbstractBeccaEntity<T extends AbstractBeccaEntity<T>> {
|
|||||||
this.utcDateModified = dateUtils.utcNowDateTime();
|
this.utcDateModified = dateUtils.utcNowDateTime();
|
||||||
|
|
||||||
sql.execute(
|
sql.execute(
|
||||||
`UPDATE ${entityName} SET isDeleted = 1, utcDateModified = ?
|
/*sql*/`UPDATE ${entityName} SET isDeleted = 1, utcDateModified = ?
|
||||||
WHERE ${constructorData.primaryKeyName} = ?`,
|
WHERE ${constructorData.primaryKeyName} = ?`,
|
||||||
[this.utcDateModified, entityId]
|
[this.utcDateModified, entityId]
|
||||||
);
|
);
|
||||||
|
@ -210,7 +210,7 @@ class BAttachment extends AbstractBeccaEntity<BAttachment> {
|
|||||||
this.position =
|
this.position =
|
||||||
10 +
|
10 +
|
||||||
sql.getValue<number>(
|
sql.getValue<number>(
|
||||||
`SELECT COALESCE(MAX(position), 0)
|
/*sql*/`SELECT COALESCE(MAX(position), 0)
|
||||||
FROM attachments
|
FROM attachments
|
||||||
WHERE ownerId = ?`,
|
WHERE ownerId = ?`,
|
||||||
[this.noteId]
|
[this.noteId]
|
||||||
|
@ -1108,12 +1108,12 @@ class BNote extends AbstractBeccaEntity<BNote> {
|
|||||||
// given that we're always fetching attachments only for a specific note, we might just do it always
|
// given that we're always fetching attachments only for a specific note, we might just do it always
|
||||||
|
|
||||||
const query = opts.includeContentLength
|
const query = opts.includeContentLength
|
||||||
? `SELECT attachments.*, LENGTH(blobs.content) AS contentLength
|
? /*sql*/`SELECT attachments.*, LENGTH(blobs.content) AS contentLength
|
||||||
FROM attachments
|
FROM attachments
|
||||||
JOIN blobs USING (blobId)
|
JOIN blobs USING (blobId)
|
||||||
WHERE ownerId = ? AND isDeleted = 0
|
WHERE ownerId = ? AND isDeleted = 0
|
||||||
ORDER BY position`
|
ORDER BY position`
|
||||||
: `SELECT * FROM attachments WHERE ownerId = ? AND isDeleted = 0 ORDER BY position`;
|
: /*sql*/`SELECT * FROM attachments WHERE ownerId = ? AND isDeleted = 0 ORDER BY position`;
|
||||||
|
|
||||||
return sql.getRows<AttachmentRow>(query, [this.noteId]).map((row) => new BAttachment(row));
|
return sql.getRows<AttachmentRow>(query, [this.noteId]).map((row) => new BAttachment(row));
|
||||||
}
|
}
|
||||||
@ -1122,11 +1122,11 @@ class BNote extends AbstractBeccaEntity<BNote> {
|
|||||||
opts.includeContentLength = !!opts.includeContentLength;
|
opts.includeContentLength = !!opts.includeContentLength;
|
||||||
|
|
||||||
const query = opts.includeContentLength
|
const query = opts.includeContentLength
|
||||||
? `SELECT attachments.*, LENGTH(blobs.content) AS contentLength
|
? /*sql*/`SELECT attachments.*, LENGTH(blobs.content) AS contentLength
|
||||||
FROM attachments
|
FROM attachments
|
||||||
JOIN blobs USING (blobId)
|
JOIN blobs USING (blobId)
|
||||||
WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`
|
WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`
|
||||||
: `SELECT * FROM attachments WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`;
|
: /*sql*/`SELECT * FROM attachments WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`;
|
||||||
|
|
||||||
return sql.getRows<AttachmentRow>(query, [this.noteId, attachmentId]).map((row) => new BAttachment(row))[0];
|
return sql.getRows<AttachmentRow>(query, [this.noteId, attachmentId]).map((row) => new BAttachment(row))[0];
|
||||||
}
|
}
|
||||||
|
@ -141,11 +141,11 @@ class BRevision extends AbstractBeccaEntity<BRevision> {
|
|||||||
opts.includeContentLength = !!opts.includeContentLength;
|
opts.includeContentLength = !!opts.includeContentLength;
|
||||||
|
|
||||||
const query = opts.includeContentLength
|
const query = opts.includeContentLength
|
||||||
? `SELECT attachments.*, LENGTH(blobs.content) AS contentLength
|
? /*sql*/`SELECT attachments.*, LENGTH(blobs.content) AS contentLength
|
||||||
FROM attachments
|
FROM attachments
|
||||||
JOIN blobs USING (blobId)
|
JOIN blobs USING (blobId)
|
||||||
WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`
|
WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`
|
||||||
: `SELECT * FROM attachments WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`;
|
: /*sql*/`SELECT * FROM attachments WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`;
|
||||||
|
|
||||||
return sql.getRows<AttachmentRow>(query, [this.revisionId, attachmentId]).map((row) => new BAttachment(row))[0];
|
return sql.getRows<AttachmentRow>(query, [this.revisionId, attachmentId]).map((row) => new BAttachment(row))[0];
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,7 @@ function setNoteAttribute(req: Request) {
|
|||||||
const noteId = req.params.noteId;
|
const noteId = req.params.noteId;
|
||||||
const body = req.body;
|
const body = req.body;
|
||||||
|
|
||||||
const attributeId = sql.getValue<string | null>(`SELECT attributeId FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = ? AND name = ?`, [noteId, body.type, body.name]);
|
const attributeId = sql.getValue<string | null>(/*sql*/`SELECT attributeId FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = ? AND name = ?`, [noteId, body.type, body.name]);
|
||||||
|
|
||||||
if (attributeId) {
|
if (attributeId) {
|
||||||
const attr = becca.getAttribute(attributeId);
|
const attr = becca.getAttribute(attributeId);
|
||||||
@ -196,7 +196,7 @@ function createRelation(req: Request) {
|
|||||||
const targetNoteId = req.params.targetNoteId;
|
const targetNoteId = req.params.targetNoteId;
|
||||||
const name = req.params.name;
|
const name = req.params.name;
|
||||||
|
|
||||||
const attributeId = sql.getValue<string>(`SELECT attributeId FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = 'relation' AND name = ? AND value = ?`, [
|
const attributeId = sql.getValue<string>(/*sql*/`SELECT attributeId FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = 'relation' AND name = ? AND value = ?`, [
|
||||||
sourceNoteId,
|
sourceNoteId,
|
||||||
name,
|
name,
|
||||||
targetNoteId
|
targetNoteId
|
||||||
@ -220,7 +220,7 @@ function deleteRelation(req: Request) {
|
|||||||
const targetNoteId = req.params.targetNoteId;
|
const targetNoteId = req.params.targetNoteId;
|
||||||
const name = req.params.name;
|
const name = req.params.name;
|
||||||
|
|
||||||
const attributeId = sql.getValue<string | null>(`SELECT attributeId FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = 'relation' AND name = ? AND value = ?`, [
|
const attributeId = sql.getValue<string | null>(/*sql*/`SELECT attributeId FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = 'relation' AND name = ? AND value = ?`, [
|
||||||
sourceNoteId,
|
sourceNoteId,
|
||||||
name,
|
name,
|
||||||
targetNoteId
|
targetNoteId
|
||||||
|
@ -83,7 +83,7 @@ function getRecentNotes(activeNoteId: string) {
|
|||||||
// Get the total number of notes
|
// Get the total number of notes
|
||||||
function getNotesCount(req: Request) {
|
function getNotesCount(req: Request) {
|
||||||
const notesCount = sql.getRow(
|
const notesCount = sql.getRow(
|
||||||
`SELECT COUNT(*) AS count FROM notes WHERE isDeleted = 0;`,
|
/*sql*/`SELECT COUNT(*) AS count FROM notes WHERE isDeleted = 0;`,
|
||||||
) as { count: number };
|
) as { count: number };
|
||||||
return notesCount.count;
|
return notesCount.count;
|
||||||
}
|
}
|
||||||
|
@ -171,7 +171,7 @@ function setExpandedForSubtree(req: Request) {
|
|||||||
// root is always expanded
|
// root is always expanded
|
||||||
branchIds = branchIds.filter((branchId) => branchId !== "none_root");
|
branchIds = branchIds.filter((branchId) => branchId !== "none_root");
|
||||||
|
|
||||||
sql.executeMany(`UPDATE branches SET isExpanded = ${expanded} WHERE branchId IN (???)`, branchIds);
|
sql.executeMany(/*sql*/`UPDATE branches SET isExpanded = ${expanded} WHERE branchId IN (???)`, branchIds);
|
||||||
|
|
||||||
for (const branchId of branchIds) {
|
for (const branchId of branchIds) {
|
||||||
const branch = becca.branches[branchId];
|
const branch = becca.branches[branchId];
|
||||||
|
@ -15,7 +15,7 @@ function addRecentNote(req: Request) {
|
|||||||
// it's not necessary to run this every time ...
|
// it's not necessary to run this every time ...
|
||||||
const cutOffDate = dateUtils.utcDateTimeStr(new Date(Date.now() - 24 * 3600 * 1000));
|
const cutOffDate = dateUtils.utcDateTimeStr(new Date(Date.now() - 24 * 3600 * 1000));
|
||||||
|
|
||||||
sql.execute(`DELETE FROM recent_notes WHERE utcDateCreated < ?`, [cutOffDate]);
|
sql.execute(/*sql*/`DELETE FROM recent_notes WHERE utcDateCreated < ?`, [cutOffDate]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ function getRelationMap(req: Request) {
|
|||||||
const hideRelationsVal = relationMapNote.getLabelValue("hideRelations");
|
const hideRelationsVal = relationMapNote.getLabelValue("hideRelations");
|
||||||
const hideRelations = !hideRelationsVal ? [] : hideRelationsVal.split(",").map((token) => token.trim());
|
const hideRelations = !hideRelationsVal ? [] : hideRelationsVal.split(",").map((token) => token.trim());
|
||||||
|
|
||||||
const foundNoteIds = sql.getColumn<string>(`SELECT noteId FROM notes WHERE isDeleted = 0 AND noteId IN (${questionMarks})`, noteIds);
|
const foundNoteIds = sql.getColumn<string>(/*sql*/`SELECT noteId FROM notes WHERE isDeleted = 0 AND noteId IN (${questionMarks})`, noteIds);
|
||||||
const notes = becca.getNotes(foundNoteIds);
|
const notes = becca.getNotes(foundNoteIds);
|
||||||
|
|
||||||
for (const note of notes) {
|
for (const note of notes) {
|
||||||
|
@ -7,7 +7,7 @@ import ValidationError from "../../errors/validation_error.js";
|
|||||||
import { safeExtractMessageAndStackFromError } from "../../services/utils.js";
|
import { safeExtractMessageAndStackFromError } from "../../services/utils.js";
|
||||||
|
|
||||||
function getSchema() {
|
function getSchema() {
|
||||||
const tableNames = sql.getColumn(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name`);
|
const tableNames = sql.getColumn(/*sql*/`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name`);
|
||||||
const tables = [];
|
const tables = [];
|
||||||
|
|
||||||
for (const tableName of tableNames) {
|
for (const tableName of tableNames) {
|
||||||
|
@ -35,7 +35,7 @@ VACUUM;
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getLightAnonymizationScript() {
|
function getLightAnonymizationScript() {
|
||||||
return `UPDATE blobs SET content = 'text' WHERE content IS NOT NULL AND blobId NOT IN (
|
return /*sql*/`UPDATE blobs SET content = 'text' WHERE content IS NOT NULL AND blobId NOT IN (
|
||||||
SELECT blobId FROM notes WHERE mime IN ('application/javascript;env=backend', 'application/javascript;env=frontend')
|
SELECT blobId FROM notes WHERE mime IN ('application/javascript;env=backend', 'application/javascript;env=frontend')
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT blobId FROM revisions WHERE mime IN ('application/javascript;env=backend', 'application/javascript;env=frontend')
|
SELECT blobId FROM revisions WHERE mime IN ('application/javascript;env=backend', 'application/javascript;env=frontend')
|
||||||
|
@ -65,7 +65,7 @@ function getAttributeNames(type: string, nameLike: string) {
|
|||||||
nameLike = nameLike.toLowerCase();
|
nameLike = nameLike.toLowerCase();
|
||||||
|
|
||||||
let names = sql.getColumn<string>(
|
let names = sql.getColumn<string>(
|
||||||
`SELECT DISTINCT name
|
/*sql*/`SELECT DISTINCT name
|
||||||
FROM attributes
|
FROM attributes
|
||||||
WHERE isDeleted = 0
|
WHERE isDeleted = 0
|
||||||
AND type = ?
|
AND type = ?
|
||||||
|
@ -103,7 +103,7 @@ function ensureNoteIsPresentInParent(noteId: string, parentNoteId: string, prefi
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ensureNoteIsAbsentFromParent(noteId: string, parentNoteId: string) {
|
function ensureNoteIsAbsentFromParent(noteId: string, parentNoteId: string) {
|
||||||
const branchId = sql.getValue<string>(`SELECT branchId FROM branches WHERE noteId = ? AND parentNoteId = ? AND isDeleted = 0`, [noteId, parentNoteId]);
|
const branchId = sql.getValue<string>(/*sql*/`SELECT branchId FROM branches WHERE noteId = ? AND parentNoteId = ? AND isDeleted = 0`, [noteId, parentNoteId]);
|
||||||
const branch = becca.getBranch(branchId);
|
const branch = becca.getBranch(branchId);
|
||||||
|
|
||||||
if (branch) {
|
if (branch) {
|
||||||
|
@ -375,7 +375,7 @@ class ConsistencyChecks {
|
|||||||
({ noteId, parentNoteId }) => {
|
({ noteId, parentNoteId }) => {
|
||||||
if (this.autoFix) {
|
if (this.autoFix) {
|
||||||
const branchIds = sql.getColumn<string>(
|
const branchIds = sql.getColumn<string>(
|
||||||
`SELECT branchId
|
/*sql*/`SELECT branchId
|
||||||
FROM branches
|
FROM branches
|
||||||
WHERE noteId = ?
|
WHERE noteId = ?
|
||||||
and parentNoteId = ?
|
and parentNoteId = ?
|
||||||
@ -729,7 +729,7 @@ class ConsistencyChecks {
|
|||||||
LEFT JOIN entity_changes ec ON ec.entityName = '${entityName}' AND ec.entityId = ${entityName}.${key}
|
LEFT JOIN entity_changes ec ON ec.entityName = '${entityName}' AND ec.entityId = ${entityName}.${key}
|
||||||
WHERE ec.id IS NULL`,
|
WHERE ec.id IS NULL`,
|
||||||
({ entityId }) => {
|
({ entityId }) => {
|
||||||
const entityRow = sql.getRow<EntityChange>(`SELECT * FROM ${entityName} WHERE ${key} = ?`, [entityId]);
|
const entityRow = sql.getRow<EntityChange>(/*sql*/`SELECT * FROM ${entityName} WHERE ${key} = ?`, [entityId]);
|
||||||
|
|
||||||
if (this.autoFix) {
|
if (this.autoFix) {
|
||||||
entityChangesService.putEntityChange({
|
entityChangesService.putEntityChange({
|
||||||
@ -778,7 +778,7 @@ class ConsistencyChecks {
|
|||||||
AND entity_changes.entityName = '${entityName}'`,
|
AND entity_changes.entityName = '${entityName}'`,
|
||||||
({ id, entityId }) => {
|
({ id, entityId }) => {
|
||||||
if (this.autoFix) {
|
if (this.autoFix) {
|
||||||
sql.execute(`DELETE FROM ${entityName} WHERE ${key} = ?`, [entityId]);
|
sql.execute(/*sql*/`DELETE FROM ${entityName} WHERE ${key} = ?`, [entityId]);
|
||||||
|
|
||||||
this.reloadNeeded = true;
|
this.reloadNeeded = true;
|
||||||
|
|
||||||
@ -802,7 +802,7 @@ class ConsistencyChecks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
findWronglyNamedAttributes() {
|
findWronglyNamedAttributes() {
|
||||||
const attrNames = sql.getColumn<string>(`SELECT DISTINCT name FROM attributes`);
|
const attrNames = sql.getColumn<string>(/*sql*/`SELECT DISTINCT name FROM attributes`);
|
||||||
|
|
||||||
for (const origName of attrNames) {
|
for (const origName of attrNames) {
|
||||||
const fixedName = sanitizeAttributeName(origName);
|
const fixedName = sanitizeAttributeName(origName);
|
||||||
@ -883,7 +883,7 @@ class ConsistencyChecks {
|
|||||||
|
|
||||||
runDbDiagnostics() {
|
runDbDiagnostics() {
|
||||||
function getTableRowCount(tableName: string) {
|
function getTableRowCount(tableName: string) {
|
||||||
const count = sql.getValue<number>(`SELECT COUNT(1) FROM ${tableName}`);
|
const count = sql.getValue<number>(/*sql*/`SELECT COUNT(1) FROM ${tableName}`);
|
||||||
|
|
||||||
return `${tableName}: ${count}`;
|
return `${tableName}: ${count}`;
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ function putNoteReorderingEntityChange(parentNoteId: string, componentId?: strin
|
|||||||
|
|
||||||
eventService.emit(eventService.ENTITY_CHANGED, {
|
eventService.emit(eventService.ENTITY_CHANGED, {
|
||||||
entityName: "note_reordering",
|
entityName: "note_reordering",
|
||||||
entity: sql.getMap(`SELECT branchId, notePosition FROM branches WHERE isDeleted = 0 AND parentNoteId = ?`, [parentNoteId])
|
entity: sql.getMap(/*sql*/`SELECT branchId, notePosition FROM branches WHERE isDeleted = 0 AND parentNoteId = ?`, [parentNoteId])
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ function putEntityChangeForOtherInstances(ec: EntityChange) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function addEntityChangesForSector(entityName: string, sector: string) {
|
function addEntityChangesForSector(entityName: string, sector: string) {
|
||||||
const entityChanges = sql.getRows<EntityChange>(`SELECT * FROM entity_changes WHERE entityName = ? AND SUBSTR(entityId, 1, 1) = ?`, [entityName, sector]);
|
const entityChanges = sql.getRows<EntityChange>(/*sql*/`SELECT * FROM entity_changes WHERE entityName = ? AND SUBSTR(entityId, 1, 1) = ?`, [entityName, sector]);
|
||||||
|
|
||||||
let entitiesInserted = entityChanges.length;
|
let entitiesInserted = entityChanges.length;
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ function fillEntityChanges(entityName: string, entityPrimaryKey: string, conditi
|
|||||||
cleanupEntityChangesForMissingEntities(entityName, entityPrimaryKey);
|
cleanupEntityChangesForMissingEntities(entityName, entityPrimaryKey);
|
||||||
|
|
||||||
sql.transactional(() => {
|
sql.transactional(() => {
|
||||||
const entityIds = sql.getColumn<string>(`SELECT ${entityPrimaryKey} FROM ${entityName} ${condition}`);
|
const entityIds = sql.getColumn<string>(/*sql*/`SELECT ${entityPrimaryKey} FROM ${entityName} ${condition}`);
|
||||||
|
|
||||||
let createdCount = 0;
|
let createdCount = 0;
|
||||||
|
|
||||||
|
@ -12,19 +12,19 @@ function eraseNotes(noteIdsToErase: string[]) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sql.executeMany(`DELETE FROM notes WHERE noteId IN (???)`, noteIdsToErase);
|
sql.executeMany(/*sql*/`DELETE FROM notes WHERE noteId IN (???)`, noteIdsToErase);
|
||||||
setEntityChangesAsErased(sql.getManyRows(`SELECT * FROM entity_changes WHERE entityName = 'notes' AND entityId IN (???)`, noteIdsToErase));
|
setEntityChangesAsErased(sql.getManyRows(/*sql*/`SELECT * FROM entity_changes WHERE entityName = 'notes' AND entityId IN (???)`, noteIdsToErase));
|
||||||
|
|
||||||
// we also need to erase all "dependent" entities of the erased notes
|
// we also need to erase all "dependent" entities of the erased notes
|
||||||
const branchIdsToErase = sql.getManyRows<{ branchId: string }>(`SELECT branchId FROM branches WHERE noteId IN (???)`, noteIdsToErase).map((row) => row.branchId);
|
const branchIdsToErase = sql.getManyRows<{ branchId: string }>(/*sql*/`SELECT branchId FROM branches WHERE noteId IN (???)`, noteIdsToErase).map((row) => row.branchId);
|
||||||
|
|
||||||
eraseBranches(branchIdsToErase);
|
eraseBranches(branchIdsToErase);
|
||||||
|
|
||||||
const attributeIdsToErase = sql.getManyRows<{ attributeId: string }>(`SELECT attributeId FROM attributes WHERE noteId IN (???)`, noteIdsToErase).map((row) => row.attributeId);
|
const attributeIdsToErase = sql.getManyRows<{ attributeId: string }>(/*sql*/`SELECT attributeId FROM attributes WHERE noteId IN (???)`, noteIdsToErase).map((row) => row.attributeId);
|
||||||
|
|
||||||
eraseAttributes(attributeIdsToErase);
|
eraseAttributes(attributeIdsToErase);
|
||||||
|
|
||||||
const revisionIdsToErase = sql.getManyRows<{ revisionId: string }>(`SELECT revisionId FROM revisions WHERE noteId IN (???)`, noteIdsToErase).map((row) => row.revisionId);
|
const revisionIdsToErase = sql.getManyRows<{ revisionId: string }>(/*sql*/`SELECT revisionId FROM revisions WHERE noteId IN (???)`, noteIdsToErase).map((row) => row.revisionId);
|
||||||
|
|
||||||
eraseRevisions(revisionIdsToErase);
|
eraseRevisions(revisionIdsToErase);
|
||||||
|
|
||||||
@ -47,9 +47,9 @@ function eraseBranches(branchIdsToErase: string[]) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sql.executeMany(`DELETE FROM branches WHERE branchId IN (???)`, branchIdsToErase);
|
sql.executeMany(/*sql*/`DELETE FROM branches WHERE branchId IN (???)`, branchIdsToErase);
|
||||||
|
|
||||||
setEntityChangesAsErased(sql.getManyRows(`SELECT * FROM entity_changes WHERE entityName = 'branches' AND entityId IN (???)`, branchIdsToErase));
|
setEntityChangesAsErased(sql.getManyRows(/*sql*/`SELECT * FROM entity_changes WHERE entityName = 'branches' AND entityId IN (???)`, branchIdsToErase));
|
||||||
|
|
||||||
log.info(`Erased branches: ${JSON.stringify(branchIdsToErase)}`);
|
log.info(`Erased branches: ${JSON.stringify(branchIdsToErase)}`);
|
||||||
}
|
}
|
||||||
@ -59,9 +59,9 @@ function eraseAttributes(attributeIdsToErase: string[]) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sql.executeMany(`DELETE FROM attributes WHERE attributeId IN (???)`, attributeIdsToErase);
|
sql.executeMany(/*sql*/`DELETE FROM attributes WHERE attributeId IN (???)`, attributeIdsToErase);
|
||||||
|
|
||||||
setEntityChangesAsErased(sql.getManyRows(`SELECT * FROM entity_changes WHERE entityName = 'attributes' AND entityId IN (???)`, attributeIdsToErase));
|
setEntityChangesAsErased(sql.getManyRows(/*sql*/`SELECT * FROM entity_changes WHERE entityName = 'attributes' AND entityId IN (???)`, attributeIdsToErase));
|
||||||
|
|
||||||
log.info(`Erased attributes: ${JSON.stringify(attributeIdsToErase)}`);
|
log.info(`Erased attributes: ${JSON.stringify(attributeIdsToErase)}`);
|
||||||
}
|
}
|
||||||
@ -71,9 +71,9 @@ function eraseAttachments(attachmentIdsToErase: string[]) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sql.executeMany(`DELETE FROM attachments WHERE attachmentId IN (???)`, attachmentIdsToErase);
|
sql.executeMany(/*sql*/`DELETE FROM attachments WHERE attachmentId IN (???)`, attachmentIdsToErase);
|
||||||
|
|
||||||
setEntityChangesAsErased(sql.getManyRows(`SELECT * FROM entity_changes WHERE entityName = 'attachments' AND entityId IN (???)`, attachmentIdsToErase));
|
setEntityChangesAsErased(sql.getManyRows(/*sql*/`SELECT * FROM entity_changes WHERE entityName = 'attachments' AND entityId IN (???)`, attachmentIdsToErase));
|
||||||
|
|
||||||
log.info(`Erased attachments: ${JSON.stringify(attachmentIdsToErase)}`);
|
log.info(`Erased attachments: ${JSON.stringify(attachmentIdsToErase)}`);
|
||||||
}
|
}
|
||||||
@ -83,9 +83,9 @@ function eraseRevisions(revisionIdsToErase: string[]) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sql.executeMany(`DELETE FROM revisions WHERE revisionId IN (???)`, revisionIdsToErase);
|
sql.executeMany(/*sql*/`DELETE FROM revisions WHERE revisionId IN (???)`, revisionIdsToErase);
|
||||||
|
|
||||||
setEntityChangesAsErased(sql.getManyRows(`SELECT * FROM entity_changes WHERE entityName = 'revisions' AND entityId IN (???)`, revisionIdsToErase));
|
setEntityChangesAsErased(sql.getManyRows(/*sql*/`SELECT * FROM entity_changes WHERE entityName = 'revisions' AND entityId IN (???)`, revisionIdsToErase));
|
||||||
|
|
||||||
log.info(`Removed revisions: ${JSON.stringify(revisionIdsToErase)}`);
|
log.info(`Removed revisions: ${JSON.stringify(revisionIdsToErase)}`);
|
||||||
}
|
}
|
||||||
@ -105,10 +105,10 @@ function eraseUnusedBlobs() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sql.executeMany(`DELETE FROM blobs WHERE blobId IN (???)`, unusedBlobIds);
|
sql.executeMany(/*sql*/`DELETE FROM blobs WHERE blobId IN (???)`, unusedBlobIds);
|
||||||
// blobs are not marked as erased in entity_changes, they are just purged completely
|
// blobs are not marked as erased in entity_changes, they are just purged completely
|
||||||
// this is because technically every keystroke can create a new blob and there would be just too many
|
// this is because technically every keystroke can create a new blob and there would be just too many
|
||||||
sql.executeMany(`DELETE FROM entity_changes WHERE entityName = 'blobs' AND entityId IN (???)`, unusedBlobIds);
|
sql.executeMany(/*sql*/`DELETE FROM entity_changes WHERE entityName = 'blobs' AND entityId IN (???)`, unusedBlobIds);
|
||||||
|
|
||||||
log.info(`Erased unused blobs: ${JSON.stringify(unusedBlobIds)}`);
|
log.info(`Erased unused blobs: ${JSON.stringify(unusedBlobIds)}`);
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ async function migrate() {
|
|||||||
executeMigration(mig);
|
executeMigration(mig);
|
||||||
|
|
||||||
sql.execute(
|
sql.execute(
|
||||||
`UPDATE options
|
/*sql*/`UPDATE options
|
||||||
SET value = ?
|
SET value = ?
|
||||||
WHERE name = ?`,
|
WHERE name = ?`,
|
||||||
[mig.dbVersion.toString(), "dbVersion"]
|
[mig.dbVersion.toString(), "dbVersion"]
|
||||||
|
@ -21,7 +21,7 @@ import backup from "./backup.js";
|
|||||||
const dbReady = deferred<void>();
|
const dbReady = deferred<void>();
|
||||||
|
|
||||||
function schemaExists() {
|
function schemaExists() {
|
||||||
return !!sql.getValue(`SELECT name FROM sqlite_master
|
return !!sql.getValue(/*sql*/`SELECT name FROM sqlite_master
|
||||||
WHERE type = 'table' AND name = 'options'`);
|
WHERE type = 'table' AND name = 'options'`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,7 +347,7 @@ function getEntityChangeRow(entityChange: EntityChange) {
|
|||||||
throw new Error(`Unknown entity for entity change ${JSON.stringify(entityChange)}`);
|
throw new Error(`Unknown entity for entity change ${JSON.stringify(entityChange)}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const entityRow = sql.getRow<EntityRow>(`SELECT * FROM ${entityName} WHERE ${primaryKey} = ?`, [entityId]);
|
const entityRow = sql.getRow<EntityRow>(/*sql*/`SELECT * FROM ${entityName} WHERE ${primaryKey} = ?`, [entityId]);
|
||||||
|
|
||||||
if (!entityRow) {
|
if (!entityRow) {
|
||||||
log.error(`Cannot find entity for entity change ${JSON.stringify(entityChange)}`);
|
log.error(`Cannot find entity for entity change ${JSON.stringify(entityChange)}`);
|
||||||
|
@ -70,7 +70,7 @@ function updateEntity(remoteEC: EntityChange, remoteEntityRow: EntityRow | undef
|
|||||||
}
|
}
|
||||||
|
|
||||||
function updateNormalEntity(remoteEC: EntityChange, remoteEntityRow: EntityRow | undefined, instanceId: string, updateContext: UpdateContext) {
|
function updateNormalEntity(remoteEC: EntityChange, remoteEntityRow: EntityRow | undefined, instanceId: string, updateContext: UpdateContext) {
|
||||||
const localEC = sql.getRow<EntityChange | undefined>(`SELECT * FROM entity_changes WHERE entityName = ? AND entityId = ?`, [remoteEC.entityName, remoteEC.entityId]);
|
const localEC = sql.getRow<EntityChange | undefined>(/*sql*/`SELECT * FROM entity_changes WHERE entityName = ? AND entityId = ?`, [remoteEC.entityName, remoteEC.entityId]);
|
||||||
const localECIsOlderOrSameAsRemote = localEC && localEC.utcDateChanged && remoteEC.utcDateChanged && localEC.utcDateChanged <= remoteEC.utcDateChanged;
|
const localECIsOlderOrSameAsRemote = localEC && localEC.utcDateChanged && remoteEC.utcDateChanged && localEC.utcDateChanged <= remoteEC.utcDateChanged;
|
||||||
|
|
||||||
if (!localEC || localECIsOlderOrSameAsRemote) {
|
if (!localEC || localECIsOlderOrSameAsRemote) {
|
||||||
@ -153,7 +153,7 @@ function eraseEntity(entityChange: EntityChange) {
|
|||||||
|
|
||||||
const primaryKeyName = entityConstructor.getEntityFromEntityName(entityName).primaryKeyName;
|
const primaryKeyName = entityConstructor.getEntityFromEntityName(entityName).primaryKeyName;
|
||||||
|
|
||||||
sql.execute(`DELETE FROM ${entityName} WHERE ${primaryKeyName} = ?`, [entityId]);
|
sql.execute(/*sql*/`DELETE FROM ${entityName} WHERE ${primaryKeyName} = ?`, [entityId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function logUpdateContext(updateContext: UpdateContext) {
|
function logUpdateContext(updateContext: UpdateContext) {
|
||||||
|
@ -139,19 +139,19 @@ function fillInAdditionalProperties(entityChange: EntityChange) {
|
|||||||
entityChange.entity = becca.getAttribute(entityChange.entityId);
|
entityChange.entity = becca.getAttribute(entityChange.entityId);
|
||||||
|
|
||||||
if (!entityChange.entity) {
|
if (!entityChange.entity) {
|
||||||
entityChange.entity = sql.getRow(`SELECT * FROM attributes WHERE attributeId = ?`, [entityChange.entityId]);
|
entityChange.entity = sql.getRow(/*sql*/`SELECT * FROM attributes WHERE attributeId = ?`, [entityChange.entityId]);
|
||||||
}
|
}
|
||||||
} else if (entityChange.entityName === "branches") {
|
} else if (entityChange.entityName === "branches") {
|
||||||
entityChange.entity = becca.getBranch(entityChange.entityId);
|
entityChange.entity = becca.getBranch(entityChange.entityId);
|
||||||
|
|
||||||
if (!entityChange.entity) {
|
if (!entityChange.entity) {
|
||||||
entityChange.entity = sql.getRow(`SELECT * FROM branches WHERE branchId = ?`, [entityChange.entityId]);
|
entityChange.entity = sql.getRow(/*sql*/`SELECT * FROM branches WHERE branchId = ?`, [entityChange.entityId]);
|
||||||
}
|
}
|
||||||
} else if (entityChange.entityName === "notes") {
|
} else if (entityChange.entityName === "notes") {
|
||||||
entityChange.entity = becca.getNote(entityChange.entityId);
|
entityChange.entity = becca.getNote(entityChange.entityId);
|
||||||
|
|
||||||
if (!entityChange.entity) {
|
if (!entityChange.entity) {
|
||||||
entityChange.entity = sql.getRow(`SELECT * FROM notes WHERE noteId = ?`, [entityChange.entityId]);
|
entityChange.entity = sql.getRow(/*sql*/`SELECT * FROM notes WHERE noteId = ?`, [entityChange.entityId]);
|
||||||
|
|
||||||
if (entityChange.entity?.isProtected) {
|
if (entityChange.entity?.isProtected) {
|
||||||
entityChange.entity.title = protectedSessionService.decryptString(entityChange.entity.title || "");
|
entityChange.entity.title = protectedSessionService.decryptString(entityChange.entity.title || "");
|
||||||
@ -159,7 +159,7 @@ function fillInAdditionalProperties(entityChange: EntityChange) {
|
|||||||
}
|
}
|
||||||
} else if (entityChange.entityName === "revisions") {
|
} else if (entityChange.entityName === "revisions") {
|
||||||
entityChange.noteId = sql.getValue<string>(
|
entityChange.noteId = sql.getValue<string>(
|
||||||
`SELECT noteId
|
/*sql*/`SELECT noteId
|
||||||
FROM revisions
|
FROM revisions
|
||||||
WHERE revisionId = ?`,
|
WHERE revisionId = ?`,
|
||||||
[entityChange.entityId]
|
[entityChange.entityId]
|
||||||
@ -180,11 +180,11 @@ function fillInAdditionalProperties(entityChange: EntityChange) {
|
|||||||
entityChange.entity = becca.getOption(entityChange.entityId);
|
entityChange.entity = becca.getOption(entityChange.entityId);
|
||||||
|
|
||||||
if (!entityChange.entity) {
|
if (!entityChange.entity) {
|
||||||
entityChange.entity = sql.getRow(`SELECT * FROM options WHERE name = ?`, [entityChange.entityId]);
|
entityChange.entity = sql.getRow(/*sql*/`SELECT * FROM options WHERE name = ?`, [entityChange.entityId]);
|
||||||
}
|
}
|
||||||
} else if (entityChange.entityName === "attachments") {
|
} else if (entityChange.entityName === "attachments") {
|
||||||
entityChange.entity = sql.getRow(
|
entityChange.entity = sql.getRow(
|
||||||
`SELECT attachments.*, LENGTH(blobs.content) AS contentLength
|
/*sql*/`SELECT attachments.*, LENGTH(blobs.content) AS contentLength
|
||||||
FROM attachments
|
FROM attachments
|
||||||
JOIN blobs USING (blobId)
|
JOIN blobs USING (blobId)
|
||||||
WHERE attachmentId = ?`,
|
WHERE attachmentId = ?`,
|
||||||
@ -217,7 +217,7 @@ function sendPing(client: WebSocket, entityChangeIds = []) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const entityChanges = sql.getManyRows<EntityChange>(`SELECT * FROM entity_changes WHERE id IN (???)`, entityChangeIds);
|
const entityChanges = sql.getManyRows<EntityChange>(/*sql*/`SELECT * FROM entity_changes WHERE id IN (???)`, entityChangeIds);
|
||||||
if (!entityChanges) {
|
if (!entityChanges) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ class SAttachment extends AbstractShacaEntity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getContent(silentNotFoundError = false) {
|
getContent(silentNotFoundError = false) {
|
||||||
const row = sql.getRow<Pick<Blob, "content">>(`SELECT content FROM blobs WHERE blobId = ?`, [this.blobId]);
|
const row = sql.getRow<Pick<Blob, "content">>(/*sql*/`SELECT content FROM blobs WHERE blobId = ?`, [this.blobId]);
|
||||||
|
|
||||||
if (!row) {
|
if (!row) {
|
||||||
if (silentNotFoundError) {
|
if (silentNotFoundError) {
|
||||||
|
@ -95,7 +95,7 @@ class SNote extends AbstractShacaEntity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getContent(silentNotFoundError = false) {
|
getContent(silentNotFoundError = false) {
|
||||||
const row = sql.getRow<Pick<Blob, "content">>(`SELECT content FROM blobs WHERE blobId = ?`, [this.blobId]);
|
const row = sql.getRow<Pick<Blob, "content">>(/*sql*/`SELECT content FROM blobs WHERE blobId = ?`, [this.blobId]);
|
||||||
|
|
||||||
if (!row) {
|
if (!row) {
|
||||||
if (silentNotFoundError) {
|
if (silentNotFoundError) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user