import * as Pgcore from "../pgcore/index.ts" import type { AnyPglightDrizzleClient } from "./drizzle-client.ts" import { executeRawSql } from "./execute.ts" export interface DatabaseClientExecuteRawSqlOptions extends Pgcore.DatabaseClientExecuteRawSqlOptions {} export interface DatabaseClientOnceOptions< DrizzleClient extends AnyPglightDrizzleClient = AnyPglightDrizzleClient, Result = unknown, > extends Pgcore.DatabaseClientOnceOptions {} export interface DatabaseClientOptions< DrizzleClient extends AnyPglightDrizzleClient = AnyPglightDrizzleClient, > extends Pgcore.DatabaseClientOptions {} export class DatabaseClient< DrizzleClient extends AnyPglightDrizzleClient = AnyPglightDrizzleClient, > extends Pgcore.DatabaseClient { constructor(options: DatabaseClientOptions) { super(options) } async executeRawSql(options: DatabaseClientExecuteRawSqlOptions): Promise { const { sql } = options const database = this.getDrizzleClient() const result = await executeRawSql({ database, sql }) return result as Result } async close(): Promise { await this.managedDrizzleClient.$client.end() } } export const createDatabaseClient = ( options: DatabaseClientOptions, ): DatabaseClient => { const { drizzleClient } = options const client = new DatabaseClient({ drizzleClient, }) return client } export const isDatabaseClient = < DrizzleClient extends AnyPglightDrizzleClient = AnyPglightDrizzleClient, >( target: unknown, ): target is DatabaseClient => { return target instanceof DatabaseClient }