Files
dbgate/plugins/dbgate-plugin-clickhouse/src/backend/Analyser.js

97 lines
3.1 KiB
JavaScript

const { DatabaseAnalyser } = global.DBGATE_PACKAGES['dbgate-tools'];
const sql = require('./sql');
function extractDataType(dataType) {
if (!dataType) return {};
if (dataType.startsWith('Nullable(')) {
const displayedDataType = dataType.substring('Nullable('.length, dataType.length - 1);
return {
dataType,
displayedDataType,
notNull: false,
};
}
return {
dataType,
notNull: true,
};
}
class Analyser extends DatabaseAnalyser {
constructor(connection, driver) {
super(connection, driver);
}
createQuery(resFileName, typeFields, replacements = {}) {
let res = sql[resFileName];
res = res.replace('#DATABASE#', this.dbhan.database);
return super.createQuery(res, typeFields, replacements);
}
async _runAnalysis() {
this.feedback({ analysingMessage: 'Loading tables' });
const tables = await this.analyserQuery('tables', ['tables']);
this.feedback({ analysingMessage: 'Loading columns' });
const columns = await this.analyserQuery('columns', ['tables', 'views']);
this.feedback({ analysingMessage: 'Loading views' });
let views = await this.analyserQuery('views', ['views']);
if (views?.isError) {
views = await this.analyserQuery('viewsNoDefinition', ['views']);
}
const res = {
tables: tables.rows.map((table) => ({
...table,
primaryKeyColumns: undefined,
sortingKeyColumns: undefined,
columns: columns.rows
.filter((col) => col.pureName == table.pureName)
.map((col) => ({
...col,
defaultValue: col.defaultValue ? col.defaultValue : undefined,
...extractDataType(col.dataType),
})),
primaryKey: table.primaryKeyColumns
? { columns: (table.primaryKeyColumns || '').split(',').map((x) => ({ columnName: x.trim() })) }
: null,
sortingKey: table.sortingKeyColumns
? { columns: (table.sortingKeyColumns || '').split(',').map((x) => ({ columnName: x.trim() })) }
: null,
foreignKeys: [],
})),
views: views.rows.map((view) => ({
...view,
columns: columns.rows
.filter((col) => col.pureName == view.pureName)
.map((col) => ({
...col,
...extractDataType(col.dataType),
})),
createSql: view.viewDefinition ? `CREATE VIEW "${view.pureName}"\nAS\n${view.viewDefinition}` : '',
})),
};
this.feedback({ analysingMessage: null });
return res;
}
async _getFastSnapshot() {
const tableModificationsQueryData = await this.analyserQuery('tableModifications');
return {
tables: tableModificationsQueryData.rows.filter((x) => x.tableEngine != 'View'),
views: tableModificationsQueryData.rows.filter((x) => x.tableEngine == 'View'),
};
}
async _computeSingleObjectId() {
const { pureName } = this.singleObjectFilter;
const resId = await this.driver.query(
this.dbhan,
`SELECT uuid as id FROM system.tables WHERE database = '${this.dbhan.database}' AND name='${pureName}'`
);
this.singleObjectId = resId.rows[0]?.id;
}
}
module.exports = Analyser;