From cbeba4b6f38d7db41f5b9d1f90585af2debaf614 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 5 Feb 2023 16:07:49 +0100 Subject: [PATCH] backend-common: simplify SQLite setup + work around warning Signed-off-by: Patrik Oldsberg --- .../src/database/connectors/sqlite3.ts | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/packages/backend-common/src/database/connectors/sqlite3.ts b/packages/backend-common/src/database/connectors/sqlite3.ts index 5a2dc46f18..e1ed6b18e9 100644 --- a/packages/backend-common/src/database/connectors/sqlite3.ts +++ b/packages/backend-common/src/database/connectors/sqlite3.ts @@ -43,47 +43,53 @@ export function createSqliteDatabaseClient( const knexConfig = buildSqliteDatabaseConfig(dbConfig, overrides); const connConfig = knexConfig.connection as Knex.Sqlite3ConnectionConfig; + const filename = connConfig.filename ?? ':memory:'; + // If storage on disk is used, ensure that the directory exists - if (connConfig.filename && connConfig.filename !== ':memory:') { - const directory = path.dirname(connConfig.filename); + if (filename !== ':memory:') { + const directory = path.dirname(filename); ensureDirSync(directory); } let database: Knex; - if (deps && connConfig.filename === ':memory:') { + if (deps && filename === ':memory:') { // The dev store is used during watch mode to store and restore the database // across reloads. It is only available when running the backend through // `backstage-cli package start`. const devStore = DevDataStore.get(); - const dataKey = `sqlite3-db-${deps.pluginMetadata.getId()}`; if (devStore) { + const dataKey = `sqlite3-db-${deps.pluginMetadata.getId()}`; + + const connectionLoader = async () => { + // If seed data is available, use it tconnectionLoader restore the database + const { data: seedData } = await devStore.load(dataKey); + + return { + ...(knexConfig.connection as Knex.Sqlite3ConnectionConfig), + filename: seedData ?? ':memory:', + }; + }; + database = knexFactory({ ...knexConfig, - connection: async () => { - // If seed data is available, use it to restore the database - const { data: seedData } = await devStore?.load(dataKey); - - return { - ...(knexConfig.connection as Knex.Sqlite3ConnectionConfig), - filename: seedData ?? ':memory:', - }; - }, + connection: Object.assign(connectionLoader, { + // This is a workaround for the knex SQLite driver always warning when using a config loader + filename: ':memory:', + }), }); - } else { - database = knexFactory(knexConfig); - } - if (devStore) { // If the dev store is available we save the database state on shutdown - deps?.lifecycle?.addShutdownHook({ + deps.lifecycle.addShutdownHook({ async fn() { const connection = await database.client.acquireConnection(); const data = connection.serialize(); await devStore.save(dataKey, data); }, }); + } else { + database = knexFactory(knexConfig); } } else { database = knexFactory(knexConfig);