import { MsSqlDialect } from "./dialect.cjs";
import { MsSqlDatabase } from "./db.cjs";
import { entityKind } from "../entity.cjs";
import { Query, SQL } from "../sql/sql.cjs";
import { Assume, Equal } from "../utils.cjs";
import * as V1 from "../_relations.cjs";
import { Logger } from "../logger.cjs";
import { PreparedQuery } from "../session.cjs";

//#region src/mssql-core/session.d.ts
interface QueryResultHKT {
  readonly $brand: 'MsSqlQueryRowHKT';
  readonly row: unknown;
  readonly type: unknown;
}
interface AnyQueryResultHKT extends QueryResultHKT {
  readonly type: any;
}
type QueryResultKind<TKind extends QueryResultHKT, TRow> = (TKind & {
  readonly row: TRow;
})['type'];
interface PreparedQueryConfig {
  execute: unknown;
  iterator: unknown;
}
interface PreparedQueryHKT {
  readonly $brand: 'MsSqlPreparedQueryHKT';
  readonly config: unknown;
  readonly type: unknown;
}
type PreparedQueryKind<TKind extends PreparedQueryHKT, TConfig extends PreparedQueryConfig, TAssume extends boolean = false> = Equal<TAssume, true> extends true ? Assume<(TKind & {
  readonly config: TConfig;
})['type'], MsSqlBasePreparedQuery<TConfig>> : (TKind & {
  readonly config: TConfig;
})['type'];
declare abstract class MsSqlBasePreparedQuery<T extends PreparedQueryConfig> implements PreparedQuery {
  protected query: Query;
  static readonly [entityKind]: string;
  constructor(query: Query);
  getQuery(): Query;
  abstract execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;
  abstract iterator(placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']>;
}
declare class MsSqlPreparedQuery<T extends PreparedQueryConfig> extends MsSqlBasePreparedQuery<T> {
  protected executor: (params?: unknown[]) => Promise<any>;
  protected _iterator: ((params?: unknown[]) => AsyncGenerator<any>) | undefined;
  readonly mode: 'arrays' | 'objects' | 'raw';
  protected logger: Logger;
  static readonly [entityKind]: string;
  constructor(executor: (params?: unknown[]) => Promise<any>, _iterator: ((params?: unknown[]) => AsyncGenerator<any>) | undefined, query: Query, mapper: ((rows: any[]) => any) | undefined, mode: 'arrays' | 'objects' | 'raw', logger: Logger);
  execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;
  iterator(placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']>;
}
interface MsSqlTransactionConfig {
  isolationLevel: 'read uncommitted' | 'read committed' | 'repeatable read' | 'serializable' | 'snapshot';
}
declare abstract class MsSqlSession<TQueryResult extends QueryResultHKT = QueryResultHKT, TPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase, TFullSchema extends Record<string, unknown> = Record<string, never>, TSchema extends V1.TablesRelationalConfig = Record<string, never>> {
  protected dialect: MsSqlDialect;
  static readonly [entityKind]: string;
  constructor(dialect: MsSqlDialect);
  abstract prepareQuery<T extends PreparedQueryConfig, TPreparedQueryHKT extends PreparedQueryHKT>(query: Query, mode: 'arrays' | 'objects' | 'raw', mapper?: (rows: any[]) => any): PreparedQueryKind<TPreparedQueryHKT, T>;
  execute<T>(query: SQL): Promise<T>;
  arrays<T = unknown>(query: SQL): Promise<T[]>;
  objects<T = unknown>(query: SQL): Promise<T[]>;
  abstract transaction<T>(transaction: (tx: MsSqlTransaction<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema>) => Promise<T>, config?: MsSqlTransactionConfig): Promise<T>;
  protected getSetTransactionSQL(config: MsSqlTransactionConfig): SQL | undefined;
  protected getStartTransactionSQL(_config: MsSqlTransactionConfig): SQL | undefined;
}
declare abstract class MsSqlTransaction<TQueryResult extends QueryResultHKT, TPreparedQueryHKT extends PreparedQueryHKTBase, TFullSchema extends Record<string, unknown> = Record<string, never>, TSchema extends V1.TablesRelationalConfig = Record<string, never>> extends MsSqlDatabase<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema> {
  protected schema: V1.RelationalSchemaConfig<TSchema> | undefined;
  protected readonly nestedIndex: number;
  static readonly [entityKind]: string;
  constructor(dialect: MsSqlDialect, session: MsSqlSession, schema: V1.RelationalSchemaConfig<TSchema> | undefined, nestedIndex: number);
  rollback(): never;
  /** Nested transactions (aka savepoints) only work with InnoDB engine. */
  abstract transaction<T>(transaction: (tx: MsSqlTransaction<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema>) => Promise<T>): Promise<T>;
}
interface PreparedQueryHKTBase extends PreparedQueryHKT {
  type: MsSqlBasePreparedQuery<Assume<this['config'], PreparedQueryConfig>>;
}
//#endregion
export { AnyQueryResultHKT, MsSqlBasePreparedQuery, MsSqlPreparedQuery, MsSqlSession, MsSqlTransaction, MsSqlTransactionConfig, PreparedQueryConfig, PreparedQueryHKT, PreparedQueryHKTBase, PreparedQueryKind, QueryResultHKT, QueryResultKind };
//# sourceMappingURL=session.d.cts.map