mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-17 21:26:00 +00:00
PostgreSQL export to SQL and XML bytea contents #1228
This commit is contained in:
@@ -47,6 +47,9 @@ function transformRow(row, columnsToTransform) {
|
||||
if (dataTypeName == 'geography') {
|
||||
row[columnName] = extractGeographyDate(row[columnName]);
|
||||
}
|
||||
else if (dataTypeName == 'bytea' && row[columnName]) {
|
||||
row[columnName] = { $binary: { base64: Buffer.from(row[columnName]).toString('base64') } };
|
||||
}
|
||||
}
|
||||
|
||||
return row;
|
||||
@@ -142,7 +145,7 @@ const drivers = driverBases.map(driverBase => ({
|
||||
conid,
|
||||
};
|
||||
|
||||
const datatypes = await this.query(dbhan, `SELECT oid, typname FROM pg_type WHERE typname in ('geography')`);
|
||||
const datatypes = await this.query(dbhan, `SELECT oid, typname FROM pg_type WHERE typname in ('geography', 'bytea')`);
|
||||
const typeIdToName = _.fromPairs(datatypes.rows.map(cur => [cur.oid, cur.typname]));
|
||||
dbhan['typeIdToName'] = typeIdToName;
|
||||
|
||||
@@ -164,7 +167,14 @@ const drivers = driverBases.map(driverBase => ({
|
||||
}
|
||||
const res = await dbhan.client.query({ text: sql, rowMode: 'array' });
|
||||
const columns = extractPostgresColumns(res, dbhan);
|
||||
return { rows: (res.rows || []).map(row => zipDataRow(row, columns)), columns };
|
||||
|
||||
const transormableTypeNames = Object.values(dbhan.typeIdToName ?? {});
|
||||
const columnsToTransform = columns.filter(x => transormableTypeNames.includes(x.dataTypeName));
|
||||
|
||||
const zippedRows = (res.rows || []).map(row => zipDataRow(row, columns));
|
||||
const transformedRows = zippedRows.map(row => transformRow(row, columnsToTransform));
|
||||
|
||||
return { rows: transformedRows, columns };
|
||||
},
|
||||
stream(dbhan, sql, options) {
|
||||
const handleNotice = notice => {
|
||||
@@ -191,7 +201,7 @@ const drivers = driverBases.map(driverBase => ({
|
||||
if (!wasHeader) {
|
||||
columns = extractPostgresColumns(query._result, dbhan);
|
||||
if (columns && columns.length > 0) {
|
||||
options.recordset(columns);
|
||||
options.recordset(columns, { engine: driverBase.engine });
|
||||
}
|
||||
wasHeader = true;
|
||||
}
|
||||
@@ -310,6 +320,7 @@ const drivers = driverBases.map(driverBase => ({
|
||||
columns = extractPostgresColumns(query._result, dbhan);
|
||||
pass.write({
|
||||
__isStreamHeader: true,
|
||||
engine: driverBase.engine,
|
||||
...(structure || { columns }),
|
||||
});
|
||||
wasHeader = true;
|
||||
|
||||
@@ -45,6 +45,10 @@ class StringifyStream extends stream.Transform {
|
||||
|
||||
elementValue(element, value) {
|
||||
this.startElement(element);
|
||||
if (value?.$binary?.base64) {
|
||||
const buffer = Buffer.from(value.$binary.base64, 'base64');
|
||||
value = '0x' +buffer.toString('hex').toUpperCase();
|
||||
}
|
||||
this.push(escapeXml(`${value}`));
|
||||
this.endElement(element);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user