Import kysely-deno-sqlite as a dep
This commit is contained in:
parent
a4681e7281
commit
ecc9db86dd
|
@ -1,17 +0,0 @@
|
|||
export {
|
||||
CompiledQuery,
|
||||
type DatabaseConnection,
|
||||
type DatabaseIntrospector,
|
||||
type Dialect,
|
||||
type DialectAdapter,
|
||||
type Driver,
|
||||
Kysely,
|
||||
type QueryCompiler,
|
||||
type QueryResult,
|
||||
SqliteAdapter,
|
||||
type SqliteDialectConfig,
|
||||
SqliteIntrospector,
|
||||
SqliteQueryCompiler,
|
||||
} from 'npm:kysely@^0.25.0';
|
||||
|
||||
export type { DB as DenoSqlite } from 'https://deno.land/x/sqlite@v3.7.3/mod.ts';
|
|
@ -1,4 +0,0 @@
|
|||
export { DenoSqliteDialect } from './src/deno-sqlite-dialect.ts';
|
||||
export { DenoSqliteDriver } from './src/deno-sqlite-driver.ts';
|
||||
|
||||
export type { DenoSqliteDialectConfig } from './src/deno-sqlite-dialect-config.ts';
|
|
@ -1,7 +0,0 @@
|
|||
import { type DenoSqlite, type SqliteDialectConfig } from '../deps.ts';
|
||||
|
||||
interface DenoSqliteDialectConfig extends Omit<SqliteDialectConfig, 'database'> {
|
||||
database: DenoSqlite | (() => Promise<DenoSqlite>);
|
||||
}
|
||||
|
||||
export type { DenoSqliteDialectConfig };
|
|
@ -1,41 +0,0 @@
|
|||
import {
|
||||
type DatabaseIntrospector,
|
||||
type Dialect,
|
||||
type DialectAdapter,
|
||||
type Driver,
|
||||
Kysely,
|
||||
type QueryCompiler,
|
||||
SqliteAdapter,
|
||||
SqliteIntrospector,
|
||||
SqliteQueryCompiler,
|
||||
} from '../deps.ts';
|
||||
|
||||
import { DenoSqliteDriver } from './deno-sqlite-driver.ts';
|
||||
|
||||
import type { DenoSqliteDialectConfig } from './deno-sqlite-dialect-config.ts';
|
||||
|
||||
class DenoSqliteDialect implements Dialect {
|
||||
readonly #config: DenoSqliteDialectConfig;
|
||||
|
||||
constructor(config: DenoSqliteDialectConfig) {
|
||||
this.#config = Object.freeze({ ...config });
|
||||
}
|
||||
|
||||
createDriver(): Driver {
|
||||
return new DenoSqliteDriver(this.#config);
|
||||
}
|
||||
|
||||
createQueryCompiler(): QueryCompiler {
|
||||
return new SqliteQueryCompiler();
|
||||
}
|
||||
|
||||
createAdapter(): DialectAdapter {
|
||||
return new SqliteAdapter();
|
||||
}
|
||||
|
||||
createIntrospector(db: Kysely<any>): DatabaseIntrospector {
|
||||
return new SqliteIntrospector(db);
|
||||
}
|
||||
}
|
||||
|
||||
export { DenoSqliteDialect };
|
|
@ -1,106 +0,0 @@
|
|||
import { CompiledQuery, type DatabaseConnection, type DenoSqlite, type Driver, type QueryResult } from '../deps.ts';
|
||||
|
||||
import type { DenoSqliteDialectConfig } from './deno-sqlite-dialect-config.ts';
|
||||
|
||||
class DenoSqliteDriver implements Driver {
|
||||
readonly #config: DenoSqliteDialectConfig;
|
||||
readonly #connectionMutex = new ConnectionMutex();
|
||||
|
||||
#db?: DenoSqlite;
|
||||
#connection?: DatabaseConnection;
|
||||
|
||||
constructor(config: DenoSqliteDialectConfig) {
|
||||
this.#config = Object.freeze({ ...config });
|
||||
}
|
||||
|
||||
async init(): Promise<void> {
|
||||
this.#db = typeof this.#config.database === 'function' ? await this.#config.database() : this.#config.database;
|
||||
|
||||
this.#connection = new DenoSqliteConnection(this.#db);
|
||||
|
||||
if (this.#config.onCreateConnection) {
|
||||
await this.#config.onCreateConnection(this.#connection);
|
||||
}
|
||||
}
|
||||
|
||||
async acquireConnection(): Promise<DatabaseConnection> {
|
||||
// SQLite only has one single connection. We use a mutex here to wait
|
||||
// until the single connection has been released.
|
||||
await this.#connectionMutex.lock();
|
||||
return this.#connection!;
|
||||
}
|
||||
|
||||
async beginTransaction(connection: DatabaseConnection): Promise<void> {
|
||||
await connection.executeQuery(CompiledQuery.raw('begin'));
|
||||
}
|
||||
|
||||
async commitTransaction(connection: DatabaseConnection): Promise<void> {
|
||||
await connection.executeQuery(CompiledQuery.raw('commit'));
|
||||
}
|
||||
|
||||
async rollbackTransaction(connection: DatabaseConnection): Promise<void> {
|
||||
await connection.executeQuery(CompiledQuery.raw('rollback'));
|
||||
}
|
||||
|
||||
// deno-lint-ignore require-await
|
||||
async releaseConnection(): Promise<void> {
|
||||
this.#connectionMutex.unlock();
|
||||
}
|
||||
|
||||
// deno-lint-ignore require-await
|
||||
async destroy(): Promise<void> {
|
||||
this.#db?.close();
|
||||
}
|
||||
}
|
||||
|
||||
class DenoSqliteConnection implements DatabaseConnection {
|
||||
readonly #db: DenoSqlite;
|
||||
|
||||
constructor(db: DenoSqlite) {
|
||||
this.#db = db;
|
||||
}
|
||||
|
||||
executeQuery<O>({ sql, parameters }: CompiledQuery): Promise<QueryResult<O>> {
|
||||
// @ts-expect-error `parameters` types are incompatible, but they should match in reality.
|
||||
const rows = this.#db.queryEntries(sql, parameters);
|
||||
|
||||
const { changes, lastInsertRowId } = this.#db;
|
||||
|
||||
return Promise.resolve({
|
||||
rows: rows as O[],
|
||||
numAffectedRows: BigInt(changes),
|
||||
insertId: BigInt(lastInsertRowId),
|
||||
});
|
||||
}
|
||||
|
||||
// deno-lint-ignore require-yield
|
||||
async *streamQuery<R>(): AsyncIterableIterator<QueryResult<R>> {
|
||||
throw new Error('Sqlite driver doesn\'t support streaming');
|
||||
}
|
||||
}
|
||||
|
||||
class ConnectionMutex {
|
||||
#promise?: Promise<void>;
|
||||
#resolve?: () => void;
|
||||
|
||||
async lock(): Promise<void> {
|
||||
while (this.#promise) {
|
||||
await this.#promise;
|
||||
}
|
||||
|
||||
this.#promise = new Promise((resolve) => {
|
||||
this.#resolve = resolve;
|
||||
});
|
||||
}
|
||||
|
||||
unlock(): void {
|
||||
const resolve = this.#resolve;
|
||||
|
||||
this.#promise = undefined;
|
||||
this.#resolve = undefined;
|
||||
|
||||
resolve?.();
|
||||
}
|
||||
}
|
||||
|
||||
export { DenoSqliteDriver };
|
|
@ -1,5 +1,4 @@
|
|||
import { Kysely, Sqlite } from '@/deps.ts';
|
||||
import { DenoSqliteDialect } from '../../lib/kysely-deno-sqlite/mod.ts';
|
||||
import { DenoSqliteDialect, Kysely, Sqlite } from '@/deps.ts';
|
||||
|
||||
interface Tables {
|
||||
events: EventsTable;
|
||||
|
|
|
@ -50,4 +50,5 @@ export * as secp from 'npm:@noble/secp256k1@^2.0.0';
|
|||
export { LRUCache } from 'npm:lru-cache@^10.0.0';
|
||||
export { DB as Sqlite } from 'https://deno.land/x/sqlite@v3.7.3/mod.ts';
|
||||
export * as dotenv from 'https://deno.land/std@0.197.0/dotenv/mod.ts';
|
||||
export { DummyDriver, Kysely, SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler } from 'npm:kysely@^0.25.0';
|
||||
export { Kysely } from 'npm:kysely@^0.25.0';
|
||||
export { DenoSqliteDialect } from 'https://gitlab.com/soapbox-pub/kysely-deno-sqlite/-/raw/76748303a45fac64a889cd2b9265c6c9b8ef2e8b/mod.ts';
|
||||
|
|
Loading…
Reference in New Issue