Skip to content
This repository was archived by the owner on Apr 29, 2025. It is now read-only.

Commit 572c6ed

Browse files
committed
feat(db): experimental transaction export
Don't use this if you don't understand it.
1 parent 43e0df4 commit 572c6ed

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

src/database/startTransaction.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { getPoolConnection } from './connection';
2+
import { logError } from '../logger';
3+
import { CFXCallback, CFXParameters } from '../types';
4+
import { setCallback } from '../utils/setCallback';
5+
6+
export const startTransaction = async (
7+
invokingResource: string,
8+
queries: (...args: any[]) => Promise<boolean>,
9+
parameters: CFXParameters,
10+
cb?: CFXCallback,
11+
isPromise?: boolean
12+
) => {
13+
cb = setCallback(parameters, cb);
14+
15+
const conn = await getPoolConnection();
16+
17+
if (!conn) return;
18+
19+
let response = false;
20+
21+
try {
22+
await conn.beginTransaction();
23+
24+
const commit = await queries({
25+
query: async (sql: string, values?: CFXParameters) => {
26+
const [rows] = await conn.query(sql, values);
27+
return rows;
28+
},
29+
});
30+
31+
response = !!commit;
32+
33+
response ? conn.commit() : conn.rollback();
34+
} catch (err: any) {
35+
conn.rollback();
36+
logError(invokingResource, cb, isPromise, err);
37+
} finally {
38+
conn.release();
39+
}
40+
41+
return cb ? cb(response) : response;
42+
};

src/index.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,19 @@ MySQL.transaction = (
7373
rawTransaction(invokingResource, queries, parameters, cb, isPromise);
7474
};
7575

76+
global.exports(
77+
'experimentalTransaction',
78+
async (
79+
transactions: () => Promise<boolean>,
80+
parameters: CFXParameters,
81+
cb: CFXCallback,
82+
invokingResource = GetInvokingResource(),
83+
isPromise?: boolean
84+
) => {
85+
return await startTransaction(invokingResource, transactions, parameters, cb, isPromise);
86+
}
87+
);
88+
7689
MySQL.prepare = (
7790
query: string,
7891
parameters: CFXParameters,
@@ -108,6 +121,7 @@ function provide(resourceName: string, method: string, cb: Function) {
108121

109122
import ghmatti from './compatibility/ghmattimysql';
110123
import mysqlAsync from './compatibility/mysql-async';
124+
import { startTransaction } from 'database/startTransaction';
111125

112126
for (const key in MySQL) {
113127
const exp = MySQL[key];

0 commit comments

Comments
 (0)