{"version":3,"file":"session.cjs","names":["MySqlBasePreparedQuery","entityKind","NoopCache","DrizzleQueryError","MySqlSession","MySqlAsyncDatabase","TransactionRollbackError","sql"],"sources":["../../../src/mysql-core/async/session.ts"],"sourcesContent":["import { type Cache, NoopCache, strategyFor } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport type { Logger } from '~/logger.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { upgradeIfNeeded } from '~/up-migrations/mysql.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport type { MySqlDialect } from '../dialect.ts';\nimport {\n\ttype AnyMySqlMapper,\n\tMySqlBasePreparedQuery,\n\ttype MySqlPreparedQueryConfig,\n\ttype MySqlQueryResultHKT,\n\tMySqlSession,\n\ttype MySqlTransactionConfig,\n} from '../session.ts';\nimport { MySqlAsyncDatabase } from './db.ts';\n\nexport class MySqlAsyncPreparedQuery<T extends MySqlPreparedQueryConfig> extends MySqlBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'MySqlAsyncPreparedQuery';\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\tprotected _iterator: ((params?: unknown[]) => AsyncGenerator<any[]>) | undefined,\n\t\tquery: Query,\n\t\tmapper:\n\t\t\t| AnyMySqlMapper\n\t\t\t| undefined,\n\t\treadonly mode: 'arrays' | 'objects' | 'raw',\n\t\tprotected logger: Logger,\n\t\t// cache instance\n\t\tprivate cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprivate queryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig | undefined,\n\t) {\n\t\tsuper(query);\n\t\tthis.mapper = mapper;\n\t\t// it means that no $withCache options were passed and it should be just enabled\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enabled: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enabled) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\n\t\tthis.fastPath = cacheConfig === undefined\n\t\t\t&& (cache === undefined || is(cache, NoopCache));\n\t}\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst cacheStrat = this.cache !== undefined && !is(this.cache, NoopCache)\n\t\t\t? await strategyFor(queryString, params, this.queryMetadata, this.cacheConfig)\n\t\t\t: { type: 'skip' as const };\n\n\t\tif (cacheStrat.type === 'skip') {\n\t\t\treturn query().catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tconst cache = this.cache!;\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (cacheStrat.type === 'invalidate') {\n\t\t\treturn Promise.all([\n\t\t\t\tquery(),\n\t\t\t\tcache.onMutate({ tables: cacheStrat.tables }),\n\t\t\t]).then((res) => res[0]).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tif (cacheStrat.type === 'try') {\n\t\t\tconst { tables, key, isTag, autoInvalidate, config } = cacheStrat;\n\t\t\tconst fromCache = await cache.get(\n\t\t\t\tkey,\n\t\t\t\ttables,\n\t\t\t\tisTag,\n\t\t\t\tautoInvalidate,\n\t\t\t);\n\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tconst result = await query().catch((e) => {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t});\n\t\t\t\t// put actual key\n\t\t\t\tawait cache.put(\n\t\t\t\t\tkey,\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tautoInvalidate ? tables : [],\n\t\t\t\t\tisTag,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\n\t\tassertUnreachable(cacheStrat);\n\t}\n\n\toverride async execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n\t\tconst { query, logger, executor, mapper, fastPath } = this;\n\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\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(sql, params);\n\t\tconst res = fastPath\n\t\t\t? executor(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t})\n\t\t\t: this.queryWithCache(sql, params, () => executor(params));\n\t\tif (!mapper) return res;\n\n\t\treturn res.then((rows) => mapper(rows));\n\t}\n\n\tasync *iterator(placeholderValues: Record<string, unknown> = {}): AsyncGenerator<T['iterator']> {\n\t\tconst { query, logger, executor, _iterator, mapper, fastPath } = this;\n\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\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(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\tyield (mapper([row])[0]);\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(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 (fastPath\n\t\t\t? executor(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t})\n\t\t\t: this.queryWithCache(sql, params, () => executor(params)));\n\n\t\tif (mapper) {\n\t\t\tfor (const row of rows) {\n\t\t\t\tyield mapper([row])[0];\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\n\t\treturn;\n\t}\n}\n\nexport abstract class MySqlAsyncSession<\n\tTQueryResult extends MySqlQueryResultHKT = MySqlQueryResultHKT,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends MySqlSession {\n\tstatic override readonly [entityKind]: string = 'MySqlAsyncSession';\n\n\tabstract override prepareQuery<T extends MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tmapper?: (rows: any) => any,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): MySqlAsyncPreparedQuery<T>;\n\n\toverride execute<T>(query: SQL): Promise<T> {\n\t\treturn this.prepareQuery<MySqlPreparedQueryConfig & { execute: T }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t'raw',\n\t\t).execute();\n\t}\n\n\toverride arrays<T>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<MySqlPreparedQueryConfig & { execute: T[] }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t'arrays',\n\t\t).execute();\n\t}\n\n\toverride objects<T>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<MySqlPreparedQueryConfig & { execute: T[] }>(\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: (\n\t\t\ttx: MySqlAsyncTransaction<TQueryResult, TRelations>,\n\t\t) => Promise<T>,\n\t\tconfig?: MySqlTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class MySqlAsyncTransaction<\n\tTQueryResult extends MySqlQueryResultHKT,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends MySqlAsyncDatabase<TQueryResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'MySqlAsyncTransaction';\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tsession: MySqlAsyncSession,\n\t\tprotected relations: TRelations,\n\t\tprotected readonly nestedIndex: number,\n\t) {\n\t\tsuper(dialect, session, relations);\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: (\n\t\t\ttx: MySqlAsyncTransaction<TQueryResult, TRelations>,\n\t\t) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport async function migrate(\n\tmigrations: MigrationMeta[],\n\tdb: MySqlAsyncDatabase<MySqlQueryResultHKT, any>,\n\tconfig: Omit<MigrationConfig, 'migrationsSchema'>,\n): Promise<void | MigratorInitFailResponse> {\n\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\n\t// Detect DB version and upgrade table schema if needed\n\tconst { newDb } = await upgradeIfNeeded(\n\t\tmigrationsTable,\n\t\tdb.session,\n\t\tmigrations,\n\t);\n\n\tif (newDb) {\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash TEXT NOT NULL,\n\t\t\t\tcreated_at BIGINT,\n\t\t\t\tname TEXT,\n\t\t\t\tapplied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n\t\t\t)\n\t\t`;\n\t\tawait db.session.execute(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = await db.session.objects<{\n\t\tid: number;\n\t\thash: string;\n\t\tcreated_at: string;\n\t\tname: string | null;\n\t}>(\n\t\tsql`select id, hash, created_at, name from ${sql.identifier(migrationsTable)}`,\n\t);\n\n\tif (typeof config === 'object' && config.init) {\n\t\tif (dbMigrations.length) {\n\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t}\n\n\t\tif (migrations.length > 1) {\n\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t}\n\n\t\tconst [migration] = migrations;\n\n\t\tif (!migration) return;\n\n\t\tawait db.session.execute(\n\t\t\tsql`insert into ${\n\t\t\t\tsql.identifier(\n\t\t\t\t\tmigrationsTable,\n\t\t\t\t)\n\t\t\t} (\\`hash\\`, \\`created_at\\`, \\`name\\`) values(${migration.hash}, ${migration.folderMillis}, ${migration.name})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({\n\t\tlocalMigrations: migrations,\n\t\tdbMigrations,\n\t});\n\tawait db.transaction(async (tx) => {\n\t\tfor (const migration of migrationsToRun) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t}\n\t\t\tawait tx.execute(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t)\n\t\t\t\t} (\\`hash\\`, \\`created_at\\`, \\`name\\`) values(${migration.hash}, ${migration.folderMillis}, ${migration.name})`,\n\t\t\t);\n\t\t}\n\t});\n}\n"],"mappings":"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"}