mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-31 15:45:23 +00:00
fix(snippets): repair missing note column on SQLite upgrades (#1541)
This commit is contained in:
1 parent
d3568e484d
commit
117e125d55
3 files changed
+78
No files matched your search
@@ -1,3 +1,4 @@
|
|||||||
|
import { repairSnippetsNoteColumn } from "../../upgrade/snippets-schema-migration.js";
|
||||||
import { getErrorMessage } from "../../utils/error-message.js";
|
import { getErrorMessage } from "../../utils/error-message.js";
|
||||||
import { drizzle } from "drizzle-orm/better-sqlite3";
|
import { drizzle } from "drizzle-orm/better-sqlite3";
|
||||||
import Database from "better-sqlite3";
|
import Database from "better-sqlite3";
|
||||||
@@ -782,6 +783,7 @@ const relaxPluginGrantGrantedBy = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const migrateSchema = () => {
|
const migrateSchema = () => {
|
||||||
|
repairSnippetsNoteColumn(sqlite);
|
||||||
addColumnIfNotExists("user_preferences", "theme", "TEXT");
|
addColumnIfNotExists("user_preferences", "theme", "TEXT");
|
||||||
addColumnIfNotExists("user_preferences", "font_size", "TEXT");
|
addColumnIfNotExists("user_preferences", "font_size", "TEXT");
|
||||||
addColumnIfNotExists("user_preferences", "accent_color", "TEXT");
|
addColumnIfNotExists("user_preferences", "accent_color", "TEXT");
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
import Database from "better-sqlite3";
|
||||||
|
import { readFileSync } from "node:fs";
|
||||||
|
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
||||||
|
import { repairSnippetsNoteColumn } from "../../upgrade/snippets-schema-migration.js";
|
||||||
|
|
||||||
|
let sqlite: Database.Database;
|
||||||
|
beforeEach(() => {
|
||||||
|
sqlite = new Database(":memory:");
|
||||||
|
});
|
||||||
|
afterEach(() => {
|
||||||
|
sqlite.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("snippet note column upgrade", () => {
|
||||||
|
it.each(["snippets", "p_snippets_snippets"])(
|
||||||
|
"repairs %s without losing rows",
|
||||||
|
(table) => {
|
||||||
|
sqlite.exec(
|
||||||
|
`CREATE TABLE "${table}" (id INTEGER PRIMARY KEY, user_id TEXT, content TEXT)`,
|
||||||
|
);
|
||||||
|
sqlite
|
||||||
|
.prepare(`INSERT INTO "${table}" VALUES (7, 'user', 'echo hello')`)
|
||||||
|
.run();
|
||||||
|
expect(() => sqlite.prepare(`SELECT "is_note" FROM "${table}"`)).toThrow(
|
||||||
|
/is_note/,
|
||||||
|
);
|
||||||
|
repairSnippetsNoteColumn(sqlite);
|
||||||
|
if (table === "snippets") {
|
||||||
|
sqlite.exec(
|
||||||
|
readFileSync(
|
||||||
|
"plugins/snippets/migrations/sqlite/0001_adopt_snippets_tables.sql",
|
||||||
|
"utf8",
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect(
|
||||||
|
sqlite
|
||||||
|
.prepare("SELECT id, content, is_note FROM p_snippets_snippets")
|
||||||
|
.get(),
|
||||||
|
).toEqual({ id: 7, content: "echo hello", is_note: 0 });
|
||||||
|
sqlite.exec("UPDATE p_snippets_snippets SET is_note = 1");
|
||||||
|
repairSnippetsNoteColumn(sqlite);
|
||||||
|
expect(
|
||||||
|
sqlite.prepare("SELECT is_note FROM p_snippets_snippets").get(),
|
||||||
|
).toEqual({ is_note: 1 });
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
it("does not create tables on a fresh install", () => {
|
||||||
|
repairSnippetsNoteColumn(sqlite);
|
||||||
|
expect(
|
||||||
|
sqlite
|
||||||
|
.prepare("SELECT name FROM sqlite_master WHERE type = 'table'")
|
||||||
|
.all(),
|
||||||
|
).toEqual([]);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import type Database from "better-sqlite3";
|
||||||
|
|
||||||
|
/** Repair older SQLite tables before adoption, or after an incomplete 2.9 upgrade. */
|
||||||
|
export function repairSnippetsNoteColumn(sqlite: Database.Database): void {
|
||||||
|
for (const table of ["snippets", "p_snippets_snippets"]) {
|
||||||
|
const columns = sqlite.pragma(`table_info("${table}")`) as Array<{
|
||||||
|
name: string;
|
||||||
|
}>;
|
||||||
|
if (
|
||||||
|
columns.length === 0 ||
|
||||||
|
columns.some(({ name }) => name === "is_note")
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sqlite.exec(
|
||||||
|
`ALTER TABLE "${table}" ADD COLUMN "is_note" INTEGER NOT NULL DEFAULT 0`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user