import mysql, { Pool } from 'mysql2/promise';
/**
 * table d.ts
 */
/**
 * mysql 存储引擎
 */
export type TABLE_ENGINE = 'InnoDB' | 'MyISAM' | 'MEMORY' | 'PERFORMANCE_SCHEMA' | 'MRG_MYISAM' | 'BLACKHOLE' | 'CSV' | 'ARCHIVE';
/**
 * 批量更新类型
 * @DUPLICATE 唯一索引批量更新
 * @CASE_WHEN CASE WHEN THEN 语句批量更新
 * @TEMPORARY 临时表批量更新
 */
export type BATCH_TYPE = 'DUPLICATE' | 'CASE_WHEN' | 'TEMPORARY';
/**
 * 批量唯一索引批量更新参数
 */
export interface BATCH_DUPLICATE {
    type: 'DUPLICATE';
    params: DuplicateUpdateParam;
}
/**
 * CASE WHEN THEN 语句批量更新
 */
export interface BATCH_CASE_WHEN {
    type: 'CASE_WHEN';
    params: BatchUpdateParam;
}
/**
 * CASE WHEN THEN 语句批量更新参数
 */
export interface BatchUpdateParam extends BaseChangeParam {
    /**
     * 条件字段
     */
    conditionField: string;
    /**
     * 数据
     */
    data: IAnyObject[];
}
/**
 * 临时表批量更新
 */
export interface BATCH_TEMPORARY {
    type: 'TEMPORARY';
    params: BatchUpdateParam;
}
/**
 * 批量更新数据参数
 */
export type BATCH_UPDATE_PARAMS = BATCH_DUPLICATE | BATCH_CASE_WHEN | BATCH_TEMPORARY;
/**
 * 表配置
 */
export interface TableOption {
    /**
     * 表名
     */
    tableName: string;
    /**
     * 表字段
     */
    columns: ColumnOption[];
    /**
     * 定义存储文本数据时使用的编码. default: utf8mb4
     */
    charset?: string;
    /**
     * 定义字符排序和比较规则的关键字. default: utf8mb4_0900_bin
     */
    collate?: string;
    /**
     * 存储引擎. default: InnoDB
     */
    engine?: TABLE_ENGINE;
}
/**
 * 表字段类型
 */
export type COLUMN_DATA_TYPE = 'INT' | 'BINARY' | 'BIGINT' | 'BIT' | 'BLOB' | 'CHAR' | 'DATE' | 'DATETIME' | 'DECIMAL' | 'DOUBLE' | 'ENUM' | 'FLOAT' | 'GEOMETRY' | 'GEOMETRYCOLLECTION' | 'INTEGER' | 'JSON' | 'LINESTRING' | 'LONGBLOB' | 'LONGTEXT' | 'MEDIUMBLOB' | 'MEDIUMINT' | 'MEDIUMTEXT' | 'MULTILINESTRING' | 'MULTIPOINT' | 'MULTIPOLYGON' | 'NUMERIC' | 'POINT' | 'POLYGON' | 'REAL' | 'SET' | 'SMALLINT' | 'TEXT' | 'TIME' | 'TIMESTAMP' | 'TINYBLOB' | 'TINYINT' | 'TINYTEXT' | 'VARBINARY' | 'VARCHAR' | 'YEAR';
/**
 * 表字段配置信息
 */
export interface ColumnOption {
    name: string;
    dataType: COLUMN_DATA_TYPE;
    length?: number;
    point?: number;
    primaryKey?: boolean;
    notNull?: boolean;
    unique?: boolean;
    unsigned?: boolean;
    zeroFill?: boolean;
    autoIncrement?: boolean;
    comments?: string;
    defaultValue?: any;
}
/**
 * 日志类型，debug：开发，error：只有错误才抛出日志。none：关闭日志
 */
export type LOG_TYPE = 'debug' | 'error' | 'none';
/**
 * 连接数据配置参数
 */
export interface ConnOption {
    /**
     * 数据库服务host. 默认：127.0.0.1
     */
    host?: string;
    /**
     * 数据库连接端口。 默认：3306
     */
    port?: number;
    /**
     * 数据库连接登录用户名
     */
    user: string;
    /**
     * 数据库连接登录密码
     */
    password: string;
    /**
     * 数据库最大连接数
     */
    connectionLimit?: number;
    /**
     * 数据库名称
     */
    database: string;
    /**
     * 日志输出类型
     */
    log?: LOG_TYPE;
}
/**
 * 表参数配置
 */
export interface TableConfig {
    /**
     * 表名
     */
    name: string;
    /**
     * 表别名
     */
    alias?: string;
}
export interface TransactionChange {
    /**
     * 执行数据插入语句
     *
     * Execute the data insert statement
     */
    insert(v: InsertParam): Promise<mysql.QueryResult>;
    /**
     * 执行数据批量更新语句
     *
     * Execute data batch update statements
     */
    batchUpdate(v: BATCH_UPDATE_PARAMS): Promise<mysql.QueryResult>;
    /**
     * 执行数据删除语句
     *
     * Execute a data delete statement
     */
    delete(v: DeleteParam): Promise<mysql.QueryResult>;
    /**
     * 执行数据更新语句
     *
     * Execute the data update statement
     */
    update(v: UpdateParam): Promise<mysql.QueryResult>;
}
export interface TransactionParams {
    /**
     * 执行查询语句
     *
     * Execute query statement
     * @param v 配置参数信息
     * @returns
     */
    query(v: QueryOption): Promise<IAnyObject[]>;
    /**
     * 执行查询数据详情语句
     *
     * Execute the statement to query data details
     * @param v 参数信息
     */
    detail(v: QueryOption): Promise<IAnyObject | undefined>;
    /**
     * 获取数据总数
     * @param v 参数信息
     */
    count(v: QueryCountOption): Promise<number>;
    /**
     * 数据更新函数
     */
    change: TransactionChange;
}
/**
 * 执行事务函数
 */
export type ExecTransactionFunction = (v: TransactionParams) => Promise<any>;
/**
 * 值类型
 */
export type VALUE_TYPE = string | number | Date | boolean | undefined | null | any[];
/**
 * 查询等式类型
 */
export type CONDITION_EQUATION_TYPE = 'EQUAL' | 'IN' | 'NOT_IN' | 'LIKE' | 'LIKE_UPPER' | 'LIKE_LOWER' | 'NOT' | 'IS_NOT_NULL' | 'IS_NULL' | 'GREATER_THAN_OR_EQUAL' | 'GREATER_THAN' | 'LESS_THAN_OR_EQUAL' | 'LESS_THAN' | 'LESS_THAN';
/**
 * 数据变更基础参数
 */
export interface BaseChangeParam {
    /**
     * 表名
     */
    t: TABLE_TYPE;
}
/**
 * 数据插入新增参数
 */
export interface InsertParam extends BaseChangeParam {
    params: IAnyObject | IAnyObject[];
}
/**
 * 插入唯一约束更新
 */
export interface DuplicateUpdateParam extends BaseChangeParam {
    /**
     * 配置参数
     */
    data: IAnyObject[];
    /**
     * 唯一索引字段名
     */
    unique?: string;
    /**
     * 不更新字段
     */
    excludeField?: string | string[];
}
/**
 * 数据删除参数
 */
export interface DeleteParam extends BaseChangeParam {
    condition: CONDITION_TYPE;
}
/**
 * 数据更新参数
 */
export interface UpdateParam extends BaseChangeParam {
    /**
     * 更新数据
     */
    params: IAnyObject;
    /**
     * 更新条件
     */
    condition: CONDITION_TYPE;
}
/**
 * WHERE 查询条件等式值
 */
export declare enum CONDITION_EQUATION_VALUE {
    EQUAL = "=",
    IN = "IN",
    NOT_IN = "NOT IN",
    LIKE = "LIKE",
    LIKE_UPPER = "LIKE",
    LIKE_LOWER = "LIKE",
    NOT = "!=",
    IS_NOT_NULL = "IS NOT NULL",
    IS_NULL = "IS NULL",
    GREATER_THAN_OR_EQUAL = ">=",
    GREATER_THAN = ">",
    LESS_THAN_OR_EQUAL = "<=",
    LESS_THAN = "<"
}
/**
 * 表单值占位符
 */
export declare enum CONDITION_EQUATION_PLACEHOLDER {
    '=' = "?",
    'IN' = "(?)",
    'NOT IN' = "(?)",
    'LIKE' = "?",
    'NOT' = "?",
    '>=' = "?",
    '>' = "?",
    '<=' = "?",
    '<' = "?"
}
/**
 * 查询条件配置项
 */
export interface ConditionOption {
    /**
     * 匹配值
     */
    value?: VALUE_TYPE;
    /**
     * 等式类型
     */
    type?: CONDITION_EQUATION_TYPE;
    /**
     * 是否为或语句
     */
    or?: boolean;
    /**
     * 表名或表别名
     */
    t?: string;
    /**
     * 子查询
     */
    subquery?: QueryOption;
}
/**
 * 查询数据总数
 */
export interface QueryCountOption {
    /**
     * 表信息
     */
    t: TABLE_OPTION;
    /**
     * 查询条件
     */
    condition?: CONDITION_TYPE;
    /**
     * 统计字段
     */
    fields?: string | COUNT_FIELD_OPTION;
    /**
     * 表连接查询配置信息
     */
    join?: JOIN_PARAM_TYPE | JOIN_PARAM_TYPE[];
}
/**
 * 查询字段配置
 */
export interface FIELD_OPTION {
    /**
     * 字段名
     */
    name: string;
    /**z
     * 字段别名
     */
    alias?: string;
    /**
     * 表名或表别名
     */
    t?: string;
}
/**
 * 查询字段配置
 */
export interface COUNT_FIELD_OPTION {
    /**
     * 字段名
     */
    name: string;
    /**
     * 表名或表别名
     */
    t?: string;
}
/**
 * 查询字段配置类型
 */
export type FIELDS_OPTION = string | FIELD_OPTION | Array<FIELD_OPTION | string>;
export type TABLE_TYPE = string | TableConfig;
export type TABLE_OPTION = TABLE_TYPE | Array<TableConfig | string>;
export type CONDITION_TYPE = Record<string, VALUE_TYPE | ConditionOption | ConditionOption[]>;
export type INSERT_PARAM_TYPE = IAnyObject | IAnyObject[];
export interface JOIN_ON_TYPE {
    /**
     * 连接字段名
     */
    joinField: string;
    /**
     * 主表字段名
     */
    mainField: string;
    /**
     * 主表表名或表别名
     */
    mainTable: string;
}
export interface JOIN_PARAM_TYPE {
    /**
     * 连接方式，默认：INNER JOIN
     */
    type?: 'LEFT' | 'RIGHT';
    /**
     * 连接表配置信息
     */
    t: TABLE_TYPE;
    /**
     * 连接条件配置信息
     */
    on: JOIN_ON_TYPE;
}
export interface OrderByOption {
    /**
     * 数据库字段名
     */
    field: string;
    /**
     * 排序类型
     * ASC | 升序
     * DESC ｜ 降序
     */
    type?: 'ASC' | 'DESC';
}
export interface LIMIT_PARAM {
    /**
     * 开始位置
     */
    start: number;
    /**
     * 查询数量
     */
    length: number;
}
/**
 * 查询语句配置项
 */
export interface QueryOption {
    /**
     * 表信息
     */
    t: TABLE_OPTION;
    /**
     * 查询条件
     */
    condition?: CONDITION_TYPE;
    /**
     * 查询字段
     */
    fields?: FIELDS_OPTION;
    /**
     * 查询条目区间
     */
    limit?: LIMIT_PARAM;
    /**
     * 表连接查询配置信息
     */
    join?: JOIN_PARAM_TYPE | JOIN_PARAM_TYPE[];
    /**
     * 排序
     */
    orderBy?: OrderByOption;
}
type IAnyObject = Record<string, any>;
declare class emysql {
    /**
     * 连接数据库配置
     */
    connConfig?: ConnOption;
    /**
     * 连接池
     */
    pool?: Pool;
    /**
     * 构造函数
     */
    constructor(v: ConnOption);
    /**
     * 创建数据库连接池
     */
    private createPool;
    /**
     * 获取当前连接池连接 （使用后一定要释放资源-connection.release()）
     * @returns mysql.PoolConnection
     */
    private getConnection;
    /**
     * 执行查询语句
     *
     * Execute query statement
     * @param v 配置参数信息
     * @returns
     */
    private execQuery;
    /**
     * 获取连接配置项
     */
    private getConfig;
    private _query;
    private _detail;
    private _count;
    private _insert;
    private _delete;
    private _update;
    private _batch_update;
    private getTransactionFns;
    /**
     * 执行查询数据语句
     *
     * Execute the query data statement
     * @param v 参数信息
     */
    query: (v: QueryOption) => Promise<IAnyObject[]>;
    /**
     * 执行查询数据详情语句
     *
     * Execute the statement to query data details
     * @param v 参数信息
     */
    detail: (v: QueryOption) => Promise<IAnyObject | undefined>;
    /**
     * 获取数据总数
     * @param v 参数信息
     */
    count: (v: QueryCountOption) => Promise<number>;
    /**
     * 数据更新函数
     */
    change: {
        /**
         * 执行数据插入语句
         *
         * Execute the data insert statement
         */
        insert: (v: InsertParam) => Promise<mysql.QueryResult>;
        /**
         * 执行数据删除语句
         *
         * Execute a data delete statement
         */
        delete: (v: DeleteParam) => Promise<mysql.QueryResult>;
        /**
         * 执行数据更新语句
         *
         * Execute the data update statement
         */
        update: (v: UpdateParam) => Promise<mysql.QueryResult>;
        /**
         * 执行数据批量更新语句
         *
         * Execute data batch update statements
         */
        batchUpdate: (v: BATCH_UPDATE_PARAMS) => Promise<mysql.QueryResult>;
    };
    /**
     * 执行事务
     * @param conn 连接
     * @returns
     */
    private execTransaction;
    /**
     * 事务执行函数
     *
     * Transaction executive function
     */
    transaction(fn: ExecTransactionFunction): Promise<any>;
    /**
     * 创建存储过程
     *
     * Create stored procedure
     */
    createStoredProcedure(): Promise<void>;
    /**
     * 调用存储过程
     *
     * Call stored procedure
     */
    callStoredProcedure(): Promise<void>;
    /**
     * 表操作函数
     *
     * Table manipulation function
     */
    table: {
        /**
         * 创建表结构数据
         *
         * Create table structure data
         * @param v 配置参数
         * @returns
         */
        create: (v: TableOption | TableOption[]) => Promise<undefined>;
        /**
         * 清空表数据不记录mysql日志，不可以恢复数据。
         *
         * Clearing table data does not record mysql logs, and data cannot be restored.
         * @param name 表名
         * @returns
         */
        truncate: (name: string) => Promise<undefined>;
        /**
         * 删除表结构
         *
         * Delete table structure
         * @param name 表名
         * @returns
         */
        drop: (name: string) => Promise<undefined>;
        /**
         * 查询表是否存在
         *
         * Check whether the table exists
         * @param name 表名
         * @returns
         */
        exist: (name: string) => Promise<boolean>;
    };
}
export default emysql;
