import { Connection, ResultType } from "./connection/connection.ts";import { ConnectionOptions, ConnectionString, createParams,} from "./connection/connection_params.ts";import { Query, QueryArguments, QueryArrayResult, QueryConfig, QueryObjectConfig, QueryObjectResult, QueryResult, templateStringToQuery,} from "./query/query.ts";import { isTemplateString } from "./utils.ts";
export class QueryClient { _executeQuery(_query: Query, _result: ResultType): Promise<QueryResult> { throw new Error( `"${this._executeQuery.name}" hasn't been implemented for class "${this.constructor.name}"`, ); }
queryArray<T extends Array<unknown>>( query: string, ...args: QueryArguments ): Promise<QueryArrayResult<T>>; queryArray<T extends Array<unknown>>( config: QueryConfig, ): Promise<QueryArrayResult<T>>; queryArray<T extends Array<unknown>>( strings: TemplateStringsArray, ...args: QueryArguments ): Promise<QueryArrayResult<T>>; queryArray<T extends Array<unknown> = Array<unknown>>( query_template_or_config: TemplateStringsArray | string | QueryConfig, ...args: QueryArguments ): Promise<QueryArrayResult<T>> { let query; if (typeof query_template_or_config === "string") { query = new Query(query_template_or_config, ...args); } else if (isTemplateString(query_template_or_config)) { query = templateStringToQuery(query_template_or_config, args); } else { query = new Query(query_template_or_config); }
return this._executeQuery( query, ResultType.ARRAY, ) as Promise<QueryArrayResult<T>>; }
queryObject<T extends Record<string, unknown>>( query: string, ...args: QueryArguments ): Promise<QueryObjectResult<T>>; queryObject<T extends Record<string, unknown>>( config: QueryObjectConfig, ): Promise<QueryObjectResult<T>>; queryObject<T extends Record<string, unknown>>( query: TemplateStringsArray, ...args: QueryArguments ): Promise<QueryObjectResult<T>>; queryObject< T extends Record<string, unknown> = Record<string, unknown>, >( query_template_or_config: | string | QueryObjectConfig | TemplateStringsArray, ...args: QueryArguments ): Promise<QueryObjectResult<T>> { let query; if (typeof query_template_or_config === "string") { query = new Query(query_template_or_config, ...args); } else if (isTemplateString(query_template_or_config)) { query = templateStringToQuery(query_template_or_config, args); } else { query = new Query(query_template_or_config as QueryObjectConfig); }
return this._executeQuery( query, ResultType.OBJECT, ) as Promise<QueryObjectResult<T>>; }}
export class Client extends QueryClient { protected _connection: Connection;
constructor(config?: ConnectionOptions | ConnectionString) { super(); this._connection = new Connection(createParams(config)); }
_executeQuery(query: Query, result: ResultType): Promise<QueryResult> { return this._connection.query(query, result); }
async connect(): Promise<void> { await this._connection.startup(); }
async end(): Promise<void> { await this._connection.end(); }}
export class PoolClient extends QueryClient { protected _connection: Connection; private _releaseCallback: () => void;
constructor(connection: Connection, releaseCallback: () => void) { super(); this._connection = connection; this._releaseCallback = releaseCallback; }
_executeQuery(query: Query, result: ResultType): Promise<QueryResult> { return this._connection.query(query, result); }
async release(): Promise<void> { await this._releaseCallback(); }}