diff --git a/.changeset/beige-lies-pay.md b/.changeset/beige-lies-pay.md new file mode 100644 index 0000000000..f3d7d70c1f --- /dev/null +++ b/.changeset/beige-lies-pay.md @@ -0,0 +1,11 @@ +--- +'@backstage/backend-common': patch +'@backstage/backend-tasks': patch +'@backstage/plugin-app-backend': patch +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-bazaar-backend': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-scaffolder-backend': patch +--- + +Do some groundwork for supporting the `better-sqlite3` driver, to maybe eventually replace `@vscode/sqlite3` (#9912) diff --git a/packages/backend-common/src/database/connection.ts b/packages/backend-common/src/database/connection.ts index fd0769b8a2..b61aabbecb 100644 --- a/packages/backend-common/src/database/connection.ts +++ b/packages/backend-common/src/database/connection.ts @@ -33,6 +33,7 @@ type DatabaseClient = 'pg' | 'sqlite3' | 'mysql' | 'mysql2' | string; */ const ConnectorMapping: Record = { pg: pgConnector, + 'better-sqlite3': sqlite3Connector, sqlite3: sqlite3Connector, mysql: mysqlConnector, mysql2: mysqlConnector, diff --git a/packages/backend-common/src/database/connectors/sqlite3.ts b/packages/backend-common/src/database/connectors/sqlite3.ts index 8e47720f82..6426005f0e 100644 --- a/packages/backend-common/src/database/connectors/sqlite3.ts +++ b/packages/backend-common/src/database/connectors/sqlite3.ts @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import path from 'path'; - -import { ensureDirSync } from 'fs-extra'; -import knexFactory, { Knex } from 'knex'; import { Config } from '@backstage/config'; +import { ensureDirSync } from 'fs-extra'; +import knexFactory, { Knex } from 'knex'; +import path from 'path'; import { mergeDatabaseConfig } from '../config'; import { DatabaseConnector } from '../types'; diff --git a/packages/backend-tasks/src/tasks/TaskWorker.ts b/packages/backend-tasks/src/tasks/TaskWorker.ts index 991d97b956..5d33bfa7a1 100644 --- a/packages/backend-tasks/src/tasks/TaskWorker.ts +++ b/packages/backend-tasks/src/tasks/TaskWorker.ts @@ -229,10 +229,9 @@ export class TaskWorker { // leaning on the database as a central clock source const dbNull = this.knex.raw('null'); const dt = Duration.fromISO(recurringAtMostEveryDuration).as('seconds'); - const nextRun = - this.knex.client.config.client === 'sqlite3' - ? this.knex.raw('datetime(next_run_start_at, ?)', [`+${dt} seconds`]) - : this.knex.raw(`next_run_start_at + interval '${dt} seconds'`); + const nextRun = this.knex.client.config.client.includes('sqlite3') + ? this.knex.raw('datetime(next_run_start_at, ?)', [`+${dt} seconds`]) + : this.knex.raw(`next_run_start_at + interval '${dt} seconds'`); const rows = await this.knex(DB_TASKS_TABLE) .where('id', '=', this.taskId) diff --git a/packages/backend-tasks/src/tasks/util.ts b/packages/backend-tasks/src/tasks/util.ts index 0509f29363..8b247cdeb8 100644 --- a/packages/backend-tasks/src/tasks/util.ts +++ b/packages/backend-tasks/src/tasks/util.ts @@ -40,7 +40,7 @@ export function nowPlus(duration: Duration | undefined, knex: Knex) { if (!seconds) { return knex.fn.now(); } - return knex.client.config.client === 'sqlite3' + return knex.client.config.client.includes('sqlite3') ? knex.raw(`datetime('now', ?)`, [`${seconds} seconds`]) : knex.raw(`now() + interval '${seconds} seconds'`); } diff --git a/plugins/app-backend/src/lib/assets/StaticAssetsStore.test.ts b/plugins/app-backend/src/lib/assets/StaticAssetsStore.test.ts index 0230486444..95de905e7a 100644 --- a/plugins/app-backend/src/lib/assets/StaticAssetsStore.test.ts +++ b/plugins/app-backend/src/lib/assets/StaticAssetsStore.test.ts @@ -140,10 +140,9 @@ describe('StaticAssetsStore', () => { const updated = await database('static_assets_cache') .where({ path: 'old' }) .update({ - last_modified_at: - database.client.config.client === 'sqlite3' - ? database.raw(`datetime('now', '-3600 seconds')`) - : database.raw(`now() + interval '-3600 seconds'`), + last_modified_at: database.client.config.client.includes('sqlite3') + ? database.raw(`datetime('now', '-3600 seconds')`) + : database.raw(`now() + interval '-3600 seconds'`), }); expect(updated).toBe(1); diff --git a/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts b/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts index 6b393ce036..70d664307e 100644 --- a/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts +++ b/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts @@ -133,7 +133,7 @@ export class StaticAssetsStore implements StaticAssetProvider { .where( 'last_modified_at', '<=', - this.#db.client.config.client === 'sqlite3' + this.#db.client.config.client.includes('sqlite3') ? this.#db.raw(`datetime('now', ?)`, [`-${maxAgeSeconds} seconds`]) : this.#db.raw(`now() + interval '${-maxAgeSeconds} seconds'`), ) diff --git a/plugins/auth-backend/migrations/20210326100300_timestamptz.js b/plugins/auth-backend/migrations/20210326100300_timestamptz.js index 144f450380..79b839dc6a 100644 --- a/plugins/auth-backend/migrations/20210326100300_timestamptz.js +++ b/plugins/auth-backend/migrations/20210326100300_timestamptz.js @@ -21,7 +21,7 @@ */ exports.up = async function up(knex) { // Sqlite does not support alter column. - if (knex.client.config.client !== 'sqlite3') { + if (knex.client.config.client.includes('sqlite3')) { await knex.schema.alterTable('signing_keys', table => { table .timestamp('created_at', { useTz: true, precision: 0 }) @@ -38,7 +38,7 @@ exports.up = async function up(knex) { */ exports.down = async function down(knex) { // Sqlite does not support alter column. - if (knex.client.config.client !== 'sqlite3') { + if (knex.client.config.client.includes('sqlite3')) { await knex.schema.alterTable('signing_keys', table => { table .timestamp('created_at', { useTz: false, precision: 0 }) diff --git a/plugins/bazaar-backend/migrations/20211117092217_optional_entity_ref.js b/plugins/bazaar-backend/migrations/20211117092217_optional_entity_ref.js index 03ed0a8d05..9dd8097ae2 100644 --- a/plugins/bazaar-backend/migrations/20211117092217_optional_entity_ref.js +++ b/plugins/bazaar-backend/migrations/20211117092217_optional_entity_ref.js @@ -15,7 +15,7 @@ */ exports.up = async function up(knex) { - if (knex.client.config.client === 'sqlite3') { + if (knex.client.config.client.includes('sqlite3')) { await knex.schema.dropTable('metadata'); await knex.schema.createTable('metadata', table => { table.increments('id').comment('Automatically generated unique ID'); @@ -93,7 +93,7 @@ exports.up = async function up(knex) { }; exports.down = async function down(knex) { - if (knex.client.config.client === 'sqlite3') { + if (knex.client.config.client.includes('sqlite3')) { await knex.schema.dropTable('metadata'); await knex.schema.createTable('metadata', table => { table diff --git a/plugins/catalog-backend/migrations/20201123205611_relations_table_uniq.js b/plugins/catalog-backend/migrations/20201123205611_relations_table_uniq.js index b3c3a042f5..996c69de8c 100644 --- a/plugins/catalog-backend/migrations/20201123205611_relations_table_uniq.js +++ b/plugins/catalog-backend/migrations/20201123205611_relations_table_uniq.js @@ -20,7 +20,7 @@ * @param {import('knex').Knex} knex */ exports.up = async function up(knex) { - if (knex.client.config.client === 'sqlite3') { + if (knex.client.config.client.includes('sqlite3')) { // sqlite doesn't support dropPrimary so we recreate it properly instead await knex.schema.dropTable('entities_relations'); await knex.schema.createTable('entities_relations', table => { @@ -58,7 +58,7 @@ exports.up = async function up(knex) { * @param {import('knex').Knex} knex */ exports.down = async function down(knex) { - if (knex.client.config.client === 'sqlite3') { + if (knex.client.config.client.includes('sqlite3')) { await knex.schema.dropTable('entities_relations'); await knex.schema.createTable('entities_relations', table => { table.comment('All relations between entities in the catalog'); diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 55f04c289c..7c278e7272 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -403,10 +403,9 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { items.map(i => i.entity_ref), ) .update({ - next_update_at: - tx.client.config.client === 'sqlite3' - ? tx.raw(`datetime('now', ?)`, [`${interval} seconds`]) - : tx.raw(`now() + interval '${interval} seconds'`), + next_update_at: tx.client.config.client.includes('sqlite3') + ? tx.raw(`datetime('now', ?)`, [`${interval} seconds`]) + : tx.raw(`now() + interval '${interval} seconds'`), }); return { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 65b890c265..9fef68529f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -182,7 +182,7 @@ export class DatabaseTaskStore implements TaskStore { .andWhere( 'last_heartbeat_at', '<=', - this.db.client.config.client === 'sqlite3' + this.db.client.config.client.includes('sqlite3') ? this.db.raw(`datetime('now', ?)`, [`-${timeoutS} seconds`]) : this.db.raw(`dateadd('second', ?, ?)`, [ `-${timeoutS}`,