From 0eecdcc8ca2fe930cfea00a076c919f40bfc33ad Mon Sep 17 00:00:00 2001 From: Bob den Os Date: Fri, 14 Jun 2024 09:43:36 +0200 Subject: [PATCH 1/2] Make HANA return buffers for binary column type --- hana/lib/HANAService.js | 8 ++------ hana/lib/drivers/hana-client.js | 10 ++++++---- hana/lib/drivers/hdb.js | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/hana/lib/HANAService.js b/hana/lib/HANAService.js index b56f1d168..f9057d7df 100644 --- a/hana/lib/HANAService.js +++ b/hana/lib/HANAService.js @@ -137,7 +137,7 @@ class HANAService extends SQLService { // REVISIT: add prepare options when param:true is used const sqlScript = isLockQuery || isSimple ? sql : this.wrapTemporary(temporary, withclause, blobs) - let rows + let rows if (values?.length || blobs.length > 0) { const ps = await this.prepare(sqlScript, blobs.length) rows = this.ensureDBC() && await ps.all(values || []) @@ -233,7 +233,7 @@ class HANAService extends SQLService { const expands = JSON.parse(row._expands_) const blobs = JSON.parse(row._blobs_) const data = Object.assign(JSON.parse(row._json_), expands, blobs) - Object.keys(blobs).forEach(k => (data[k] = this._stream(row[k] || data[k]))) + Object.keys(blobs).forEach(k => (data[k] = row[k] || data[k])) // REVISIT: try to unify with handleLevel from base driver used for streaming while (levels.length) { @@ -1284,10 +1284,6 @@ class HANAService extends SQLService { const createContainerDatabase = fs.readFileSync(path.resolve(__dirname, 'scripts/container-database.sql'), 'utf-8') const createContainerTenant = fs.readFileSync(path.resolve(__dirname, 'scripts/container-tenant.sql'), 'utf-8') -Buffer.prototype.toJSON = function () { - return this.toString('hex') -} - function _not_unique(err, code) { if (err.code === 301) return Object.assign(err, { diff --git a/hana/lib/drivers/hana-client.js b/hana/lib/drivers/hana-client.js index 72b49c505..5f0f72e91 100644 --- a/hana/lib/drivers/hana-client.js +++ b/hana/lib/drivers/hana-client.js @@ -85,7 +85,7 @@ class HANAClientDriver extends driver { const result = [] // Fetch the next row while (await next()) { - const cols = stmt.getColumnInfo().map(b => b.columnName) + const cols = stmt.getColumnInfo() // column 0-3 are metadata columns const values = await Promise.all([getValue(0), getValue(1), getValue(2), getValue(3)]) @@ -93,10 +93,12 @@ class HANAClientDriver extends driver { for (let i = 0; i < cols.length; i++) { const col = cols[i] // column >3 are all blob columns - row[col] = i > 3 ? + row[col.columnName] = i > 3 ? rs.isNull(i) ? null - : Readable.from(streamBlob(rsStreams, rs._rowPosition, i), { objectMode: false }) + : col.nativeType === 13 // return binary type as simple buffer + ? await getValue(i) + : Readable.from(streamBlob(rsStreams, rs._rowPosition, i), { objectMode: false }) : values[i] } @@ -366,7 +368,7 @@ async function* streamBlob(rs, rowIndex = -1, columnIndex, binaryBuffer = Buffer const read = await getData(columnIndex, blobPosition, binaryBuffer, 0, binaryBuffer.byteLength) blobPosition += read if (read < binaryBuffer.byteLength) { - yield binaryBuffer.slice(0, read) + yield binaryBuffer.subarray(0, read) break } yield binaryBuffer diff --git a/hana/lib/drivers/hdb.js b/hana/lib/drivers/hdb.js index 587ab33f4..a57537875 100644 --- a/hana/lib/drivers/hdb.js +++ b/hana/lib/drivers/hdb.js @@ -96,7 +96,7 @@ class HDBDriver extends driver { ? null : ( row[col].createReadStream?.() - || Readable.from(echoStream(row[col]), { objectMode: false }) + || row[col] ) : row[col] } From b064af74f1a78988c1492020d4ae1b912f9fea37 Mon Sep 17 00:00:00 2001 From: Bob den Os Date: Fri, 14 Jun 2024 09:49:10 +0200 Subject: [PATCH 2/2] Strictly expect Buffers or Readables --- test/compliance/CREATE.test.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/compliance/CREATE.test.js b/test/compliance/CREATE.test.js index 48690a687..e76952a6f 100644 --- a/test/compliance/CREATE.test.js +++ b/test/compliance/CREATE.test.js @@ -190,10 +190,8 @@ describe('CREATE', () => { await Promise.all(Object.keys(expect).map(async k => { const msg = `Ensure that the Database echos correct data back, property ${k} does not match expected result.` - if (result[k] instanceof Readable) { + if (result[k] instanceof Readable && expect[k] instanceof Readable) { result[k] = await buffer(result[k]) - } - if (expect[k] instanceof Readable) { expect[k] = await buffer(expect[k]) } if (result[k] instanceof Buffer && expect[k] instanceof Buffer) {