@@ -208,20 +208,25 @@ export class SapQueryRunner extends BaseQueryRunner implements QueryRunner {
208
208
const isInsertQuery = query . substr ( 0 , 11 ) === "INSERT INTO"
209
209
210
210
if ( parameters ?. some ( Array . isArray ) ) {
211
- statement = await promisify (
212
- databaseConnection . prepare . bind ( databaseConnection ) ,
213
- ) ( query )
211
+ statement = await promisify ( databaseConnection . prepare ) . call (
212
+ databaseConnection ,
213
+ query ,
214
+ )
214
215
}
215
216
216
217
let raw : any
217
218
try {
218
219
raw = statement
219
- ? await promisify ( statement . exec . bind ( statement ) ) (
220
+ ? await promisify ( statement . exec ) . call (
221
+ statement ,
220
222
parameters ,
221
223
)
222
- : await promisify (
223
- databaseConnection . exec . bind ( databaseConnection ) ,
224
- ) ( query , parameters , { } )
224
+ : await promisify ( databaseConnection . exec ) . call (
225
+ databaseConnection ,
226
+ query ,
227
+ parameters ,
228
+ { } ,
229
+ )
225
230
} catch ( err ) {
226
231
throw new QueryFailedError ( query , parameters , err )
227
232
}
@@ -333,20 +338,61 @@ export class SapQueryRunner extends BaseQueryRunner implements QueryRunner {
333
338
) : Promise < ReadStream > {
334
339
if ( this . isReleased ) throw new QueryRunnerAlreadyReleasedError ( )
335
340
336
- const databaseConnection = await this . connect ( )
337
- this . driver . connection . logger . logQuery ( query , parameters , this )
341
+ const release = await this . lock . acquire ( )
342
+ let statement : any
343
+ let resultSet : any
338
344
339
- const prepareAsync = promisify ( databaseConnection . prepare ) . bind (
340
- databaseConnection ,
341
- )
342
- const statement = await prepareAsync ( query )
343
- const resultSet = statement . executeQuery ( parameters )
344
- const stream = this . driver . streamClient . createObjectStream ( resultSet )
345
+ const cleanup = async ( ) => {
346
+ if ( resultSet ) {
347
+ await promisify ( resultSet . close ) . call ( resultSet )
348
+ }
349
+ if ( statement ) {
350
+ await promisify ( statement . drop ) . call ( statement )
351
+ }
352
+ release ( )
353
+ }
345
354
346
- if ( onEnd ) stream . on ( "end" , onEnd )
347
- if ( onError ) stream . on ( "error" , onError )
355
+ try {
356
+ const databaseConnection = await this . connect ( )
357
+ this . driver . connection . logger . logQuery ( query , parameters , this )
348
358
349
- return stream
359
+ statement = await promisify ( databaseConnection . prepare ) . call (
360
+ databaseConnection ,
361
+ query ,
362
+ )
363
+ resultSet = await promisify ( statement . executeQuery ) . call (
364
+ statement ,
365
+ parameters ,
366
+ )
367
+
368
+ const stream =
369
+ this . driver . streamClient . createObjectStream ( resultSet )
370
+ stream . on ( "end" , async ( ) => {
371
+ await cleanup ( )
372
+ onEnd ?.( )
373
+ } )
374
+ stream . on ( "error" , async ( error : Error ) => {
375
+ this . driver . connection . logger . logQueryError (
376
+ error ,
377
+ query ,
378
+ parameters ,
379
+ this ,
380
+ )
381
+ await cleanup ( )
382
+ onError ?.( error )
383
+ } )
384
+
385
+ return stream
386
+ } catch ( error ) {
387
+ this . driver . connection . logger . logQueryError (
388
+ error ,
389
+ query ,
390
+ parameters ,
391
+ this ,
392
+ )
393
+ await cleanup ( )
394
+ throw new QueryFailedError ( query , parameters , error )
395
+ }
350
396
}
351
397
352
398
/**
0 commit comments