import type { DatabaseConnection } from '../../driver/database-connection.js';
import type { AbortableOperationOptions } from '../../util/abort.js';
/**
 * Config for the MySQL dialect.
 */
export interface MysqlDialectConfig {
    /**
     * A `mysql2` `Client` constructor, to be used for connecting to the database
     * outside of the `pool` to avoid waiting for an idle connection.
     *
     * This is useful for cancelling queries on the database side.
     */
    controlConnection?: {
        (connectionUri: string): MysqlConnection;
        (config: object): MysqlConnection;
    };
    /**
     * A mysql2 Pool instance or a function that returns one.
     *
     * If a function is provided, it's called once when the first query is executed.
     *
     * https://github.com/sidorares/node-mysql2#using-connection-pools
     */
    pool: MysqlPool | ((options?: AbortableOperationOptions) => Promise<MysqlPool>);
    /**
     * Called once for each created connection.
     */
    onCreateConnection?: (connection: DatabaseConnection, options?: AbortableOperationOptions) => Promise<void>;
    /**
     * Called every time a connection is acquired from the pool.
     */
    onReserveConnection?: (connection: DatabaseConnection, options?: AbortableOperationOptions) => Promise<void>;
}
/**
 * This interface is the subset of mysql2 driver's `Pool` class that
 * kysely needs.
 *
 * We don't use the type from `mysql2` here to not have a dependency to it.
 *
 * https://github.com/sidorares/node-mysql2#using-connection-pools
 */
export interface MysqlPool {
    getConnection(callback: (error: unknown, connection: MysqlPoolConnection) => void): void;
    end(callback: (error: unknown) => void): void;
}
export interface MysqlConnection {
    config: object;
    connect(callback?: (error: unknown) => void): void;
    destroy(): void;
    query(sql: string, parameters: any, callback?: (error: unknown, result: MysqlQueryResult) => void): {
        stream: (options: MysqlStreamOptions) => MysqlStream;
    };
    threadId: number;
}
export type MysqlConectionConstructor = new (opts?: object) => MysqlConnection;
export interface MysqlPoolConnection extends MysqlConnection {
    release(): void;
}
export interface MysqlStreamOptions {
    highWaterMark?: number;
    objectMode?: true;
}
export interface MysqlStream {
    [Symbol.asyncIterator](): any;
}
export interface MysqlOkPacket {
    affectedRows: number;
    changedRows: number;
    insertId: number;
}
export type MysqlQueryResult = MysqlOkPacket | Record<string, unknown>[];
