import { Select, Insert, Update } from '@fewer/sq';
import { Migration } from '../Migration';
import ColumnType from '../ColumnType';
interface BaseColumnTypes {
    [columnName: string]: (...args: any[]) => ColumnType | {
        [key: string]: ColumnType;
    };
}
interface BaseTableTypes {
    primaryKey: string;
}
export interface AdapterConfiguration<ColumnTypes extends BaseColumnTypes = any, Configuration = any, DBInstance = any> {
    columnTypes: ColumnTypes;
    connect(config: Configuration): Promise<DBInstance>;
    disconnect(db: DBInstance): Promise<void>;
    select(db: DBInstance, selectContext: Select['context']): Promise<any[]>;
    insert(db: DBInstance, selectContext: Insert['context']): Promise<any>;
    update(db: DBInstance, selectContext: Update['context']): Promise<any>;
    migrate(db: DBInstance, direction: 'up' | 'down', migration: Migration): Promise<any>;
    migrateAddVersion(db: DBInstance, version: string): Promise<void>;
    migrateRemoveVersion(db: DBInstance, version: string): Promise<void>;
    migrateGetVersions(db: DBInstance): Promise<string[]>;
    migrateHasVersion(db: DBInstance, version: string): Promise<boolean>;
    getInfos?(db: DBInstance): Promise<{
        [key: string]: {
            columns: {
                [key: string]: {
                    method: string;
                    arguments: any[];
                };
            };
        };
    }>;
}
export declare class Adapter<TableTypes = any, ColumnTypes = any, DBConfiguration = any, DBInstance = any> {
    TableTypes: TableTypes;
    ColumnTypes: ColumnTypes;
    connected: boolean;
    connection: Promise<DBInstance> | null;
    client: DBInstance | null;
    config: DBConfiguration;
    impl: AdapterConfiguration;
    constructor(config: DBConfiguration, impl: AdapterConfiguration);
    connect(): Promise<void>;
    disconnect(): Promise<void>;
    select(query: Select): Promise<any[]>;
    /**
     * Inserts a new record into the database. Returns the id of the newly-inserted item.
     */
    insert(query: Insert): Promise<any>;
    /**
     * Updates a record in the database. Returns the id of the updated item.
     */
    update(query: Update): Promise<any>;
    migrate(direction: 'up' | 'down', migration: Migration): Promise<any>;
    migrateAddVersion(version: string): Promise<void>;
    migrateRemoveVersion(version: string): Promise<void>;
    migrateGetVersions(): Promise<string[]>;
    migrateHasVersion(version: string): Promise<boolean>;
    getInfos(): Promise<any>;
}
export declare function createAdapter<TableTypes extends BaseTableTypes, ColumnTypes extends BaseColumnTypes, DBConfiguration, DBInstance>(impl: AdapterConfiguration<ColumnTypes, DBConfiguration, DBInstance>): {
    new (config: DBConfiguration): {
        TableTypes: TableTypes;
        ColumnTypes: ColumnTypes;
        connected: boolean;
        connection: Promise<DBInstance> | null;
        client: DBInstance | null;
        config: DBConfiguration;
        impl: AdapterConfiguration<any, any, any>;
        connect(): Promise<void>;
        disconnect(): Promise<void>;
        select(query: Select): Promise<any[]>;
        /**
         * Inserts a new record into the database. Returns the id of the newly-inserted item.
         */
        insert(query: Insert): Promise<any>;
        /**
         * Updates a record in the database. Returns the id of the updated item.
         */
        update(query: Update): Promise<any>;
        migrate(direction: "up" | "down", migration: Migration<any>): Promise<any>;
        migrateAddVersion(version: string): Promise<void>;
        migrateRemoveVersion(version: string): Promise<void>;
        migrateGetVersions(): Promise<string[]>;
        migrateHasVersion(version: string): Promise<boolean>;
        getInfos(): Promise<any>;
    };
};
export {};
