{"version":3,"file":"session.cjs","names":["MsSqlSession","entityKind","NoopLogger","AutoPool","MsSqlPreparedQuery","MsSqlTransaction","sql"],"sources":["../../src/node-mssql/session.ts"],"sourcesContent":["import type { ConnectionPool, IResult, Request } from 'mssql';\nimport mssql from 'mssql';\nimport { once } from 'node:events';\nimport type * as V1 from '~/_relations.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { MsSqlDialect } from '~/mssql-core/dialect.ts';\nimport {\n\tMsSqlPreparedQuery,\n\tMsSqlSession,\n\tMsSqlTransaction,\n\ttype MsSqlTransactionConfig,\n\ttype PreparedQueryConfig,\n\ttype PreparedQueryHKT,\n\ttype PreparedQueryKind,\n\ttype QueryResultHKT,\n} from '~/mssql-core/session.ts';\nimport type { Query } from '~/sql/sql.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { Assume } from '~/utils.ts';\nimport { AutoPool } from './pool.ts';\n\nexport type NodeMsSqlClient = Pick<ConnectionPool, 'request'> | AutoPool;\n\nexport type MsSqlQueryResult<T extends unknown | unknown[] = any> = IResult<T>;\n\nexport interface NodeMsSqlSessionOptions {\n\tlogger?: Logger;\n}\n\nexport class NodeMsSqlSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends V1.TablesRelationalConfig,\n> extends MsSqlSession<\n\tNodeMsSqlQueryResultHKT,\n\tNodeMsSqlPreparedQueryHKT,\n\tTFullSchema,\n\tTSchema\n> {\n\tstatic override readonly [entityKind]: string = 'NodeMsSqlSession';\n\n\tprivate logger: Logger;\n\n\tconstructor(\n\t\tprivate client: NodeMsSqlClient,\n\t\tdialect: MsSqlDialect,\n\t\tprivate schema: V1.RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: NodeMsSqlSessionOptions,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\tprivate async request(params: unknown[]): Promise<Request & { arrayRowMode: boolean }> {\n\t\tconst { client } = this;\n\t\tconst queryClient = is(client, AutoPool) ? await client.$instance() : client as ConnectionPool;\n\t\tconst request = queryClient.request() as Request & { arrayRowMode: boolean };\n\n\t\tfor (const [index, param] of params.entries()) {\n\t\t\trequest.input(`par${index}`, param);\n\t\t}\n\n\t\treturn request;\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tmapper?: (rows: any[]) => any,\n\t): PreparedQueryKind<NodeMsSqlPreparedQueryHKT, T> {\n\t\tconst self = this;\n\n\t\tconst executor = async (params: unknown[] = []) => {\n\t\t\tconst request = await self.request(params);\n\t\t\tif (mode === 'raw') return request.query(query.sql);\n\n\t\t\trequest.arrayRowMode = mode === 'arrays';\n\t\t\treturn request.query<any[]>(query.sql).then((res) => res.recordset);\n\t\t};\n\n\t\tconst iterator = async function*(params: unknown[] = []): AsyncGenerator<any> {\n\t\t\tconst request = await self.request(params);\n\t\t\trequest.stream = true;\n\t\t\trequest.arrayRowMode = mode === 'arrays';\n\n\t\t\tconst stream = request.toReadableStream();\n\n\t\t\trequest.query(query.sql);\n\n\t\t\tfunction dataListener() {\n\t\t\t\tstream.pause();\n\t\t\t}\n\n\t\t\tstream.on('data', dataListener);\n\n\t\t\ttry {\n\t\t\t\tconst onEnd = once(stream, 'end');\n\t\t\t\tconst onError = once(stream, 'error');\n\n\t\t\t\twhile (true) {\n\t\t\t\t\tstream.resume();\n\t\t\t\t\tconst row = await Promise.race([\n\t\t\t\t\t\tonEnd,\n\t\t\t\t\t\tonError,\n\t\t\t\t\t\tnew Promise((resolve) => stream.once('data', resolve)),\n\t\t\t\t\t]);\n\t\t\t\t\tif (row === undefined || (Array.isArray(row) && row.length === 0)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (row instanceof Error) { // oxlint-disable-line drizzle-internal/no-instanceof\n\t\t\t\t\t\tthrow row;\n\t\t\t\t\t}\n\t\t\t\t\tyield row;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tstream.off('data', dataListener);\n\t\t\t\trequest.cancel();\n\t\t\t}\n\t\t};\n\n\t\treturn new MsSqlPreparedQuery<T>(\n\t\t\texecutor,\n\t\t\titerator,\n\t\t\tquery,\n\t\t\tmapper,\n\t\t\tmode,\n\t\t\tthis.logger,\n\t\t) as PreparedQueryKind<NodeMsSqlPreparedQueryHKT, T>;\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: NodeMsSqlTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: MsSqlTransactionConfig,\n\t): Promise<T> {\n\t\tlet queryClient = this.client as ConnectionPool;\n\n\t\tif (is(this.client, AutoPool)) {\n\t\t\tqueryClient = await this.client.$instance();\n\t\t}\n\n\t\tconst mssqlTransaction = queryClient.transaction();\n\t\tconst session = new NodeMsSqlSession(\n\t\t\tmssqlTransaction,\n\t\t\tthis.dialect,\n\t\t\tthis.schema,\n\t\t\tthis.options,\n\t\t);\n\t\tconst tx = new NodeMsSqlTransaction(\n\t\t\tthis.dialect,\n\t\t\tsession as MsSqlSession<any, any, any, any>,\n\t\t\tthis.schema,\n\t\t\t0,\n\t\t);\n\n\t\tawait mssqlTransaction.begin(\n\t\t\tconfig?.isolationLevel\n\t\t\t\t? isolationLevelMap[config.isolationLevel]\n\t\t\t\t: undefined,\n\t\t);\n\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait mssqlTransaction.commit();\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait mssqlTransaction.rollback();\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class NodeMsSqlTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends V1.TablesRelationalConfig,\n> extends MsSqlTransaction<\n\tNodeMsSqlQueryResultHKT,\n\tNodeMsSqlPreparedQueryHKT,\n\tTFullSchema,\n\tTSchema\n> {\n\tstatic override readonly [entityKind]: string = 'NodeMsSqlTransaction';\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: NodeMsSqlTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new NodeMsSqlTransaction(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\n\t\tawait tx.execute(sql.raw(`save transaction ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback transaction ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nconst isolationLevelMap: Record<\n\tMsSqlTransactionConfig['isolationLevel'],\n\t(typeof mssql.ISOLATION_LEVEL)[keyof (typeof mssql)['ISOLATION_LEVEL']]\n> = {\n\t'read uncommitted': mssql.ISOLATION_LEVEL.READ_UNCOMMITTED,\n\t'read committed': mssql.ISOLATION_LEVEL.READ_COMMITTED,\n\t'repeatable read': mssql.ISOLATION_LEVEL.REPEATABLE_READ,\n\tserializable: mssql.ISOLATION_LEVEL.SERIALIZABLE,\n\tsnapshot: mssql.ISOLATION_LEVEL.SNAPSHOT,\n};\n\nexport interface NodeMsSqlQueryResultHKT extends QueryResultHKT {\n\ttype: MsSqlQueryResult<this['row']>;\n}\n\nexport interface NodeMsSqlPreparedQueryHKT extends PreparedQueryHKT {\n\ttype: MsSqlPreparedQuery<Assume<this['config'], PreparedQueryConfig>>;\n}\n"],"mappings":"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"}