Enhance binary data handling in transformRow to serialize Buffer as base64

This commit is contained in:
Stela Augustinova
2025-11-05 16:07:14 +01:00
parent 0f2af6eb37
commit 37d54811e0

View File

@@ -21,6 +21,15 @@ function extractColumns(fields) {
return null; return null;
} }
function transformRow(row, columns) {
columns.forEach((col) => {
if (Buffer.isBuffer(row[col.columnName])) {
row[col.columnName] = { $binary: { base64: Buffer.from(row[col.columnName]).toString('base64') } };
}
});
return row;
}
function zipDataRow(rowArray, columns) { function zipDataRow(rowArray, columns) {
return _.zipObject( return _.zipObject(
columns.map(x => x.columnName), columns.map(x => x.columnName),
@@ -96,8 +105,8 @@ const drivers = driverBases.map(driverBase => ({
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
dbhan.client.query(sql, function (error, results, fields) { dbhan.client.query(sql, function (error, results, fields) {
if (error) reject(error); if (error) reject(error);
const columns = extractColumns(fields); const columns = extractColumns(fields);
resolve({ rows: results && columns && results.map && results.map(row => zipDataRow(row, columns)), columns }); resolve({ rows: results && columns && results.map && results.map(row => transformRow(zipDataRow(row, columns), columns)), columns });
}); });
}); });
}, },
@@ -127,16 +136,17 @@ const drivers = driverBases.map(driverBase => ({
time: new Date(), time: new Date(),
severity: 'info', severity: 'info',
}); });
options.recordset(columns, { engine: driverBase.engine });
} else { } else {
if (columns) { if (columns) {
options.row(zipDataRow(row, columns)); options.row(transformRow(zipDataRow(row, columns), columns));
} }
} }
}; };
const handleFields = fields => { const handleFields = fields => {
columns = extractColumns(fields); columns = extractColumns(fields);
if (columns) options.recordset(columns); if (columns) options.recordset(columns, { engine: driverBase.engine });
}; };
const handleError = error => { const handleError = error => {
@@ -170,10 +180,11 @@ const drivers = driverBases.map(driverBase => ({
columns = extractColumns(fields); columns = extractColumns(fields);
pass.write({ pass.write({
__isStreamHeader: true, __isStreamHeader: true,
engine: driverBase.engine,
...(structure || { columns }), ...(structure || { columns }),
}); });
}) })
.on('result', row => pass.write(zipDataRow(row, columns))) .on('result', row => pass.write(transformRow(zipDataRow(row, columns), columns)))
.on('end', () => pass.end()); .on('end', () => pass.end());
return pass; return pass;