Skip to content

Commit

Permalink
feat: implement streaming for SAP HANA (#10512)
Browse files Browse the repository at this point in the history
  • Loading branch information
alumni committed Dec 29, 2023
1 parent 4173e51 commit 7e9cead
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 4 deletions.
7 changes: 7 additions & 0 deletions src/driver/sap/SapDriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ export class SapDriver implements Driver {
*/
client: any

/**
* Hana Client streaming extension.
*/
streamClient: any
/**
* Pool for master database.
*/
Expand Down Expand Up @@ -825,6 +829,9 @@ export class SapDriver implements Driver {
try {
if (!this.options.hanaClientDriver) {
PlatformTools.load("@sap/hana-client")
this.streamClient = PlatformTools.load(
"@sap/hana-client/extension/Stream",
)
}
} catch (e) {
// todo: better error for browser env
Expand Down
19 changes: 17 additions & 2 deletions src/driver/sap/SapQueryRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,22 @@ export class SapQueryRunner extends BaseQueryRunner implements QueryRunner {
onEnd?: Function,
onError?: Function,
): Promise<ReadStream> {
throw new TypeORMError(`Stream is not supported by SAP driver.`)
if (this.isReleased) throw new QueryRunnerAlreadyReleasedError()

const databaseConnection = await this.connect()
this.driver.connection.logger.logQuery(query, parameters, this)

const prepareAsync = promisify(databaseConnection.prepare).bind(
databaseConnection,
)
const statement = await prepareAsync(query)
const resultSet = statement.executeQuery(parameters)
const stream = this.driver.streamClient.createObjectStream(resultSet)

if (onEnd) stream.on("end", onEnd)
if (onError) stream.on("error", onError)

return stream
}

/**
Expand Down Expand Up @@ -384,7 +399,7 @@ export class SapQueryRunner extends BaseQueryRunner implements QueryRunner {
parsedTableName.schema = await this.getCurrentSchema()
}

const sql = `SELECT * FROM "SYS"."TABLE_COLUMNS" WHERE "SCHEMA_NAME" = ${parsedTableName.schema} AND "TABLE_NAME" = ${parsedTableName.tableName} AND "COLUMN_NAME" = '${columnName}'`
const sql = `SELECT * FROM "SYS"."TABLE_COLUMNS" WHERE "SCHEMA_NAME" = '${parsedTableName.schema}' AND "TABLE_NAME" = '${parsedTableName.tableName}' AND "COLUMN_NAME" = '${columnName}'`
const result = await this.query(sql)
return result.length ? true : false
}
Expand Down
3 changes: 3 additions & 0 deletions src/platform/PlatformTools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ export class PlatformTools {
case "@sap/hana-client":
return require("@sap/hana-client")

case "@sap/hana-client/extension/Stream":
return require("@sap/hana-client/extension/Stream")

case "hdb-pool":
return require("hdb-pool")

Expand Down
5 changes: 3 additions & 2 deletions test/functional/query-runner/stream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,12 @@ describe("query runner > stream", () => {
connections = await createTestingConnections({
entities: [Book],
enabledDrivers: [
"mysql",
"cockroachdb",
"postgres",
"mssql",
"mysql",
"oracle",
"postgres",
"sap",
"spanner",
],
})
Expand Down

0 comments on commit 7e9cead

Please sign in to comment.