@@ -2,27 +2,41 @@ import { getPoolConnection } from './connection';
2
2
import { logError } from '../logger' ;
3
3
import { CFXCallback , CFXParameters } from '../types' ;
4
4
import { parseArguments } from 'utils/parseArguments' ;
5
+ import { PoolConnection } from 'mysql2/promise' ;
6
+
7
+ async function runQuery ( conn : PoolConnection | null , sql : string , values : CFXParameters ) {
8
+ [ sql , values ] = parseArguments ( sql , values ) ;
9
+
10
+ if ( ! conn )
11
+ throw new Error (
12
+ `Query: ${ sql } \n${ JSON . stringify ( values ) } \nConnection used by transaction timed out after 30 seconds.`
13
+ ) ;
14
+
15
+ const [ rows ] = await conn . query ( sql , values ) ;
16
+ return rows ;
17
+ }
5
18
6
19
export const startTransaction = async (
7
20
invokingResource : string ,
8
21
queries : ( ...args : any [ ] ) => Promise < boolean > ,
9
22
cb ?: CFXCallback ,
10
23
isPromise ?: boolean
11
24
) => {
12
- const conn = await getPoolConnection ( ) ;
25
+ let conn : PoolConnection | null = await getPoolConnection ( ) ;
26
+ let response : boolean | null = false ;
13
27
14
28
if ( ! conn ) return ;
15
29
16
- let response = false ;
30
+ setTimeout ( ( ) => ( response = null ) , 30000 ) ;
17
31
18
32
try {
19
33
await conn . beginTransaction ( ) ;
20
34
21
- const commit = await queries ( async ( sql : string , values : CFXParameters ) => {
22
- [ sql , values ] = parseArguments ( sql , values ) ;
23
- const [ rows ] = await conn . query ( sql , values ) ;
24
- return rows ;
25
- } ) ;
35
+ const commit = await queries ( ( sql : string , values : CFXParameters ) =>
36
+ runQuery ( response === null ? null : conn , sql , values )
37
+ ) ;
38
+
39
+ if ( response === null ) throw new Error ( `Transaction has timed out after 30 seconds.` ) ;
26
40
27
41
response = commit === false ? false : true ;
28
42
response ? conn . commit ( ) : conn . rollback ( ) ;
@@ -31,6 +45,7 @@ export const startTransaction = async (
31
45
logError ( invokingResource , cb , isPromise , err ) ;
32
46
} finally {
33
47
conn . release ( ) ;
48
+ conn = null ;
34
49
}
35
50
36
51
return cb ? cb ( response ) : response ;
0 commit comments