{"version":3,"file":"session.cjs","names":["MySqlAsyncSession","entityKind","NoopLogger","NoopCache","MySqlAsyncPreparedQuery","MySqlAsyncTransaction"],"sources":["../../../src/bun-sql/mysql/session.ts"],"sourcesContent":["/// <reference types=\"bun-types\" />\n\nimport type { SavepointSQL, SQL as BunSQL, TransactionSQL } from 'bun';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport { MySqlAsyncPreparedQuery, MySqlAsyncSession, MySqlAsyncTransaction } from '~/mysql-core/async/session.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { MySqlPreparedQueryConfig, MySqlQueryResultHKT, MySqlTransactionConfig } from '~/mysql-core/session.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { Query } from '~/sql/sql.ts';\nexport interface BunMySqlSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class BunMySqlSession<\n\tTSQL extends BunSQL,\n\tTRelations extends AnyRelations,\n> extends MySqlAsyncSession<MySqlQueryResultHKT, TRelations> {\n\tstatic override readonly [entityKind]: string = 'BunMySqlSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\treadonly client: TSQL,\n\t\tdialect: MySqlDialect,\n\t\tprivate relations: TRelations,\n\t\treadonly options: BunMySqlSessionOptions,\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tmapper?: (response: Record<string, unknown>[] | unknown[][] | { insertId: number; affectedRows: number }) => 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\t\tconst { client } = this;\n\n\t\tconst executor = async (params: any[] = []) => {\n\t\t\tconst raw = client.unsafe(query.sql, params);\n\t\t\tif (mode === 'arrays') return raw.values();\n\t\t\tif (mode === 'objects') return raw;\n\t\t\tif (!mapper) return raw;\n\n\t\t\treturn raw.then(({ lastInsertRowid, affectedRows }) => ({\n\t\t\t\tinsertId: lastInsertRowid,\n\t\t\t\taffectedRows: affectedRows,\n\t\t\t}));\n\t\t};\n\n\t\treturn new MySqlAsyncPreparedQuery(\n\t\t\texecutor,\n\t\t\tundefined,\n\t\t\tquery,\n\t\t\tmapper,\n\t\t\tmode,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: BunMySqlTransaction<TRelations>) => Promise<T>,\n\t\tconfig?: MySqlTransactionConfig,\n\t): Promise<T> {\n\t\tconst startTransactionSql = config\n\t\t\t? this.getStartTransactionSQL(config)?.inlineParams().toQuery(this.dialect).sql.slice(18) ?? ''\n\t\t\t: '';\n\n\t\tconst setTransactionSql = config?.isolationLevel\n\t\t\t? this.getSetTransactionSQL(config)?.inlineParams().toQuery(this.dialect).sql\n\t\t\t: undefined;\n\n\t\tconst reserved = await this.client.reserve();\n\n\t\ttry {\n\t\t\tif (setTransactionSql) await reserved.unsafe(setTransactionSql);\n\t\t\tawait reserved.unsafe(`start transaction ${startTransactionSql}`.trimEnd());\n\n\t\t\tconst session = new BunMySqlSession<TransactionSQL, TRelations>(\n\t\t\t\treserved as unknown as TransactionSQL,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.relations,\n\t\t\t\tthis.options,\n\t\t\t);\n\t\t\tconst tx = new BunMySqlTransaction<TRelations>(\n\t\t\t\tthis.dialect,\n\t\t\t\tsession as MySqlAsyncSession<any, any>,\n\t\t\t\tthis.relations,\n\t\t\t\t0,\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst result = await transaction(tx);\n\t\t\t\tawait reserved.unsafe('commit');\n\t\t\t\treturn result;\n\t\t\t} catch (e) {\n\t\t\t\tawait reserved.unsafe('rollback').catch(() => {});\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t} finally {\n\t\t\treserved.release();\n\t\t}\n\t}\n}\n\nexport class BunMySqlTransaction<\n\tTRelations extends AnyRelations,\n> extends MySqlAsyncTransaction<\n\tBunMySqlQueryResultHKT,\n\tTRelations\n> {\n\tstatic override readonly [entityKind]: string = 'BunMySqlTransaction';\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: BunMySqlTransaction<TRelations>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst { client, options } = <BunMySqlSession<TransactionSQL, any>> this.session;\n\n\t\tconst session = new BunMySqlSession<SavepointSQL, TRelations>(\n\t\t\tclient as unknown as SavepointSQL,\n\t\t\tthis.dialect,\n\t\t\tthis.relations,\n\t\t\toptions,\n\t\t);\n\t\tconst tx = new BunMySqlTransaction<TRelations>(\n\t\t\tthis.dialect,\n\t\t\tsession as MySqlAsyncSession<any, any>,\n\t\t\tthis.relations,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\n\t\tconst name = `sp${this.nestedIndex + 1}`;\n\t\tawait client.unsafe(`savepoint ${name}`);\n\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait client.unsafe(`release savepoint ${name}`);\n\t\t\treturn result;\n\t\t} catch (e) {\n\t\t\tawait client.unsafe(`rollback to savepoint ${name}`).catch(() => {});\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport interface BunMySqlQueryResultHKT extends MySqlQueryResultHKT {\n\ttype: Record<string, unknown>[] & Record<string, unknown>;\n}\n"],"mappings":";;;;;;;;AAkBA,IAAa,kBAAb,MAAa,wBAGHA,gDAAmD;CAC5D,QAA0BC,0BAAsB;CAEhD,AAAQ;CACR,AAAQ;CAER,YACC,AAAS,QACT,SACA,AAAQ,WACR,AAAS,SACR;AACD,QAAM,QAAQ;EALL;EAED;EACC;AAGT,OAAK,SAAS,QAAQ,UAAU,IAAIC,wBAAY;AAChD,OAAK,QAAQ,QAAQ,SAAS,IAAIC,iCAAW;;CAG9C,aACC,OACA,MACA,QACA,eAIA,aAC6B;EAC7B,MAAM,EAAE,WAAW;EAEnB,MAAM,WAAW,OAAO,SAAgB,EAAE,KAAK;GAC9C,MAAM,MAAM,OAAO,OAAO,MAAM,KAAK,OAAO;AAC5C,OAAI,SAAS,SAAU,QAAO,IAAI,QAAQ;AAC1C,OAAI,SAAS,UAAW,QAAO;AAC/B,OAAI,CAAC,OAAQ,QAAO;AAEpB,UAAO,IAAI,MAAM,EAAE,iBAAiB,oBAAoB;IACvD,UAAU;IACI;IACd,EAAE;;AAGJ,SAAO,IAAIC,sDACV,UACA,QACA,OACA,QACA,MACA,KAAK,QACL,KAAK,OACL,eACA,YACA;;CAGF,MAAe,YACd,aACA,QACa;EACb,MAAM,sBAAsB,SACzB,KAAK,uBAAuB,OAAO,EAAE,cAAc,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,MAAM,GAAG,IAAI,KAC3F;EAEH,MAAM,oBAAoB,QAAQ,iBAC/B,KAAK,qBAAqB,OAAO,EAAE,cAAc,CAAC,QAAQ,KAAK,QAAQ,CAAC,MACxE;EAEH,MAAM,WAAW,MAAM,KAAK,OAAO,SAAS;AAE5C,MAAI;AACH,OAAI,kBAAmB,OAAM,SAAS,OAAO,kBAAkB;AAC/D,SAAM,SAAS,OAAO,qBAAqB,sBAAsB,SAAS,CAAC;GAE3E,MAAM,UAAU,IAAI,gBACnB,UACA,KAAK,SACL,KAAK,WACL,KAAK,QACL;GACD,MAAM,KAAK,IAAI,oBACd,KAAK,SACL,SACA,KAAK,WACL,EACA;AAED,OAAI;IACH,MAAM,SAAS,MAAM,YAAY,GAAG;AACpC,UAAM,SAAS,OAAO,SAAS;AAC/B,WAAO;YACC,GAAG;AACX,UAAM,SAAS,OAAO,WAAW,CAAC,YAAY,GAAG;AACjD,UAAM;;YAEE;AACT,YAAS,SAAS;;;;AAKrB,IAAa,sBAAb,MAAa,4BAEHC,oDAGR;CACD,QAA0BJ,0BAAsB;CAEhD,MAAe,YACd,aACa;EACb,MAAM,EAAE,QAAQ,YAAmD,KAAK;EAExE,MAAM,UAAU,IAAI,gBACnB,QACA,KAAK,SACL,KAAK,WACL,QACA;EACD,MAAM,KAAK,IAAI,oBACd,KAAK,SACL,SACA,KAAK,WACL,KAAK,cAAc,EACnB;EAED,MAAM,OAAO,KAAK,KAAK,cAAc;AACrC,QAAM,OAAO,OAAO,aAAa,OAAO;AAExC,MAAI;GACH,MAAM,SAAS,MAAM,YAAY,GAAG;AACpC,SAAM,OAAO,OAAO,qBAAqB,OAAO;AAChD,UAAO;WACC,GAAG;AACX,SAAM,OAAO,OAAO,yBAAyB,OAAO,CAAC,YAAY,GAAG;AACpE,SAAM"}