import mysql, { type Pool, type PoolConnection, type PoolOptions } from 'mysql2'; import type { Pool as PromisePool, PoolConnection as PromisePoolConnection } from 'mysql2/promise'; import { Readable } from 'stream'; export type Mysql2AsyncQueryLogger = (sql: string, elapsedMs: number, rowsUpdated: number) => void | Promise; export interface Mysql2AsyncOptions { logQueries?: Mysql2AsyncQueryLogger; } export interface DbConfig extends PoolOptions, Mysql2AsyncOptions { skiptzfix?: boolean; } export interface QueryOptions { saveAsPrepared?: boolean; nestTables?: true | '_'; rowsAsArray?: boolean; } export interface StreamOptions extends QueryOptions { highWaterMark?: number; } interface canBeStringed { toString: () => string; } interface BindObject { [keys: string]: BindParam; } type BindParam = boolean | number | string | null | undefined | Date | Buffer | canBeStringed | BindObject; type ColTypes = BindParam; type BindInput = BindParam[] | BindObject; interface StreamIterator { [Symbol.asyncIterator]: () => StreamIterator; next: () => Promise<{ done?: false; value: ReturnType; }>; return: () => Promise<{ done: true; value: ReturnType; }>; } interface GenericReadable extends Readable { [Symbol.asyncIterator]: () => StreamIterator; } export declare class Queryable { protected conn: PoolConnection | Pool; protected promiseConn: PromisePoolConnection | PromisePool; protected options: Mysql2AsyncOptions; constructor(conn: PoolConnection | Pool, options: Mysql2AsyncOptions); query(sql: string, binds?: BindInput, options?: QueryOptions): Promise; getval(sql: string, binds?: BindInput, options?: QueryOptions): Promise; getvals(sql: string, binds?: BindInput, options?: QueryOptions): Promise; getrow(sql: string, binds?: BindInput, options?: QueryOptions): Promise; getall(sql: string, binds?: BindInput, options?: QueryOptions): Promise; execute(sql: string, binds?: BindInput, options?: QueryOptions): Promise; update(sql: string, binds?: BindInput, options?: QueryOptions): Promise; delete(sql: string, binds?: BindInput, options?: QueryOptions): Promise; insert(sql: string, binds?: BindType, options?: QueryOptions): Promise; protected feedStream(stream: GenericReadable, sql: string, binds: BindInput, options?: QueryOptions): void; protected handleStreamOptions(sql: string, bindsOrOptions: any, options?: StreamOptions): { binds: any; queryOptions: QueryOptions; stream: GenericReadable; }; stream(sql: string, options: StreamOptions): GenericReadable; stream(sql: string, binds?: BindInput, options?: StreamOptions): GenericReadable; iterator(sql: string, options: StreamOptions): StreamIterator; iterator(sql: string, binds?: BindInput, options?: StreamOptions): StreamIterator; in(binds: BindInput, newbinds: BindParam[]): string; } export default class Db extends Queryable { protected pool: Pool; constructor(config?: DbConfig); logQueries(logger?: Mysql2AsyncQueryLogger): void; wait(): Promise; transaction(callback: (db: Queryable) => Promise, options?: { retries?: number; retryPause?: number; lockForWrite?: string[] | string; lockForRead?: string[] | string; unlockAfter?: boolean; }): Promise; end(): Promise; } export {};