Get Kysely adapter almost working...
This commit is contained in:
parent
8ceb63fc89
commit
d799075657
|
@ -0,0 +1,88 @@
|
||||||
|
import {
|
||||||
|
type DatabaseIntrospector,
|
||||||
|
type Dialect,
|
||||||
|
type DialectAdapter,
|
||||||
|
type Driver,
|
||||||
|
Kysely,
|
||||||
|
type QueryCompiler,
|
||||||
|
SqliteAdapter,
|
||||||
|
type SqliteDatabase,
|
||||||
|
type SqliteDialectConfig,
|
||||||
|
SqliteDriver,
|
||||||
|
SqliteIntrospector,
|
||||||
|
SqliteQueryCompiler,
|
||||||
|
type SqliteStatement,
|
||||||
|
} from 'npm:kysely@^0.25.0';
|
||||||
|
|
||||||
|
import type { DB as DenoSqlite } from 'https://deno.land/x/sqlite@v3.7.3/mod.ts';
|
||||||
|
|
||||||
|
class DenoSqliteDatabase implements SqliteDatabase {
|
||||||
|
#db: DenoSqlite;
|
||||||
|
|
||||||
|
constructor(db: DenoSqlite) {
|
||||||
|
this.#db = db;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(): void {
|
||||||
|
this.#db.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare(sql: string): SqliteStatement {
|
||||||
|
return {
|
||||||
|
reader: true,
|
||||||
|
all: (parameters: ReadonlyArray<unknown>) => {
|
||||||
|
console.log(sql);
|
||||||
|
return this.#db.query(sql, parameters as any);
|
||||||
|
},
|
||||||
|
run: (parameters: ReadonlyArray<unknown>) => {
|
||||||
|
this.#db.query(sql, parameters as any);
|
||||||
|
return {
|
||||||
|
changes: this.#db.changes,
|
||||||
|
lastInsertRowid: this.#db.lastInsertRowId,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DenoSqliteDialectConfig extends Omit<SqliteDialectConfig, 'database'> {
|
||||||
|
database: DenoSqlite | (() => Promise<DenoSqlite>);
|
||||||
|
}
|
||||||
|
|
||||||
|
class DenoSqliteDriver extends SqliteDriver {
|
||||||
|
constructor(config: DenoSqliteDialectConfig) {
|
||||||
|
super({
|
||||||
|
...config,
|
||||||
|
database: async () =>
|
||||||
|
new DenoSqliteDatabase(
|
||||||
|
typeof config.database === 'function' ? await config.database() : config.database,
|
||||||
|
),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 { DenoSqliteDatabase, DenoSqliteDialect, type DenoSqliteDialectConfig, DenoSqliteDriver };
|
|
@ -1,4 +1,5 @@
|
||||||
import { Sqlite } from '@/deps.ts';
|
import { builder } from '@/db/builder.ts';
|
||||||
|
import { type Filter, Sqlite } from '@/deps.ts';
|
||||||
import { SignedEvent } from '@/event.ts';
|
import { SignedEvent } from '@/event.ts';
|
||||||
|
|
||||||
interface User {
|
interface User {
|
||||||
|
@ -101,9 +102,15 @@ class DittoDB {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getFilter<K extends number = number>(filter: Filter<K>) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const db = new DittoDB(
|
const db = new DittoDB(
|
||||||
new Sqlite('data/db.sqlite3'),
|
new Sqlite('data/db.sqlite3'),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
console.log(await builder.selectFrom('events').selectAll().limit(1).execute())
|
||||||
|
|
||||||
export { db };
|
export { db };
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
import { Kysely, Sqlite } from '@/deps.ts';
|
||||||
|
import { DenoSqliteDialect } from '../../lib/kysely-deno-sqlite.ts';
|
||||||
|
|
||||||
|
interface Tables {
|
||||||
|
events: EventsTable;
|
||||||
|
tags: TagsTable;
|
||||||
|
users: UsersTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EventsTable {
|
||||||
|
id: string;
|
||||||
|
kind: number;
|
||||||
|
pubkey: string;
|
||||||
|
content: string;
|
||||||
|
created_at: number;
|
||||||
|
tags: string;
|
||||||
|
sig: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface TagsTable {
|
||||||
|
tag: string;
|
||||||
|
value_1: string | null;
|
||||||
|
value_2: string | null;
|
||||||
|
value_3: string | null;
|
||||||
|
event_id: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UsersTable {
|
||||||
|
pubkey: string;
|
||||||
|
username: string;
|
||||||
|
inserted_at: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
const builder = new Kysely<Tables>({
|
||||||
|
dialect: new DenoSqliteDialect({
|
||||||
|
database: new Sqlite('data/db.sqlite3'),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
export { builder };
|
|
@ -50,3 +50,4 @@ export * as secp from 'npm:@noble/secp256k1@^2.0.0';
|
||||||
export { LRUCache } from 'npm:lru-cache@^10.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 { 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 * 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';
|
||||||
|
|
Loading…
Reference in New Issue