@paroicms/internal-server-lib 1.21.2 → 1.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/sqlite-db-init.d.ts +17 -2
- package/dist/sqlite-db-init.js +108 -5
- package/dist/sqlite-db-init.js.map +1 -1
- package/package.json +1 -1
package/dist/sqlite-db-init.d.ts
CHANGED
|
@@ -20,12 +20,27 @@ export declare function createOrOpenSqliteConnection(options: {
|
|
|
20
20
|
logger: BasicAppLogger;
|
|
21
21
|
knexLogger?: Knex.Logger;
|
|
22
22
|
migrateDb: (cn: Knex) => Promise<DbMigrationReport>;
|
|
23
|
+
ensureDependsOn?: {
|
|
24
|
+
dependsOn: string;
|
|
25
|
+
onMismatch: "error" | "reset";
|
|
26
|
+
};
|
|
23
27
|
}): Promise<{
|
|
24
28
|
cn: Knex;
|
|
25
|
-
|
|
29
|
+
newDatabase: "created" | "reset" | false;
|
|
26
30
|
migrationReport: DbMigrationReport;
|
|
31
|
+
databaseId: string;
|
|
27
32
|
}>;
|
|
28
|
-
export declare function
|
|
33
|
+
export declare function insertNewDatabaseMetadataValues(cn: Knex, options: {
|
|
34
|
+
dbSchemaName: string;
|
|
35
|
+
dependsOn?: string;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
databaseId: string;
|
|
38
|
+
}>;
|
|
39
|
+
export declare function generateDatabaseId(): string;
|
|
40
|
+
export declare function executeDdl(cn: Knex, ddlFile: string, { dropAll }?: {
|
|
41
|
+
dropAll?: boolean;
|
|
42
|
+
}): Promise<void>;
|
|
43
|
+
export declare function dropAllUserTables(cn: Knex): Promise<void>;
|
|
29
44
|
export declare function getMetadataValue(cn: Knex, { dbSchemaName, key }: {
|
|
30
45
|
dbSchemaName: string;
|
|
31
46
|
key: string;
|
package/dist/sqlite-db-init.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
1
|
import { type } from "arktype";
|
|
3
2
|
import knex from "knex";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
4
5
|
import { pathExists } from "./fs-utils.js";
|
|
5
6
|
export const METADATA_TABLE_NAME = "PaMetadata";
|
|
6
7
|
export const DB_SCHEMA_VERSION_KEY = "dbSchemaVersion";
|
|
7
8
|
export async function createOrOpenSqliteConnection(options) {
|
|
8
|
-
const { sqliteFile, ddlFile, dbSchemaName, canCreate, migrateDb, logger, knexLogger } = options;
|
|
9
|
+
const { sqliteFile, ddlFile, dbSchemaName, canCreate, migrateDb, logger, knexLogger, ensureDependsOn, } = options;
|
|
9
10
|
const isNewDatabase = !(await pathExists(sqliteFile));
|
|
10
11
|
if (isNewDatabase && !canCreate) {
|
|
11
12
|
throw new Error(`missing '${dbSchemaName}' database`);
|
|
@@ -28,14 +29,86 @@ export async function createOrOpenSqliteConnection(options) {
|
|
|
28
29
|
idleTimeoutMillis: 30_000,
|
|
29
30
|
},
|
|
30
31
|
});
|
|
32
|
+
let wasReset = false;
|
|
33
|
+
let shouldInitializeMetadata = false;
|
|
31
34
|
if (isNewDatabase) {
|
|
32
35
|
await executeDdl(cn, ddlFile);
|
|
33
36
|
logger.info(`created '${dbSchemaName}' database`);
|
|
37
|
+
shouldInitializeMetadata = true;
|
|
34
38
|
}
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
let migrationReport = await migrateDb(cn);
|
|
40
|
+
if (migrationReport.migrated && isNewDatabase) {
|
|
41
|
+
throw new Error(`unexpected migration of newly created '${dbSchemaName}' database from version ${migrationReport.fromVersion} to ${migrationReport.schemaVersion}`);
|
|
42
|
+
}
|
|
43
|
+
if (ensureDependsOn) {
|
|
44
|
+
const storedDependsOn = await getMetadataValue(cn, {
|
|
45
|
+
dbSchemaName,
|
|
46
|
+
key: "dependsOn",
|
|
47
|
+
});
|
|
48
|
+
if (storedDependsOn !== ensureDependsOn.dependsOn) {
|
|
49
|
+
if (ensureDependsOn.onMismatch === "error" || isNewDatabase) {
|
|
50
|
+
throw new Error(`[${dbSchemaName}] dependsOn mismatch: expected '${ensureDependsOn.dependsOn}', found '${storedDependsOn}'`);
|
|
51
|
+
}
|
|
52
|
+
logger.info(`[${dbSchemaName}] Reset database due to '${ensureDependsOn.dependsOn}', previous value was '${storedDependsOn}'`);
|
|
53
|
+
await executeDdl(cn, ddlFile, { dropAll: true });
|
|
54
|
+
wasReset = true;
|
|
55
|
+
shouldInitializeMetadata = true;
|
|
56
|
+
migrationReport = await migrateDb(cn);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
let databaseId;
|
|
60
|
+
if (shouldInitializeMetadata) {
|
|
61
|
+
const inserted = await insertNewDatabaseMetadataValues(cn, {
|
|
62
|
+
dbSchemaName,
|
|
63
|
+
dependsOn: ensureDependsOn?.dependsOn,
|
|
64
|
+
});
|
|
65
|
+
databaseId = inserted.databaseId;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
databaseId = await getMetadataValue(cn, {
|
|
69
|
+
dbSchemaName,
|
|
70
|
+
key: "databaseId",
|
|
71
|
+
});
|
|
72
|
+
if (databaseId === undefined) {
|
|
73
|
+
throw new Error(`[${dbSchemaName}] missing 'databaseId' in '${METADATA_TABLE_NAME}'`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
cn,
|
|
78
|
+
newDatabase: isNewDatabase ? "created" : wasReset ? "reset" : false,
|
|
79
|
+
migrationReport,
|
|
80
|
+
databaseId,
|
|
81
|
+
};
|
|
37
82
|
}
|
|
38
|
-
export async function
|
|
83
|
+
export async function insertNewDatabaseMetadataValues(cn, options) {
|
|
84
|
+
const { dbSchemaName, dependsOn } = options;
|
|
85
|
+
const databaseId = generateDatabaseId();
|
|
86
|
+
await setMetadataValue(cn, {
|
|
87
|
+
dbSchemaName,
|
|
88
|
+
key: "databaseId",
|
|
89
|
+
value: databaseId,
|
|
90
|
+
});
|
|
91
|
+
if (dependsOn) {
|
|
92
|
+
await setMetadataValue(cn, {
|
|
93
|
+
dbSchemaName,
|
|
94
|
+
key: "dependsOn",
|
|
95
|
+
value: dependsOn,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return { databaseId };
|
|
99
|
+
}
|
|
100
|
+
export function generateDatabaseId() {
|
|
101
|
+
return randomUUID();
|
|
102
|
+
}
|
|
103
|
+
const DropAllUserTablesRowAT = type({
|
|
104
|
+
name: "string",
|
|
105
|
+
type: "string",
|
|
106
|
+
"+": "reject",
|
|
107
|
+
});
|
|
108
|
+
export async function executeDdl(cn, ddlFile, { dropAll } = {}) {
|
|
109
|
+
if (dropAll) {
|
|
110
|
+
await dropAllUserTables(cn);
|
|
111
|
+
}
|
|
39
112
|
const ddl = await readFile(ddlFile, {
|
|
40
113
|
encoding: "utf-8",
|
|
41
114
|
});
|
|
@@ -49,6 +122,35 @@ export async function executeDdl(cn, ddlFile) {
|
|
|
49
122
|
}
|
|
50
123
|
}
|
|
51
124
|
}
|
|
125
|
+
export async function dropAllUserTables(cn) {
|
|
126
|
+
await cn.raw("pragma foreign_keys = 0");
|
|
127
|
+
try {
|
|
128
|
+
const rows = await cn("sqlite_master")
|
|
129
|
+
.select("name", "type")
|
|
130
|
+
.whereIn("type", ["table", "view"])
|
|
131
|
+
.where("name", "not like", "sqlite_%");
|
|
132
|
+
for (const row of rows) {
|
|
133
|
+
const { name, type } = DropAllUserTablesRowAT.assert(row);
|
|
134
|
+
const quotedName = name.replace(/"/g, '"');
|
|
135
|
+
if (type === "view") {
|
|
136
|
+
await cn.raw(`drop view if exists "${quotedName}"`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
await cn.raw(`drop table if exists "${quotedName}"`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const sqliteSequenceExists = await cn("sqlite_master")
|
|
143
|
+
.select("name")
|
|
144
|
+
.where({ type: "table", name: "sqlite_sequence" })
|
|
145
|
+
.first();
|
|
146
|
+
if (sqliteSequenceExists) {
|
|
147
|
+
await cn.raw("delete from sqlite_sequence");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
await cn.raw("pragma foreign_keys = 1");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
52
154
|
function onlySqlComment(sql) {
|
|
53
155
|
const lines = sql.split(/\r\n?|\n/);
|
|
54
156
|
for (let line of lines) {
|
|
@@ -110,6 +212,7 @@ export async function setMetadataDbSchemaVersion(cn, { dbSchemaName, value }) {
|
|
|
110
212
|
});
|
|
111
213
|
}
|
|
112
214
|
const MigrateMetadataTableAT = type({ dbVersion: "number", "+": "reject" });
|
|
215
|
+
// Note: deprecated table
|
|
113
216
|
async function migrateMetadataTable(cn, dbSchemaName) {
|
|
114
217
|
const row = await cn("PaDbMetadata")
|
|
115
218
|
.select("dbVersion")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-db-init.js","sourceRoot":"","sources":["../src/sqlite-db-init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqlite-db-init.js","sourceRoot":"","sources":["../src/sqlite-db-init.ts"],"names":[],"mappings":"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"}
|