import { MySqlDialect } from "../dialect.cjs";
import { MySqlBasePreparedQuery, MySqlPreparedQueryConfig, MySqlQueryResultHKT, MySqlSession } from "../session.cjs";
import { MySqlEffectDatabase } from "./db.cjs";
import { entityKind } from "../../entity.cjs";
import { Query, SQL } from "../../sql/sql.cjs";
import { MigrationConfig, MigrationMeta } from "../../migrator.cjs";
import { AnyRelations, EmptyRelations } from "../../relations.cjs";
import { WithCacheConfig } from "../../cache/core/types.cjs";
import * as Effect from "effect/Effect";
import { EffectCacheShape } from "../../cache/core/cache-effect.cjs";
import { SqlError } from "effect/unstable/sql/SqlError";
import { EffectTransactionRollbackError, MigratorInitError } from "../../effect-core/errors.cjs";
import { EffectLoggerShape } from "../../effect-core/logger.cjs";
import { QueryEffectHKTBase, QueryEffectKind } from "../../effect-core/query-effect.cjs";

//#region src/mysql-core/effect/session.d.ts
declare class MySqlEffectPreparedQuery<T extends MySqlPreparedQueryConfig, TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase> extends MySqlBasePreparedQuery {
  protected executor: (params?: unknown[]) => Effect.Effect<unknown, unknown, unknown>;
  readonly mode: 'arrays' | 'objects' | 'raw';
  private logger;
  protected cache: EffectCacheShape;
  protected queryMetadata: {
    type: 'select' | 'update' | 'delete' | 'insert';
    tables: string[];
  } | undefined;
  protected cacheConfig: WithCacheConfig | undefined;
  static readonly [entityKind]: string;
  constructor(executor: (params?: unknown[]) => Effect.Effect<unknown, unknown, unknown>, query: Query, mapper: ((rows: any[]) => any) | undefined, mode: 'arrays' | 'objects' | 'raw', logger: EffectLoggerShape, cache: EffectCacheShape, queryMetadata: {
    type: 'select' | 'update' | 'delete' | 'insert';
    tables: string[];
  } | undefined, cacheConfig: WithCacheConfig | undefined);
  execute(placeholderValues?: Record<string, unknown>): QueryEffectKind<TEffectHKT, T['execute']>;
}
declare abstract class MySqlEffectSession<TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, TQueryResult extends MySqlQueryResultHKT = MySqlQueryResultHKT, TRelations extends AnyRelations = EmptyRelations> extends MySqlSession {
  static readonly [entityKind]: string;
  constructor(dialect: MySqlDialect);
  abstract prepareQuery<T extends MySqlPreparedQueryConfig>(query: Query, mode: 'arrays' | 'objects' | 'raw', mapper?: (rows: any) => any, queryMetadata?: {
    type: 'select' | 'update' | 'delete' | 'insert';
    tables: string[];
  }, cacheConfig?: WithCacheConfig): MySqlEffectPreparedQuery<T, TEffectHKT>;
  execute<T>(query: SQL): QueryEffectKind<TEffectHKT, T>;
  arrays<T>(query: SQL): QueryEffectKind<TEffectHKT, T[]>;
  objects<T>(query: SQL): QueryEffectKind<TEffectHKT, T[]>;
  abstract transaction<A, E, R>(transaction: (tx: MySqlEffectTransaction<TEffectHKT, TQueryResult, TRelations>) => Effect.Effect<A, E, R>): Effect.Effect<A, E | SqlError, R>;
}
declare abstract class MySqlEffectTransaction<TEffectHKT extends QueryEffectHKTBase, TQueryResult extends MySqlQueryResultHKT, TRelations extends AnyRelations = EmptyRelations> extends MySqlEffectDatabase<TEffectHKT, TQueryResult, TRelations> {
  protected relations: TRelations;
  protected readonly nestedIndex: number;
  static readonly [entityKind]: string;
  constructor(dialect: MySqlDialect, session: MySqlEffectSession<TEffectHKT, any, any>, relations: TRelations, nestedIndex?: number);
  rollback(): EffectTransactionRollbackError;
  /** Nested transactions (aka savepoints) only work with InnoDB engine. */
  abstract transaction<A, E, R>(transaction: (tx: MySqlEffectTransaction<TEffectHKT, TQueryResult, TRelations>) => Effect.Effect<A, E, R>): Effect.Effect<A, E | SqlError, R>;
}
declare const migrate: <TEffectHKT extends QueryEffectHKTBase>(migrations: MigrationMeta[], session: MySqlEffectSession<TEffectHKT, MySqlQueryResultHKT, EmptyRelations>, config: Omit<MigrationConfig, "migrationsSchema">) => Effect.Effect<undefined, MigratorInitError | SqlError | TEffectHKT["error"], TEffectHKT["context"]>;
//#endregion
export { MySqlEffectPreparedQuery, MySqlEffectSession, MySqlEffectTransaction, migrate };
//# sourceMappingURL=session.d.cts.map