import { PoolConnection } from "mysql";
import { ClassType } from "../base/type";
import { IMySQLConfig } from './db.mysql.config';
/** 数据库查询原始返回数据回调 */
export declare type DBRawResult = (results: any, insertId: number, affectedRows: number, rows: any[] | undefined) => void;
/**
 * 数据库管理器
 */
export declare class DBManager {
    protected config: IMySQLConfig;
    protected conn?: PoolConnection;
    /**
     * 构造函数
     * @param sqlModel 传入SQL模型
     * @param dataSyncWorker 连接服务
     */
    constructor(config: IMySQLConfig);
    /** 销毁连接 */
    destroy(): void;
    /** 释放连接 */
    release(): void;
    /**
     * 初始化数据库连接 (每次访问con之前都应该调用一下)
     */
    protected initConnection(): Promise<[boolean, PoolConnection]>;
    private doRawResult;
    /**
     * 执行SQL, 返回真实的数据
     * @param sql
     * @param params
     */
    query(sql: string, values?: any[], onRaw?: DBRawResult): Promise<any>;
    /**
     * 执行SQL, 返回第1行数据指定字段或第1个字段的值
     * @param sql
     * @param values
     * @param fieldName
     */
    queryValue<T = number | string>(sql: string, values?: any[], fieldName?: string, defaultValue?: T, onRaw?: DBRawResult): Promise<T | undefined>;
    /**
     * 执行SQL, 返回指定字段的值的数组
     * @param sql
     * @param values
     * @param fieldName 字段名称，或需要的字段数量（从第1个字段开始算）
     */
    queryValues<T = number | string>(sql: string, values?: any[], fieldName?: string[] | number, defaultValue?: (T | undefined)[], onRaw?: DBRawResult): Promise<(T | undefined)[]>;
    /**
     * 执行SQL查询
     * @param sql
     * @param values
     */
    queryData<T>(classType: ClassType<T> | undefined, sql: string, values?: any[], onRaw?: DBRawResult): Promise<T | undefined>;
    /**
     * 执行查询， 返回 Array
     * @param sql sql 语句
     * @param values 查询参数
     */
    queryDatas<T>(classType: ClassType<T>, sql: string, values?: any[], onRaw?: DBRawResult): Promise<T[]>;
    /**
     * 执行查询， 返回 [Array, Count]
     * @param sql sql 语句
     * @param values 查询参数
     * @param countSql 获取总行数的 sql （不设置会自动生成，但某些复杂或特殊情况可能会出错，比如字段列表中中带子查询等），总行数字段名 `rowCount`
     */
    queryDatasAndCount<T>(classType: ClassType<T>, sql: string, values?: any[], countSql?: string, onRaw?: DBRawResult): Promise<[T[], number]>;
    /**
     * 执行SQL语句，返回受影响的行数
     * @param sql
     * @param values
     * @returns 返回值 < 0 说明更新失败， = 0 说明没有更改任何数据
     */
    execute(sql: string, values?: any[], onRaw?: DBRawResult): Promise<number>;
    /**
     * 执行SQL插入语句，返回插入成功后的主键ID
     * @param sql
     * @param values 插入失败返回 `undefined`
     */
    insert(sql: string, values?: any[], onRaw?: DBRawResult): Promise<number | undefined>;
    private _trans;
    /**
     * 开启事务，在回调中执行 query ，出错自动回滚，正确执行时自动提交事务
     * @param callback 事务回调
     * @param onFinish 事务执行完成回调
     */
    transaction<T>(callback?: (db: DBManager) => Promise<T>, onFinish?: (value: T | undefined, useTime: number, flag: boolean) => void): Promise<T>;
}
