import { Connection } from "./connection/connection.ts";import { ConnectionOptions, ConnectionString, createParams,} from "./connection/connection_params.ts";import { Query, QueryArguments, QueryArrayResult, QueryConfig, QueryObjectConfig, QueryObjectResult, QueryResult, ResultType, templateStringToQuery,} from "./query/query.ts";import { isTemplateString } from "./utils.ts";
export class QueryClient { _executeQuery<T extends Array<unknown>>( _query: Query<ResultType.ARRAY>, ): Promise<QueryArrayResult<T>>; _executeQuery<T extends Record<string, unknown>>( _query: Query<ResultType.OBJECT>, ): Promise<QueryObjectResult<T>>; _executeQuery(_query: Query<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: Query<ResultType.ARRAY>; if (typeof query_template_or_config === "string") { query = new Query(query_template_or_config, ResultType.ARRAY, ...args); } else if (isTemplateString(query_template_or_config)) { query = templateStringToQuery( query_template_or_config, args, ResultType.ARRAY, ); } else { query = new Query(query_template_or_config, ResultType.ARRAY); }
return this._executeQuery(query); }
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: Query<ResultType.OBJECT>; if (typeof query_template_or_config === "string") { query = new Query(query_template_or_config, ResultType.OBJECT, ...args); } else if (isTemplateString(query_template_or_config)) { query = templateStringToQuery( query_template_or_config, args, ResultType.OBJECT, ); } else { query = new Query( query_template_or_config as QueryObjectConfig, ResultType.OBJECT, ); }
return this._executeQuery<T>(query); }}
export class Client extends QueryClient { protected _connection: Connection;
constructor(config?: ConnectionOptions | ConnectionString) { super(); this._connection = new Connection(createParams(config)); }
_executeQuery(query: Query<ResultType.ARRAY>): Promise<QueryArrayResult>; _executeQuery(query: Query<ResultType.OBJECT>): Promise<QueryObjectResult>; _executeQuery(query: Query<ResultType>): Promise<QueryResult> { return this._connection.query(query); }
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<ResultType.ARRAY>): Promise<QueryArrayResult>; _executeQuery(query: Query<ResultType.OBJECT>): Promise<QueryObjectResult>; _executeQuery(query: Query<ResultType>): Promise<QueryResult> { return this._connection.query(query); }
async release(): Promise<void> { await this._releaseCallback(); }}