From b67f0b4788e4afa2e37fff6b2e8474d490bcba79 Mon Sep 17 00:00:00 2001 From: Samuel Scheit Date: Thu, 10 Sep 2026 21:04:07 +0200 Subject: [PATCH] fix(example): reset persisted benchmark schema --- example/tests/db.ts | 29 ++++++++----- example/tests/unit/index.ts | 2 + .../unit/specs/benchmarkDatabase.spec.ts | 43 +++++++++++++++++++ 3 files changed, 63 insertions(+), 11 deletions(-) create mode 100644 example/tests/unit/specs/benchmarkDatabase.spec.ts diff --git a/example/tests/db.ts b/example/tests/db.ts index fe3c12b2..1925f962 100644 --- a/example/tests/db.ts +++ b/example/tests/db.ts @@ -55,20 +55,27 @@ const LARGE_DB_NAME = 'large' // Taken from "op-sqlite" example project. // Used to demonstrate the performance of NitroSQLite. const ROWS = 300000 +const LARGE_DB_SCHEMA: BatchQueryCommand[] = [ + { query: 'DROP TABLE IF EXISTS Test;' }, + { + query: + 'CREATE TABLE Test ( id INT PRIMARY KEY, v1 TEXT, v2 TEXT, v3 TEXT, v4 TEXT, v5 TEXT, v6 INT, v7 INT, v8 INT, v9 INT, v10 INT, v11 REAL, v12 REAL, v13 REAL, v14 REAL) STRICT;', + }, +] + +export function resetLargeDbSchema(db: NitroSQLiteConnection) { + db.executeBatch(LARGE_DB_SCHEMA) +} + export let largeDb: NitroSQLiteConnection | undefined export function resetLargeDb() { try { - if (largeDb != null) { - largeDb.close() - largeDb.delete() - } - largeDb = open({ - name: LARGE_DB_NAME, - }) + largeDb ??= open({ name: LARGE_DB_NAME }) - largeDb.execute( - 'CREATE TABLE Test ( id INT PRIMARY KEY, v1 TEXT, v2 TEXT, v3 TEXT, v4 TEXT, v5 TEXT, v6 INT, v7 INT, v8 INT, v9 INT, v10 INT, v11 REAL, v12 REAL, v13 REAL, v14 REAL) STRICT;', - ) + // The database file survives app restarts, while this module state does + // not. Rebuild the benchmark schema every time instead of assuming an + // absent connection means an absent table. + resetLargeDbSchema(largeDb) largeDb.execute('PRAGMA mmap_size=268435456') @@ -99,6 +106,6 @@ export function resetLargeDb() { largeDb.executeBatch(insertions) } catch (e) { - console.warn('Error resetting user database', e) + console.warn('Error resetting large database', e) } } diff --git a/example/tests/unit/index.ts b/example/tests/unit/index.ts index 5a51835b..5d62114e 100644 --- a/example/tests/unit/index.ts +++ b/example/tests/unit/index.ts @@ -6,6 +6,7 @@ import registerExecuteBatchUnitTests from './specs/operations/executeBatch.spec' import registerTypeORMUnitTestsSpecs from './specs/typeorm.spec' import registerDatabaseQueueUnitTests from './specs/DatabaseQueue.spec' import registerSqliteVecUnitTestsSpecs from './specs/sqlite-vec.spec' +import registerBenchmarkDatabaseUnitTests from './specs/benchmarkDatabase.spec' export function registerUnitTests() { beforeEach(setupTestDb) @@ -14,6 +15,7 @@ export function registerUnitTests() { registerExecuteUnitTests() registerTransactionUnitTests() registerExecuteBatchUnitTests() + registerBenchmarkDatabaseUnitTests() }) registerDatabaseQueueUnitTests() diff --git a/example/tests/unit/specs/benchmarkDatabase.spec.ts b/example/tests/unit/specs/benchmarkDatabase.spec.ts new file mode 100644 index 00000000..f4d7078b --- /dev/null +++ b/example/tests/unit/specs/benchmarkDatabase.spec.ts @@ -0,0 +1,43 @@ +import { describe, it } from '@tests/TestApi' +import { expect } from '@tests/unit/common' +import { resetLargeDbSchema } from '@tests/db' +import { open } from 'react-native-nitro-sqlite' + +const DB_NAME = 'benchmark_schema_reset' + +export default function registerBenchmarkDatabaseUnitTests() { + describe('benchmark database', () => { + it('rebuilds an existing benchmark table', () => { + const db = open({ name: DB_NAME }) + + try { + db.execute('DROP TABLE IF EXISTS Test;') + db.execute('CREATE TABLE Test (legacy TEXT);') + + resetLargeDbSchema(db) + + const columns = db.execute('PRAGMA table_info(Test);') + expect(columns.rows?._array.map((column) => column.name)).toEqual([ + 'id', + 'v1', + 'v2', + 'v3', + 'v4', + 'v5', + 'v6', + 'v7', + 'v8', + 'v9', + 'v10', + 'v11', + 'v12', + 'v13', + 'v14', + ]) + } finally { + db.close() + db.delete() + } + }) + }) +}