import { IBaseConfig } from '../base/base.config';
import { DBManager, DBRawResult } from '../database/db.manager';
import { UpdateOperatorType } from '../database/db.script';
import { RequestContext } from './request.context';
import { ClassType, TargetType } from "../base/type";
import { BaseProvider } from '../mvc/ioc.decorator';
export { TargetType, ClassType };
/** 扩展基础对象，包含请求上下文的数据库基础能力 */
export declare class BaseObject<CONTEXT extends RequestContext> extends BaseProvider {
    /** 上下文对象 */
    private readonly _context;
    protected static baseConfig: IBaseConfig;
    protected _db?: Record<string, DBManager>;
    constructor(
    /** 上下文对象 */
    _context: RequestContext);
    get context(): CONTEXT;
    onFree(): void;
    logD(data: any | any[] | undefined): void;
    logE(data: any | any[] | undefined): void;
    logW(data: any | any[] | undefined): void;
    logI(data: any | any[] | undefined): void;
    private logSQL;
    /**
     * 初始化数据库连接
     * @description 优先使用 Context 指定的数据库配置
     * @returns
     */
    protected initDB(): DBManager;
    /** 异步执行SQL */
    private asyncExecuteSQL;
    /**
     * 执行SQL查询
     * @param sql
     * @param values
     */
    query(sql: string, values?: any[], onRawResult?: DBRawResult): Promise<any | any[] | undefined>;
    /**
     * 执行SQL查询，返回第1行数据指定字段或第1个字段的值
     * @param sql
     * @param values
     * @param fieldName 字段名称, 默认使用返回数据的第一个字段
     */
    queryValue<T = number | string | number[] | string[]>(sql: string, values?: any[], fieldName?: string, defaultValue?: T, onRawResult?: 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)[], onRawResult?: DBRawResult): Promise<(T | undefined)[]>;
    /**
     * 执行SQL查询
     * @param sql
     * @param values
     */
    queryData<T>(classType: ClassType<T> | undefined, sql: string, values?: any[], onRawResult?: DBRawResult): Promise<T | undefined>;
    /**
     * 执行查询， 返回 Array
     * @param sql sql 语句
     * @param values 查询参数
     */
    queryDatas<T>(classType: ClassType<T>, sql: string, values?: any[], onRawResult?: 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, onRawResult?: DBRawResult): Promise<[T[], number]>;
    /**
     * 执行SQL语句，返回受影响的行数
     * @param sql
     * @param values
     * @returns 返回值 < 0 说明更新失败， = 0 说明没有更改任何数据
     */
    executeSql(sql: string, values?: any[], onRawResult?: DBRawResult): Promise<number>;
    /**
     * 执行SQL插入语句，返回插入成功后的主键ID
     * @param sql
     * @param values 插入失败返回 `undefined`
     */
    insert(sql: string, values?: any[], onRawResult?: DBRawResult): Promise<number | undefined>;
    /**
     * 更新数据
     * @param target 数据对象类
     * @param entity 数据 entity
     * @param options 选项
     * @returns
     */
    updateData<T>(target: TargetType<T>, entity: T, options?: {
        /** 表名 */
        table?: string;
        /** 更新操作类型, 默认 `UpdateOperatorType.cover` */
        operatorType?: UpdateOperatorType;
        /** 原始返回值回调 */
        onRawResult?: DBRawResult;
    }): Promise<boolean>;
    /**
     * 开启事务，在回调中执行 query ，出错自动回滚，正确执行时自动提交事务
     * @param callback 事务开始后，在这个回调中执行query
     * @param onFinish 事务执行完成回调
     */
    transaction<T>(callback: (db: DBManager) => Promise<T>, onFinish?: (value: T | undefined, useTime: number, flag: boolean) => void): Promise<T>;
    /**
     * 生成分页需要的 Limit 条件 SQL 语句
     * @param pageIndex 页码，从1开始
     * @param pageSize 分页大小
     */
    static limit(pageIndex: number | undefined, pageSize: number | undefined): string;
    /**
     * 将字符串数组转化为 SQL 语句 IN 的可选值字符串
     * @param ids 字符串数组
     * @returns ` ('n','n1','n2',...) `
     */
    static tranArrayToInSql(ids: string[]): string;
    /** 抛出异常 */
    err(msg: string, action?: any | undefined, code?: number): never;
    /**
     * Promise包裹器，出错会抛出异常
     * @param promise Promise
     * @param action 动作名称
     * @param errLog 是否输出错误日志，默认 `false`。不输是否输出异常日志，出错时都会抛出错误
     * @param retryCount 执行失败时重试次数，默认 `0`
     * @param retryDelay 执行失败时，重试延时时间(ms)，默认 `100` ms
     * @returns 执行成功时返回 Promise 的返回值
     */
    execute<T>(promise: Promise<T>, action?: string, errLog?: boolean, retryCount?: number, retryDelay?: number): Promise<T>;
    /**
     * 安静的Promise包裹器
     * @param promise Promise
     * @param errLog 是否输出错误日志，默认 `false`
     * @param retryCount 执行失败时重试次数，默认 `0`
     * @param retryDelay 执行失败时，重试延时时间(ms)，默认 `100` ms
     * @returns 执行成功时返回 Promise 的返回值
     */
    executeSilence<T, E = Error>(promise: Promise<T>, errLog?: boolean, retryCount?: number, retryDelay?: number): Promise<[E | undefined, T | undefined]>;
    /**
     * 安静的Promise包裹器
     * @param promise Promise
     * @param context 上下文对象，输出错误日志必须
     * @param errLog 是否输出错误日志，默认 `false`
     * @returns
     */
    static executeSilence<T, E = Error>(promise: Promise<T>, context?: RequestContext, errLog?: boolean): Promise<[E | undefined, T | undefined]>;
    /**
     * 并行执行异步任务
     * 某步出错不影响其他步骤执行
     * 程序执行时间为最长的那个时间
     * @param promises Promise 数组
     * @param context 上下文对象（需要输出错误日志时必传）
     * @param errLog 是否输入错误日志，默认 `true`
     * @returns
     * @author yangyxd
     */
    static executeParaller<T, E = Error>(promises: (Promise<T> | undefined)[], context?: RequestContext, errLog?: boolean): Promise<[E | undefined, (T | undefined)[] | undefined]>;
}
/** 数据库定义, 多个数据库连接配置时，指定当前对象默认数据库配置 Key */
export declare function DataBase(dbConfigKey: string): (target: any) => void;
