mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-07-27 18:12:29 +08:00
fix(migration): JavaScript-based migrations not working
This commit is contained in:
parent
01ff3d396d
commit
a80c3e32f1
@ -1,11 +1,24 @@
|
||||
module.exports = () => {
|
||||
const sql = require("../../src/services/sql");
|
||||
const utils = require("../../src/services/utils");
|
||||
interface NoteContentsRow {
|
||||
noteId: string;
|
||||
content: string | Buffer;
|
||||
dateModified: string;
|
||||
utcDateModified: string;
|
||||
}
|
||||
|
||||
interface NoteRevisionContents {
|
||||
noteRevisionId: string;
|
||||
content: string | Buffer;
|
||||
utcDateModified: string;
|
||||
}
|
||||
|
||||
export default async () => {
|
||||
const sql = (await import("../../src/services/sql")).default;
|
||||
const utils = (await import("../../src/services/utils")).default;
|
||||
|
||||
const existingBlobIds = new Set();
|
||||
|
||||
for (const noteId of sql.getColumn(`SELECT noteId FROM note_contents`)) {
|
||||
const row = sql.getRow(`SELECT noteId, content, dateModified, utcDateModified FROM note_contents WHERE noteId = ?`, [noteId]);
|
||||
for (const noteId of sql.getColumn<string>(`SELECT noteId FROM note_contents`)) {
|
||||
const row = sql.getRow<NoteContentsRow>(`SELECT noteId, content, dateModified, utcDateModified FROM note_contents WHERE noteId = ?`, [noteId]);
|
||||
const blobId = utils.hashedBlobId(row.content);
|
||||
|
||||
if (!existingBlobIds.has(blobId)) {
|
||||
@ -28,7 +41,7 @@ module.exports = () => {
|
||||
}
|
||||
|
||||
for (const noteRevisionId of sql.getColumn(`SELECT noteRevisionId FROM note_revision_contents`)) {
|
||||
const row = sql.getRow(`SELECT noteRevisionId, content, utcDateModified FROM note_revision_contents WHERE noteRevisionId = ?`, [noteRevisionId]);
|
||||
const row = sql.getRow<NoteRevisionContents>(`SELECT noteRevisionId, content, utcDateModified FROM note_revision_contents WHERE noteRevisionId = ?`, [noteRevisionId]);
|
||||
const blobId = utils.hashedBlobId(row.content);
|
||||
|
||||
if (!existingBlobIds.has(blobId)) {
|
||||
@ -44,7 +57,7 @@ module.exports = () => {
|
||||
sql.execute("UPDATE entity_changes SET entityName = 'blobs', entityId = ? WHERE entityName = 'note_revision_contents' AND entityId = ?", [blobId, row.noteRevisionId]);
|
||||
} else {
|
||||
// duplicates
|
||||
sql.execute("DELETE FROM entity_changes WHERE entityName = 'note_revision_contents' AND entityId = ?", [row.noteId]);
|
||||
sql.execute("DELETE FROM entity_changes WHERE entityName = 'note_revision_contents' AND entityId = ?", [row.noteRevisionId]);
|
||||
}
|
||||
|
||||
sql.execute("UPDATE note_revisions SET blobId = ? WHERE noteRevisionId = ?", [blobId, row.noteRevisionId]);
|
@ -1,9 +1,9 @@
|
||||
module.exports = () => {
|
||||
const beccaLoader = require("../../src/becca/becca_loader");
|
||||
const becca = require("../../src/becca/becca");
|
||||
const cls = require("../../src/services/cls");
|
||||
const log = require("../../src/services/log");
|
||||
const sql = require("../../src/services/sql");
|
||||
export default async () => {
|
||||
const beccaLoader = (await import("../../src/becca/becca_loader")).default;
|
||||
const becca = (await import("../../src/becca/becca")).default;
|
||||
const cls = (await import("../../src/services/cls")).default;
|
||||
const log = (await import("../../src/services/log")).default;
|
||||
const sql = (await import("../../src/services/sql")).default;
|
||||
|
||||
cls.init(() => {
|
||||
// emergency disabling of image compression since it appears to make problems in migration to 0.61
|
@ -0,0 +1,17 @@
|
||||
import { describe, it } from "vitest";
|
||||
import becca from "../becca/becca.js";
|
||||
import sql from "./sql.js";
|
||||
import migration from "./migration.js";
|
||||
import cls from "./cls.js";
|
||||
|
||||
describe("Migration", () => {
|
||||
it("migrates from v214", async () => {
|
||||
return new Promise<void>((resolve) => {
|
||||
cls.init(async () => {
|
||||
sql.rebuildIntegrationTestDatabase("test/db/document_v214.db");
|
||||
await migration.migrateIfNecessary();
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
@ -106,7 +106,7 @@ async function executeMigration(mig: MigrationInfo) {
|
||||
console.log("Migration with JS module");
|
||||
|
||||
const migrationModule = await import(`${resourceDir.MIGRATIONS_DIR}/${mig.file}`);
|
||||
migrationModule();
|
||||
await migrationModule.default();
|
||||
} else {
|
||||
throw new Error(`Unknown migration type '${mig.type}'`);
|
||||
}
|
||||
|
@ -25,14 +25,18 @@ function buildDatabase() {
|
||||
return new Database(dataDir.DOCUMENT_PATH);
|
||||
}
|
||||
|
||||
function buildIntegrationTestDatabase() {
|
||||
const dbBuffer = fs.readFileSync(dataDir.DOCUMENT_PATH);
|
||||
function buildIntegrationTestDatabase(dbPath?: string) {
|
||||
const dbBuffer = fs.readFileSync(dbPath ?? dataDir.DOCUMENT_PATH);
|
||||
return new Database(dbBuffer);
|
||||
}
|
||||
|
||||
function rebuildIntegrationTestDatabase() {
|
||||
function rebuildIntegrationTestDatabase(dbPath: string) {
|
||||
if (dbConnection) {
|
||||
dbConnection.close();
|
||||
}
|
||||
|
||||
// This allows a database that is read normally but is kept in memory and discards all modifications.
|
||||
dbConnection = buildIntegrationTestDatabase();
|
||||
dbConnection = buildIntegrationTestDatabase(dbPath);
|
||||
statementCache = {};
|
||||
}
|
||||
|
||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user