@prisma-next/driver-sqlite 0.9.0-dev.2 → 0.9.0-dev.3
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/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +20 -0
- package/dist/runtime.mjs.map +1 -1
- package/package.json +12 -12
- package/src/sqlite-driver.ts +30 -0
package/dist/runtime.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.mts","names":[],"sources":["../src/sqlite-driver.ts","../src/core/runtime-driver.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"runtime.d.mts","names":[],"sources":["../src/sqlite-driver.ts","../src/core/runtime-driver.ts"],"mappings":";;;;;KAeY,aAAA;EAAA,SAA2B,IAAA;EAAA,SAAuB,IAAA;AAAA;AAAA,KAElD,mBAAA,GAAsB,qBAAA,oBAAyC,SAAA,CAAU,aAAA;;;cCX/E,6BAAA,EAA+B,uBAAA,wBAInC,mBAAA"}
|
package/dist/runtime.mjs
CHANGED
|
@@ -43,6 +43,12 @@ var SqliteConnectionImpl = class {
|
|
|
43
43
|
throw normalizeSqliteError(error);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
+
executePrepared(request) {
|
|
47
|
+
return this.execute({
|
|
48
|
+
sql: request.sql,
|
|
49
|
+
params: request.params
|
|
50
|
+
});
|
|
51
|
+
}
|
|
46
52
|
async explain(request) {
|
|
47
53
|
try {
|
|
48
54
|
return { rows: this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`).all(...toSqliteParams(request.params)) };
|
|
@@ -89,6 +95,12 @@ var SqliteTransactionImpl = class {
|
|
|
89
95
|
throw normalizeSqliteError(error);
|
|
90
96
|
}
|
|
91
97
|
}
|
|
98
|
+
executePrepared(request) {
|
|
99
|
+
return this.execute({
|
|
100
|
+
sql: request.sql,
|
|
101
|
+
params: request.params
|
|
102
|
+
});
|
|
103
|
+
}
|
|
92
104
|
async explain(request) {
|
|
93
105
|
try {
|
|
94
106
|
return { rows: this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`).all(...toSqliteParams(request.params)) };
|
|
@@ -158,6 +170,14 @@ var SqliteDriver = class {
|
|
|
158
170
|
} };
|
|
159
171
|
return this.#state.conn.execute(request);
|
|
160
172
|
}
|
|
173
|
+
executePrepared(request) {
|
|
174
|
+
if (this.#state.kind !== "connected") return { [Symbol.asyncIterator]() {
|
|
175
|
+
return { async next() {
|
|
176
|
+
throw driverError("DRIVER.NOT_CONNECTED", NOT_CONNECTED_MESSAGE);
|
|
177
|
+
} };
|
|
178
|
+
} };
|
|
179
|
+
return this.#state.conn.executePrepared(request);
|
|
180
|
+
}
|
|
161
181
|
async explain(request) {
|
|
162
182
|
return this.#requireConnected().conn.explain(request);
|
|
163
183
|
}
|
package/dist/runtime.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.mjs","names":["#db","#state","#requireConnected"],"sources":["../src/sqlite-driver.ts","../src/core/runtime-driver.ts"],"sourcesContent":["import type { SQLInputValue } from 'node:sqlite';\nimport { DatabaseSync } from 'node:sqlite';\nimport type { RuntimeDriverInstance } from '@prisma-next/framework-components/execution';\nimport type {\n SqlConnection,\n SqlDriver,\n SqlDriverState,\n SqlExecuteRequest,\n SqlExplainResult,\n SqlQueryResult,\n SqlTransaction,\n} from '@prisma-next/sql-relational-core/ast';\nimport { normalizeSqliteError } from './normalize-error';\n\nexport type SqliteBinding = { readonly kind: 'path'; readonly path: string };\n\nexport type SqliteRuntimeDriver = RuntimeDriverInstance<'sql', 'sqlite'> & SqlDriver<SqliteBinding>;\n\ninterface DriverRuntimeError extends Error {\n readonly code:\n | 'DRIVER.NOT_CONNECTED'\n | 'DRIVER.ALREADY_CONNECTED'\n | 'DRIVER.EXPLAIN_NOT_SUPPORTED';\n readonly category: 'RUNTIME';\n readonly severity: 'error';\n readonly details?: Record<string, unknown>;\n}\n\nfunction driverError(\n code: DriverRuntimeError['code'],\n message: string,\n details?: Record<string, unknown>,\n): DriverRuntimeError {\n const error = new Error(message) as DriverRuntimeError;\n Object.defineProperty(error, 'name', {\n value: 'RuntimeError',\n configurable: true,\n });\n return Object.assign(error, {\n code,\n category: 'RUNTIME' as const,\n severity: 'error' as const,\n message,\n details,\n });\n}\n\nconst NOT_CONNECTED_MESSAGE =\n 'SQLite driver not connected. Call connect(binding) before acquireConnection or execute.';\nconst ALREADY_CONNECTED_MESSAGE =\n 'SQLite driver already connected. Call close() before reconnecting with a new binding.';\n\nfunction toSqliteParams(params: readonly unknown[] | undefined): SQLInputValue[] {\n return (params ?? []) as SQLInputValue[];\n}\n\nfunction openConnection(path: string): DatabaseSync {\n try {\n const db = new DatabaseSync(path);\n db.exec('PRAGMA foreign_keys = ON');\n db.exec('PRAGMA busy_timeout = 5000');\n return db;\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n}\n\nexport class SqliteConnectionImpl implements SqlConnection {\n readonly #db: DatabaseSync;\n\n constructor(db: DatabaseSync) {\n this.#db = db;\n }\n\n async *execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n try {\n const stmt = this.#db.prepare(request.sql);\n for (const row of stmt.iterate(...toSqliteParams(request.params))) {\n yield row as Row;\n }\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n try {\n const stmt = this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`);\n const rows = stmt.all(...toSqliteParams(request.params)) as ReadonlyArray<\n Record<string, unknown>\n >;\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n try {\n const stmt = this.#db.prepare(sql);\n const rows = stmt.all(...toSqliteParams(params)) as Row[];\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async beginTransaction(): Promise<SqlTransaction> {\n try {\n this.#db.exec('BEGIN');\n return new SqliteTransactionImpl(this.#db);\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async release(): Promise<void> {\n // SQLite connections are not pooled — release is equivalent to destroy\n // (close the underlying DatabaseSync handle).\n return this.destroy();\n }\n\n async destroy(_reason?: unknown): Promise<void> {\n try {\n this.#db.close();\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n}\n\nclass SqliteTransactionImpl implements SqlTransaction {\n readonly #db: DatabaseSync;\n\n constructor(db: DatabaseSync) {\n this.#db = db;\n }\n\n async *execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n try {\n const stmt = this.#db.prepare(request.sql);\n for (const row of stmt.iterate(...toSqliteParams(request.params))) {\n yield row as Row;\n }\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n try {\n const stmt = this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`);\n const rows = stmt.all(...toSqliteParams(request.params)) as ReadonlyArray<\n Record<string, unknown>\n >;\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n try {\n const stmt = this.#db.prepare(sql);\n const rows = stmt.all(...toSqliteParams(params)) as Row[];\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async commit(): Promise<void> {\n try {\n this.#db.exec('COMMIT');\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async rollback(): Promise<void> {\n try {\n this.#db.exec('ROLLBACK');\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n}\n\ninterface ConnectedState {\n readonly kind: 'connected';\n readonly path: string;\n readonly conn: SqliteConnectionImpl;\n}\n\ntype DriverState = { readonly kind: 'unbound' } | ConnectedState | { readonly kind: 'closed' };\n\nexport class SqliteDriver implements SqliteRuntimeDriver {\n readonly familyId = 'sql' as const;\n readonly targetId = 'sqlite' as const;\n\n #state: DriverState;\n\n constructor(initialState?: ConnectedState) {\n this.#state = initialState ?? { kind: 'unbound' };\n }\n\n #requireConnected(): ConnectedState {\n if (this.#state.kind !== 'connected') {\n throw driverError('DRIVER.NOT_CONNECTED', NOT_CONNECTED_MESSAGE);\n }\n return this.#state;\n }\n\n get state(): SqlDriverState {\n return this.#state.kind;\n }\n\n async connect(binding: SqliteBinding): Promise<void> {\n if (this.#state.kind === 'connected') {\n throw driverError('DRIVER.ALREADY_CONNECTED', ALREADY_CONNECTED_MESSAGE, {\n bindingKind: binding.kind,\n });\n }\n this.#state = {\n kind: 'connected',\n path: binding.path,\n conn: new SqliteConnectionImpl(openConnection(binding.path)),\n };\n }\n\n async acquireConnection(): Promise<SqliteConnectionImpl> {\n const { path } = this.#requireConnected();\n return new SqliteConnectionImpl(openConnection(path));\n }\n\n async close(): Promise<void> {\n if (this.#state.kind !== 'connected') return;\n const { conn } = this.#state;\n this.#state = { kind: 'closed' };\n await conn.release();\n }\n\n execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n if (this.#state.kind !== 'connected') {\n return {\n [Symbol.asyncIterator]() {\n return {\n async next() {\n throw driverError('DRIVER.NOT_CONNECTED', NOT_CONNECTED_MESSAGE);\n },\n };\n },\n };\n }\n return this.#state.conn.execute<Row>(request);\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n return this.#requireConnected().conn.explain(request);\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n return this.#requireConnected().conn.query<Row>(sql, params);\n }\n}\n\nexport function createBoundDriverFromBinding(binding: SqliteBinding): SqliteDriver {\n return new SqliteDriver({\n kind: 'connected',\n path: binding.path,\n conn: new SqliteConnectionImpl(openConnection(binding.path)),\n });\n}\n","import type { RuntimeDriverDescriptor } from '@prisma-next/framework-components/execution';\nimport { SqliteDriver, type SqliteRuntimeDriver } from '../sqlite-driver';\nimport { sqliteDriverDescriptorMeta } from './descriptor-meta';\n\nexport type { SqliteRuntimeDriver } from '../sqlite-driver';\n\nconst sqliteRuntimeDriverDescriptor: RuntimeDriverDescriptor<\n 'sql',\n 'sqlite',\n void,\n SqliteRuntimeDriver\n> = {\n ...sqliteDriverDescriptorMeta,\n create(): SqliteRuntimeDriver {\n return new SqliteDriver();\n },\n};\n\nexport default sqliteRuntimeDriverDescriptor;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.mjs","names":["#db","#state","#requireConnected"],"sources":["../src/sqlite-driver.ts","../src/core/runtime-driver.ts"],"sourcesContent":["import type { SQLInputValue } from 'node:sqlite';\nimport { DatabaseSync } from 'node:sqlite';\nimport type { RuntimeDriverInstance } from '@prisma-next/framework-components/execution';\nimport type {\n PreparedExecuteRequest,\n SqlConnection,\n SqlDriver,\n SqlDriverState,\n SqlExecuteRequest,\n SqlExplainResult,\n SqlQueryResult,\n SqlTransaction,\n} from '@prisma-next/sql-relational-core/ast';\nimport { normalizeSqliteError } from './normalize-error';\n\nexport type SqliteBinding = { readonly kind: 'path'; readonly path: string };\n\nexport type SqliteRuntimeDriver = RuntimeDriverInstance<'sql', 'sqlite'> & SqlDriver<SqliteBinding>;\n\ninterface DriverRuntimeError extends Error {\n readonly code:\n | 'DRIVER.NOT_CONNECTED'\n | 'DRIVER.ALREADY_CONNECTED'\n | 'DRIVER.EXPLAIN_NOT_SUPPORTED';\n readonly category: 'RUNTIME';\n readonly severity: 'error';\n readonly details?: Record<string, unknown>;\n}\n\nfunction driverError(\n code: DriverRuntimeError['code'],\n message: string,\n details?: Record<string, unknown>,\n): DriverRuntimeError {\n const error = new Error(message) as DriverRuntimeError;\n Object.defineProperty(error, 'name', {\n value: 'RuntimeError',\n configurable: true,\n });\n return Object.assign(error, {\n code,\n category: 'RUNTIME' as const,\n severity: 'error' as const,\n message,\n details,\n });\n}\n\nconst NOT_CONNECTED_MESSAGE =\n 'SQLite driver not connected. Call connect(binding) before acquireConnection or execute.';\nconst ALREADY_CONNECTED_MESSAGE =\n 'SQLite driver already connected. Call close() before reconnecting with a new binding.';\n\nfunction toSqliteParams(params: readonly unknown[] | undefined): SQLInputValue[] {\n return (params ?? []) as SQLInputValue[];\n}\n\nfunction openConnection(path: string): DatabaseSync {\n try {\n const db = new DatabaseSync(path);\n db.exec('PRAGMA foreign_keys = ON');\n db.exec('PRAGMA busy_timeout = 5000');\n return db;\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n}\n\nexport class SqliteConnectionImpl implements SqlConnection {\n readonly #db: DatabaseSync;\n\n constructor(db: DatabaseSync) {\n this.#db = db;\n }\n\n async *execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n try {\n const stmt = this.#db.prepare(request.sql);\n for (const row of stmt.iterate(...toSqliteParams(request.params))) {\n yield row as Row;\n }\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n executePrepared<Row = Record<string, unknown>>(\n request: PreparedExecuteRequest,\n ): AsyncIterable<Row> {\n return this.execute<Row>({ sql: request.sql, params: request.params });\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n try {\n const stmt = this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`);\n const rows = stmt.all(...toSqliteParams(request.params)) as ReadonlyArray<\n Record<string, unknown>\n >;\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n try {\n const stmt = this.#db.prepare(sql);\n const rows = stmt.all(...toSqliteParams(params)) as Row[];\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async beginTransaction(): Promise<SqlTransaction> {\n try {\n this.#db.exec('BEGIN');\n return new SqliteTransactionImpl(this.#db);\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async release(): Promise<void> {\n // SQLite connections are not pooled — release is equivalent to destroy\n // (close the underlying DatabaseSync handle).\n return this.destroy();\n }\n\n async destroy(_reason?: unknown): Promise<void> {\n try {\n this.#db.close();\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n}\n\nclass SqliteTransactionImpl implements SqlTransaction {\n readonly #db: DatabaseSync;\n\n constructor(db: DatabaseSync) {\n this.#db = db;\n }\n\n async *execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n try {\n const stmt = this.#db.prepare(request.sql);\n for (const row of stmt.iterate(...toSqliteParams(request.params))) {\n yield row as Row;\n }\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n executePrepared<Row = Record<string, unknown>>(\n request: PreparedExecuteRequest,\n ): AsyncIterable<Row> {\n return this.execute<Row>({ sql: request.sql, params: request.params });\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n try {\n const stmt = this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`);\n const rows = stmt.all(...toSqliteParams(request.params)) as ReadonlyArray<\n Record<string, unknown>\n >;\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n try {\n const stmt = this.#db.prepare(sql);\n const rows = stmt.all(...toSqliteParams(params)) as Row[];\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async commit(): Promise<void> {\n try {\n this.#db.exec('COMMIT');\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async rollback(): Promise<void> {\n try {\n this.#db.exec('ROLLBACK');\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n}\n\ninterface ConnectedState {\n readonly kind: 'connected';\n readonly path: string;\n readonly conn: SqliteConnectionImpl;\n}\n\ntype DriverState = { readonly kind: 'unbound' } | ConnectedState | { readonly kind: 'closed' };\n\nexport class SqliteDriver implements SqliteRuntimeDriver {\n readonly familyId = 'sql' as const;\n readonly targetId = 'sqlite' as const;\n\n #state: DriverState;\n\n constructor(initialState?: ConnectedState) {\n this.#state = initialState ?? { kind: 'unbound' };\n }\n\n #requireConnected(): ConnectedState {\n if (this.#state.kind !== 'connected') {\n throw driverError('DRIVER.NOT_CONNECTED', NOT_CONNECTED_MESSAGE);\n }\n return this.#state;\n }\n\n get state(): SqlDriverState {\n return this.#state.kind;\n }\n\n async connect(binding: SqliteBinding): Promise<void> {\n if (this.#state.kind === 'connected') {\n throw driverError('DRIVER.ALREADY_CONNECTED', ALREADY_CONNECTED_MESSAGE, {\n bindingKind: binding.kind,\n });\n }\n this.#state = {\n kind: 'connected',\n path: binding.path,\n conn: new SqliteConnectionImpl(openConnection(binding.path)),\n };\n }\n\n async acquireConnection(): Promise<SqliteConnectionImpl> {\n const { path } = this.#requireConnected();\n return new SqliteConnectionImpl(openConnection(path));\n }\n\n async close(): Promise<void> {\n if (this.#state.kind !== 'connected') return;\n const { conn } = this.#state;\n this.#state = { kind: 'closed' };\n await conn.release();\n }\n\n execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n if (this.#state.kind !== 'connected') {\n return {\n [Symbol.asyncIterator]() {\n return {\n async next() {\n throw driverError('DRIVER.NOT_CONNECTED', NOT_CONNECTED_MESSAGE);\n },\n };\n },\n };\n }\n return this.#state.conn.execute<Row>(request);\n }\n\n executePrepared<Row = Record<string, unknown>>(\n request: PreparedExecuteRequest,\n ): AsyncIterable<Row> {\n if (this.#state.kind !== 'connected') {\n return {\n [Symbol.asyncIterator]() {\n return {\n async next() {\n throw driverError('DRIVER.NOT_CONNECTED', NOT_CONNECTED_MESSAGE);\n },\n };\n },\n };\n }\n return this.#state.conn.executePrepared<Row>(request);\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n return this.#requireConnected().conn.explain(request);\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n return this.#requireConnected().conn.query<Row>(sql, params);\n }\n}\n\nexport function createBoundDriverFromBinding(binding: SqliteBinding): SqliteDriver {\n return new SqliteDriver({\n kind: 'connected',\n path: binding.path,\n conn: new SqliteConnectionImpl(openConnection(binding.path)),\n });\n}\n","import type { RuntimeDriverDescriptor } from '@prisma-next/framework-components/execution';\nimport { SqliteDriver, type SqliteRuntimeDriver } from '../sqlite-driver';\nimport { sqliteDriverDescriptorMeta } from './descriptor-meta';\n\nexport type { SqliteRuntimeDriver } from '../sqlite-driver';\n\nconst sqliteRuntimeDriverDescriptor: RuntimeDriverDescriptor<\n 'sql',\n 'sqlite',\n void,\n SqliteRuntimeDriver\n> = {\n ...sqliteDriverDescriptorMeta,\n create(): SqliteRuntimeDriver {\n return new SqliteDriver();\n },\n};\n\nexport default sqliteRuntimeDriverDescriptor;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/driver-sqlite",
|
|
3
|
-
"version": "0.9.0-dev.
|
|
3
|
+
"version": "0.9.0-dev.3",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@prisma-next/contract": "0.9.0-dev.
|
|
9
|
-
"@prisma-next/errors": "0.9.0-dev.
|
|
10
|
-
"@prisma-next/framework-components": "0.9.0-dev.
|
|
11
|
-
"@prisma-next/sql-contract": "0.9.0-dev.
|
|
12
|
-
"@prisma-next/sql-errors": "0.9.0-dev.
|
|
13
|
-
"@prisma-next/sql-operations": "0.9.0-dev.
|
|
14
|
-
"@prisma-next/sql-relational-core": "0.9.0-dev.
|
|
15
|
-
"@prisma-next/utils": "0.9.0-dev.
|
|
8
|
+
"@prisma-next/contract": "0.9.0-dev.3",
|
|
9
|
+
"@prisma-next/errors": "0.9.0-dev.3",
|
|
10
|
+
"@prisma-next/framework-components": "0.9.0-dev.3",
|
|
11
|
+
"@prisma-next/sql-contract": "0.9.0-dev.3",
|
|
12
|
+
"@prisma-next/sql-errors": "0.9.0-dev.3",
|
|
13
|
+
"@prisma-next/sql-operations": "0.9.0-dev.3",
|
|
14
|
+
"@prisma-next/sql-relational-core": "0.9.0-dev.3",
|
|
15
|
+
"@prisma-next/utils": "0.9.0-dev.3"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@prisma-next/test-utils": "0.9.0-dev.
|
|
19
|
-
"@prisma-next/tsconfig": "0.9.0-dev.
|
|
20
|
-
"@prisma-next/tsdown": "0.9.0-dev.
|
|
18
|
+
"@prisma-next/test-utils": "0.9.0-dev.3",
|
|
19
|
+
"@prisma-next/tsconfig": "0.9.0-dev.3",
|
|
20
|
+
"@prisma-next/tsdown": "0.9.0-dev.3",
|
|
21
21
|
"tsdown": "0.22.0",
|
|
22
22
|
"typescript": "5.9.3",
|
|
23
23
|
"vitest": "4.1.5"
|
package/src/sqlite-driver.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { SQLInputValue } from 'node:sqlite';
|
|
|
2
2
|
import { DatabaseSync } from 'node:sqlite';
|
|
3
3
|
import type { RuntimeDriverInstance } from '@prisma-next/framework-components/execution';
|
|
4
4
|
import type {
|
|
5
|
+
PreparedExecuteRequest,
|
|
5
6
|
SqlConnection,
|
|
6
7
|
SqlDriver,
|
|
7
8
|
SqlDriverState,
|
|
@@ -83,6 +84,12 @@ export class SqliteConnectionImpl implements SqlConnection {
|
|
|
83
84
|
}
|
|
84
85
|
}
|
|
85
86
|
|
|
87
|
+
executePrepared<Row = Record<string, unknown>>(
|
|
88
|
+
request: PreparedExecuteRequest,
|
|
89
|
+
): AsyncIterable<Row> {
|
|
90
|
+
return this.execute<Row>({ sql: request.sql, params: request.params });
|
|
91
|
+
}
|
|
92
|
+
|
|
86
93
|
async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {
|
|
87
94
|
try {
|
|
88
95
|
const stmt = this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`);
|
|
@@ -150,6 +157,12 @@ class SqliteTransactionImpl implements SqlTransaction {
|
|
|
150
157
|
}
|
|
151
158
|
}
|
|
152
159
|
|
|
160
|
+
executePrepared<Row = Record<string, unknown>>(
|
|
161
|
+
request: PreparedExecuteRequest,
|
|
162
|
+
): AsyncIterable<Row> {
|
|
163
|
+
return this.execute<Row>({ sql: request.sql, params: request.params });
|
|
164
|
+
}
|
|
165
|
+
|
|
153
166
|
async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {
|
|
154
167
|
try {
|
|
155
168
|
const stmt = this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`);
|
|
@@ -261,6 +274,23 @@ export class SqliteDriver implements SqliteRuntimeDriver {
|
|
|
261
274
|
return this.#state.conn.execute<Row>(request);
|
|
262
275
|
}
|
|
263
276
|
|
|
277
|
+
executePrepared<Row = Record<string, unknown>>(
|
|
278
|
+
request: PreparedExecuteRequest,
|
|
279
|
+
): AsyncIterable<Row> {
|
|
280
|
+
if (this.#state.kind !== 'connected') {
|
|
281
|
+
return {
|
|
282
|
+
[Symbol.asyncIterator]() {
|
|
283
|
+
return {
|
|
284
|
+
async next() {
|
|
285
|
+
throw driverError('DRIVER.NOT_CONNECTED', NOT_CONNECTED_MESSAGE);
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
},
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return this.#state.conn.executePrepared<Row>(request);
|
|
292
|
+
}
|
|
293
|
+
|
|
264
294
|
async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {
|
|
265
295
|
return this.#requireConnected().conn.explain(request);
|
|
266
296
|
}
|