Files
dbgate/packages/tools/src/preloadedRowsTools.ts
Jan Prochazka 7ad845d5c6 fix
2021-12-09 18:16:36 +01:00

48 lines
1.5 KiB
TypeScript

import _ from 'lodash';
import { DatabaseInfo, EngineDriver } from 'dbgate-types';
export async function enrichWithPreloadedRows(
dbModel: DatabaseInfo,
dbTarget: DatabaseInfo,
conn,
driver: EngineDriver
): Promise<DatabaseInfo> {
// const res = { ...dbTarget, tables: [...(dbTarget.tables || [])] };
const repl = {};
for (const tableTarget of dbTarget.tables) {
const tableModel = dbModel.tables.find(x => x.pairingId == tableTarget.pairingId);
if ((tableModel?.preloadedRows?.length || 0) == 0) continue;
const keyColumns = tableModel.preloadedRowsKey || tableModel.primaryKey?.columns?.map(x => x.columnName);
if ((keyColumns?.length || 0) == 0) continue;
const dmp = driver.createDumper();
if (keyColumns.length == 1) {
dmp.putCmd(
'^select * ^from %f ^where %i ^in (%,v)',
tableTarget,
keyColumns[0],
tableModel.preloadedRows.map(x => x[keyColumns[0]])
);
} else {
dmp.put('^select * ^from %f ^where', tableTarget);
dmp.putCollection(' ^or ', tableModel.preloadedRows, row => {
dmp.put('(');
dmp.putCollection(' ^and ', keyColumns, col => dmp.put('%i=%v', col, row[col]));
dmp.put(')');
});
dmp.endCommand();
}
const resp = await driver.query(conn, dmp.s);
repl[tableTarget.pairingId] = {
...tableTarget,
preloadedRows: resp.rows,
preloadedRowsKey: keyColumns,
};
}
if (_.isEmpty(repl)) return dbTarget;
return {
...dbTarget,
tables: dbTarget.tables.map(x => repl[x.pairingId] || x),
};
}