diff --git a/packages/core/src/database/index.ts b/packages/core/src/database/index.ts index 13b33a461..d975878ed 100644 --- a/packages/core/src/database/index.ts +++ b/packages/core/src/database/index.ts @@ -255,30 +255,10 @@ const DataMappers: Partial void>> = { } }; -export type SQLiteOptions = { - dialect: (name: string) => Dialect; - journalMode?: "WAL" | "MEMORY" | "OFF" | "PERSIST" | "TRUNCATE" | "DELETE"; - synchronous?: "normal" | "extra" | "full" | "off"; - lockingMode?: "normal" | "exclusive"; - tempStore?: "memory" | "file" | "default"; - cacheSize?: number; - pageSize?: number; - password?: string; -}; -export async function createDatabase(name: string, options: SQLiteOptions) { - const db = new Kysely({ - dialect: options.dialect(name), - plugins: [new SqliteBooleanPlugin()] - }); +async function init(db: Kysely, options: SQLiteOptions) { try { if (options.password) await sql`PRAGMA key = ${sql.ref(options.password)}`.execute(db); - - const migrator = new Migrator({ - db, - provider: new NNMigrationProvider() - }); - await sql`PRAGMA journal_mode = ${sql.raw( options.journalMode || "WAL" )}`.execute(db); @@ -309,6 +289,10 @@ export async function createDatabase(name: string, options: SQLiteOptions) { db ); + const migrator = new Migrator({ + db, + provider: new NNMigrationProvider() + }); const { error, results } = await migrator.migrateToLatest(); results?.forEach((it) => { @@ -325,11 +309,35 @@ export async function createDatabase(name: string, options: SQLiteOptions) { return db; } catch (e) { + console.error(e); await db.destroy(); throw e; } } +export type SQLiteOptions = { + dialect: (name: string, init?: () => Promise) => Dialect; + journalMode?: "WAL" | "MEMORY" | "OFF" | "PERSIST" | "TRUNCATE" | "DELETE"; + synchronous?: "normal" | "extra" | "full" | "off"; + lockingMode?: "normal" | "exclusive"; + tempStore?: "memory" | "file" | "default"; + cacheSize?: number; + pageSize?: number; + password?: string; + + skipInitialization?: boolean; +}; +export async function createDatabase(name: string, options: SQLiteOptions) { + const db = new Kysely({ + dialect: options.dialect(name, async () => { + await init(db, options); + }), + plugins: [new SqliteBooleanPlugin()] + }); + if (!options.skipInitialization) return await init(db, options); + return db; +} + export async function changeDatabasePassword( db: Kysely, password?: string