Skip to content

Commit 77b0a3f

Browse files
committed
fix: cleanup after streaming in sap hana
1 parent c15cb07 commit 77b0a3f

File tree

1 file changed

+45
-11
lines changed

1 file changed

+45
-11
lines changed

src/driver/sap/SapQueryRunner.ts

+45-11
Original file line numberDiff line numberDiff line change
@@ -336,20 +336,54 @@ export class SapQueryRunner extends BaseQueryRunner implements QueryRunner {
336336
): Promise<ReadStream> {
337337
if (this.isReleased) throw new QueryRunnerAlreadyReleasedError()
338338

339-
const databaseConnection = await this.connect()
340-
this.driver.connection.logger.logQuery(query, parameters, this)
339+
const release = await this.lock.acquire()
340+
let dropStatement: () => Promise<void>
341341

342-
const prepareAsync = promisify(databaseConnection.prepare).bind(
343-
databaseConnection,
344-
)
345-
const statement = await prepareAsync(query)
346-
const resultSet = statement.executeQuery(parameters)
347-
const stream = this.driver.streamClient.createObjectStream(resultSet)
342+
try {
343+
const databaseConnection = await this.connect()
344+
this.driver.connection.logger.logQuery(query, parameters, this)
348345

349-
if (onEnd) stream.on("end", onEnd)
350-
if (onError) stream.on("error", onError)
346+
const statement = await promisify(databaseConnection.prepare).call(
347+
databaseConnection,
348+
query,
349+
)
350+
const resultSet = await promisify(statement.executeQuery).call(
351+
statement,
352+
parameters,
353+
)
354+
const stream =
355+
this.driver.streamClient.createObjectStream(resultSet)
356+
dropStatement = promisify(statement.drop).bind(statement)
357+
358+
stream.on("end", async () => {
359+
await dropStatement()
360+
release()
361+
onEnd?.()
362+
})
363+
stream.on("error", async (error: Error) => {
364+
this.driver.connection.logger.logQueryError(
365+
error,
366+
query,
367+
parameters,
368+
this,
369+
)
370+
await dropStatement()
371+
release()
372+
onError?.(error)
373+
})
351374

352-
return stream
375+
return stream
376+
} catch (error) {
377+
this.driver.connection.logger.logQueryError(
378+
error,
379+
query,
380+
parameters,
381+
this,
382+
)
383+
await dropStatement?.()
384+
release()
385+
throw new QueryFailedError(query, parameters, error)
386+
}
353387
}
354388

355389
/**

0 commit comments

Comments
 (0)