{"version":3,"file":"session.cjs","names":["entityKind","DrizzleQueryError","sql","MsSqlDatabase","TransactionRollbackError"],"sources":["../../src/mssql-core/session.ts"],"sourcesContent":["import type * as V1 from '~/_relations.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport type { Logger } from '~/logger.ts';\nimport type { PreparedQuery as PreparedQueryBase } from '~/session.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport type { Assume, Equal } from '~/utils.ts';\nimport { MsSqlDatabase } from './db.ts';\nimport type { MsSqlDialect } from './dialect.ts';\n\nexport interface QueryResultHKT {\n\treadonly $brand: 'MsSqlQueryRowHKT';\n\treadonly row: unknown;\n\treadonly type: unknown;\n}\n\nexport interface AnyQueryResultHKT extends QueryResultHKT {\n\treadonly type: any;\n}\n\nexport type QueryResultKind<TKind extends QueryResultHKT, TRow> = (TKind & {\n\treadonly row: TRow;\n})['type'];\n\nexport interface PreparedQueryConfig {\n\texecute: unknown;\n\titerator: unknown;\n}\n\nexport interface PreparedQueryHKT {\n\treadonly $brand: 'MsSqlPreparedQueryHKT';\n\treadonly config: unknown;\n\treadonly type: unknown;\n}\n\nexport type PreparedQueryKind<\n\tTKind extends PreparedQueryHKT,\n\tTConfig extends PreparedQueryConfig,\n\tTAssume extends boolean = false,\n> = Equal<TAssume, true> extends true\n\t? Assume<(TKind & { readonly config: TConfig })['type'], MsSqlBasePreparedQuery<TConfig>>\n\t: (TKind & { readonly config: TConfig })['type'];\n\nexport abstract class MsSqlBasePreparedQuery<T extends PreparedQueryConfig> implements PreparedQueryBase {\n\tstatic readonly [entityKind]: string = 'MsSqlBasePreparedQuery';\n\n\tconstructor(\n\t\tprotected query: Query,\n\t) {}\n\n\tgetQuery(): Query {\n\t\treturn this.query;\n\t}\n\n\tabstract execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;\n\n\tabstract iterator(placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']>;\n}\n\nexport class MsSqlPreparedQuery<T extends PreparedQueryConfig> extends MsSqlBasePreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'MsSqlPreparedQuery';\n\n\t/** @internal */\n\treadonly mapper: {\n\t\t(rows: any[]): any;\n\t\tbody?: string;\n\t} | undefined;\n\n\tconstructor(\n\t\tprotected executor: (params?: unknown[]) => Promise<any>,\n\t\tprotected _iterator: ((params?: unknown[]) => AsyncGenerator<any>) | undefined,\n\t\tquery: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\treadonly mode: 'arrays' | 'objects' | 'raw',\n\t\tprotected logger: Logger,\n\t) {\n\t\tsuper(query);\n\t\tthis.mapper = mapper;\n\t}\n\n\toverride async execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n\t\tconst { query, logger, executor, mapper } = this;\n\t\tconst params = query.params.length === 0\n\t\t\t? query.params\n\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(query.sql, params);\n\n\t\tconst res = executor(params).catch((e) => {\n\t\t\tthrow new DrizzleQueryError(query.sql, params, e as Error);\n\t\t});\n\t\tif (!mapper) return res;\n\n\t\treturn res.then((rows) => mapper(rows));\n\t}\n\n\toverride async *iterator(placeholderValues: Record<string, unknown> = {}): AsyncGenerator<T['iterator']> {\n\t\tconst { query, logger, executor, _iterator, mapper } = this;\n\t\tconst params = query.params.length === 0\n\t\t\t? query.params\n\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(query.sql, params);\n\n\t\tif (_iterator) {\n\t\t\ttry {\n\t\t\t\tif (mapper) {\n\t\t\t\t\tfor await (const row of _iterator(params)) {\n\t\t\t\t\t\tconst mapped = mapper([row]);\n\t\t\t\t\t\tyield Array.isArray(mapped) ? mapped[0] : mapped;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfor await (const row of _iterator(params)) {\n\t\t\t\t\tyield row as Awaited<T['iterator']>;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(query.sql, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// Fallback for compatibility between drivers\n\t\tconst rows = await executor(params).catch((e) => {\n\t\t\tthrow new DrizzleQueryError(query.sql, params, e as Error);\n\t\t});\n\n\t\tif (mapper) {\n\t\t\tfor (const row of rows) {\n\t\t\t\tconst mapped = mapper([row]);\n\t\t\t\tyield Array.isArray(mapped) ? mapped[0] : mapped;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const row of rows) {\n\t\t\tyield row;\n\t\t}\n\t}\n}\n\nexport interface MsSqlTransactionConfig {\n\tisolationLevel: 'read uncommitted' | 'read committed' | 'repeatable read' | 'serializable' | 'snapshot';\n}\n\nexport abstract class MsSqlSession<\n\tTQueryResult extends QueryResultHKT = QueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends V1.TablesRelationalConfig = Record<string, never>,\n> {\n\tstatic readonly [entityKind]: string = 'MsSqlSession';\n\n\tconstructor(protected dialect: MsSqlDialect) {}\n\n\tabstract prepareQuery<T extends PreparedQueryConfig, TPreparedQueryHKT extends PreparedQueryHKT>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tmapper?: (rows: any[]) => any,\n\t): PreparedQueryKind<TPreparedQueryHKT, T>;\n\n\texecute<T>(query: SQL): Promise<T> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }, PreparedQueryHKTBase>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t'raw',\n\t\t).execute();\n\t}\n\n\tarrays<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T[] }, PreparedQueryHKTBase>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t'arrays',\n\t\t).execute();\n\t}\n\n\tobjects<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T[] }, PreparedQueryHKTBase>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t'objects',\n\t\t).execute();\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: MsSqlTransaction<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: MsSqlTransactionConfig,\n\t): Promise<T>;\n\n\tprotected getSetTransactionSQL(config: MsSqlTransactionConfig): SQL | undefined {\n\t\tconst parts: string[] = [];\n\n\t\tif (config.isolationLevel) {\n\t\t\tparts.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\n\t\treturn parts.length ? sql`set transaction ${sql.raw(parts.join(' '))}` : undefined;\n\t}\n\n\tprotected getStartTransactionSQL(_config: MsSqlTransactionConfig): SQL | undefined {\n\t\treturn sql`begin transaction`;\n\t}\n}\n\nexport abstract class MsSqlTransaction<\n\tTQueryResult extends QueryResultHKT,\n\tTPreparedQueryHKT extends PreparedQueryHKTBase,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends V1.TablesRelationalConfig = Record<string, never>,\n> extends MsSqlDatabase<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'MsSqlTransaction';\n\n\tconstructor(\n\t\tdialect: MsSqlDialect,\n\t\tsession: MsSqlSession,\n\t\tprotected schema: V1.RelationalSchemaConfig<TSchema> | undefined,\n\t\tprotected readonly nestedIndex: number,\n\t) {\n\t\tsuper(dialect, session, schema);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** Nested transactions (aka savepoints) only work with InnoDB engine. */\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: MsSqlTransaction<TQueryResult, TPreparedQueryHKT, TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport interface PreparedQueryHKTBase extends PreparedQueryHKT {\n\ttype: MsSqlBasePreparedQuery<Assume<this['config'], PreparedQueryConfig>>;\n}\n"],"mappings":";;;;;;;;AA2CA,IAAsB,yBAAtB,MAAyG;CACxG,QAAiBA,0BAAsB;CAEvC,YACC,AAAU,OACT;EADS;;CAGX,WAAkB;AACjB,SAAO,KAAK;;;AAQd,IAAa,qBAAb,cAAuE,uBAA0B;CAChG,QAA0BA,0BAAsB;;CAGhD,AAAS;CAKT,YACC,AAAU,UACV,AAAU,WACV,OACA,QACA,AAAS,MACT,AAAU,QACT;AACD,QAAM,MAAM;EAPF;EACA;EAGD;EACC;AAGV,OAAK,SAAS;;CAGf,MAAe,QAAQ,oBAA6C,EAAE,EAAyB;EAC9F,MAAM,EAAE,OAAO,QAAQ,UAAU,WAAW;EAC5C,MAAM,SAAS,MAAM,OAAO,WAAW,IACpC,MAAM,4CACW,MAAM,QAAQ,kBAAkB;AACpD,SAAO,SAAS,MAAM,KAAK,OAAO;EAElC,MAAM,MAAM,SAAS,OAAO,CAAC,OAAO,MAAM;AACzC,SAAM,IAAIC,8BAAkB,MAAM,KAAK,QAAQ,EAAW;IACzD;AACF,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,IAAI,MAAM,SAAS,OAAO,KAAK,CAAC;;CAGxC,OAAgB,SAAS,oBAA6C,EAAE,EAAiC;EACxG,MAAM,EAAE,OAAO,QAAQ,UAAU,WAAW,WAAW;EACvD,MAAM,SAAS,MAAM,OAAO,WAAW,IACpC,MAAM,4CACW,MAAM,QAAQ,kBAAkB;AACpD,SAAO,SAAS,MAAM,KAAK,OAAO;AAElC,MAAI,UACH,KAAI;AACH,OAAI,QAAQ;AACX,eAAW,MAAM,OAAO,UAAU,OAAO,EAAE;KAC1C,MAAM,SAAS,OAAO,CAAC,IAAI,CAAC;AAC5B,WAAM,MAAM,QAAQ,OAAO,GAAG,OAAO,KAAK;;AAG3C;;AAGD,cAAW,MAAM,OAAO,UAAU,OAAO,CACxC,OAAM;AAGP;WACQ,GAAG;AACX,SAAM,IAAIA,8BAAkB,MAAM,KAAK,QAAQ,EAAW;;EAK5D,MAAM,OAAO,MAAM,SAAS,OAAO,CAAC,OAAO,MAAM;AAChD,SAAM,IAAIA,8BAAkB,MAAM,KAAK,QAAQ,EAAW;IACzD;AAEF,MAAI,QAAQ;AACX,QAAK,MAAM,OAAO,MAAM;IACvB,MAAM,SAAS,OAAO,CAAC,IAAI,CAAC;AAC5B,UAAM,MAAM,QAAQ,OAAO,GAAG,OAAO,KAAK;;AAG3C;;AAGD,OAAK,MAAM,OAAO,KACjB,OAAM;;;AAST,IAAsB,eAAtB,MAKE;CACD,QAAiBD,0BAAsB;CAEvC,YAAY,AAAU,SAAuB;EAAvB;;CAQtB,QAAW,OAAwB;AAClC,SAAO,KAAK,aACX,KAAK,QAAQ,WAAW,MAAM,EAC9B,MACA,CAAC,SAAS;;CAGZ,OAAoB,OAA0B;AAC7C,SAAO,KAAK,aACX,KAAK,QAAQ,WAAW,MAAM,EAC9B,SACA,CAAC,SAAS;;CAGZ,QAAqB,OAA0B;AAC9C,SAAO,KAAK,aACX,KAAK,QAAQ,WAAW,MAAM,EAC9B,UACA,CAAC,SAAS;;CAQZ,AAAU,qBAAqB,QAAiD;EAC/E,MAAM,QAAkB,EAAE;AAE1B,MAAI,OAAO,eACV,OAAM,KAAK,mBAAmB,OAAO,iBAAiB;AAGvD,SAAO,MAAM,SAAS,gBAAG,mBAAmBE,iBAAI,IAAI,MAAM,KAAK,IAAI,CAAC,KAAK;;CAG1E,AAAU,uBAAuB,SAAkD;AAClF,SAAO,gBAAG;;;AAIZ,IAAsB,mBAAtB,cAKUC,oCAAqE;CAC9E,QAA0BH,0BAAsB;CAEhD,YACC,SACA,SACA,AAAU,QACV,AAAmB,aAClB;AACD,QAAM,SAAS,SAAS,OAAO;EAHrB;EACS;;CAKpB,WAAkB;AACjB,QAAM,IAAII,sCAA0B"}