{"version":3,"file":"session.cjs","names":["entityKind","hasTelemetry","DrizzleQueryError","tracer","CockroachDatabase","TransactionRollbackError","sql"],"sources":["../../src/cockroach-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 } from '~/session.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/index.ts';\nimport { hasTelemetry, tracer } from '~/tracing.ts';\nimport { CockroachDatabase } from './db.ts';\nimport type { CockroachDialect } from './dialect.ts';\n\nexport interface PreparedQueryConfig {\n\texecute: unknown;\n}\n\nexport abstract class CockroachBasePreparedQuery implements PreparedQuery {\n\tstatic readonly [entityKind]: string = 'CockroachBasePreparedQuery';\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>): unknown;\n}\n\nexport class CockroachPreparedQuery<T extends PreparedQueryConfig> extends CockroachBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'CockroachPreparedQuery';\n\n\t/** @internal */\n\treadonly mapper: {\n\t\t(rows: any[]): any;\n\t\tbody?: string;\n\t} | undefined;\n\n\tprivate fastPath: boolean;\n\n\tconstructor(\n\t\tprotected executor: (params?: unknown[]) => Promise<any>,\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\tthis.fastPath = !hasTelemetry;\n\t}\n\n\toverride async execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n\t\tconst { query, logger, executor, mapper, fastPath } = this;\n\n\t\tif (fastPath) {\n\t\t\tconst params = query.params.length === 0\n\t\t\t\t? query.params\n\t\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\tconst res = executor(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(query.sql, params, e as Error);\n\t\t\t});\n\t\t\tif (!mapper) return res;\n\n\t\t\treturn res.then((rows) => mapper(rows));\n\t\t}\n\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues);\n\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\n\t\t\tlogger.logQuery(query.sql, params);\n\n\t\t\tconst rows = tracer.startActiveSpan('drizzle.driver.execute', async (span) => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\n\t\t\t\t// return await so tracer captures time accurately\n\t\t\t\treturn await executor(params).catch((e) => {\n\t\t\t\t\tthrow new DrizzleQueryError(query.sql, params, e as Error);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tif (!mapper) return rows;\n\n\t\t\treturn rows.then((rows) => tracer.startActiveSpan('drizzle.mapResponse', () => mapper(rows as unknown[])));\n\t\t});\n\t}\n}\n\nexport interface CockroachTransactionConfig {\n\tisolationLevel?: 'read uncommitted' | 'read committed' | 'repeatable read' | 'serializable';\n\taccessMode?: 'read only' | 'read write';\n\tdeferrable?: boolean;\n}\n\nexport abstract class CockroachSession<\n\tTQueryResult extends CockroachQueryResultHKT = CockroachQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends V1.TablesRelationalConfig = Record<string, never>,\n> {\n\tstatic readonly [entityKind]: string = 'CockroachSession';\n\n\tconstructor(protected dialect: CockroachDialect) {}\n\n\tabstract prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tname: string | boolean,\n\t\tmapper?: (rows: any[]) => any,\n\t): CockroachPreparedQuery<T>;\n\n\texecute<T>(query: SQL): Promise<T> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\t'raw',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\tarrays<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T[] }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\t'arrays',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\tobjects<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T[] }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\t'objects',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: CockroachTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: CockroachTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class CockroachTransaction<\n\tTQueryResult extends CockroachQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends V1.TablesRelationalConfig = Record<string, never>,\n> extends CockroachDatabase<TQueryResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'CockroachTransaction';\n\n\tconstructor(\n\t\tdialect: CockroachDialect,\n\t\tsession: CockroachSession<any, any, any>,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** @internal */\n\tgetTransactionConfigSQL(config: CockroachTransactionConfig): SQL {\n\t\tconst chunks: string[] = [];\n\t\tif (config.isolationLevel) {\n\t\t\tchunks.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\t\tif (config.accessMode) {\n\t\t\tchunks.push(config.accessMode);\n\t\t}\n\t\tif (typeof config.deferrable === 'boolean') {\n\t\t\tchunks.push(config.deferrable ? 'deferrable' : 'not deferrable');\n\t\t}\n\t\treturn sql.raw(chunks.join(' '));\n\t}\n\n\tsetTransaction(config: CockroachTransactionConfig): Promise<void> {\n\t\treturn this.session.execute(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: CockroachTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport interface CockroachQueryResultHKT {\n\treadonly $brand: 'CockroachQueryResultHKT';\n\treadonly row: unknown;\n\treadonly type: unknown;\n}\n\nexport type CockroachQueryResultKind<TKind extends CockroachQueryResultHKT, TRow> = (TKind & {\n\treadonly row: TRow;\n})['type'];\n"],"mappings":"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"}