mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-19 03:45:59 +00:00
preloaded data works
This commit is contained in:
47
packages/tools/src/preloadedRowsTools.ts
Normal file
47
packages/tools/src/preloadedRowsTools.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
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 ', tableTarget.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),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user