Adding function to fetch table names.

This commit is contained in:
Michael Drury 2023-05-18 22:09:44 +01:00
parent 441a9f65bb
commit 732ebb4f87
5 changed files with 60 additions and 11 deletions

View File

@ -20,7 +20,6 @@ import {
} from "./utils" } from "./utils"
import Sql from "./base/sql" import Sql from "./base/sql"
import { MSSQLTablesResponse, MSSQLColumn } from "./base/types" import { MSSQLTablesResponse, MSSQLColumn } from "./base/types"
const sqlServer = require("mssql") const sqlServer = require("mssql")
const DEFAULT_SCHEMA = "dbo" const DEFAULT_SCHEMA = "dbo"
@ -284,6 +283,20 @@ class SqlServerIntegration extends Sql implements DatasourcePlus {
this.schemaErrors = final.errors this.schemaErrors = final.errors
} }
async queryTableNames() {
let tableInfo: MSSQLTablesResponse[] = await this.runSQL(this.TABLES_SQL)
const schema = this.config.schema || DEFAULT_SCHEMA
return tableInfo
.filter((record: any) => record.TABLE_SCHEMA === schema)
.map((record: any) => record.TABLE_NAME)
.filter((name: string) => this.MASTER_TABLES.indexOf(name) === -1)
}
async getTableNames() {
await this.connect()
return this.queryTableNames()
}
async read(query: SqlQuery | string) { async read(query: SqlQuery | string) {
await this.connect() await this.connect()
const response = await this.internalQuery(getSqlQuery(query)) const response = await this.internalQuery(getSqlQuery(query))

View File

@ -214,20 +214,11 @@ class MySQLIntegration extends Sql implements DatasourcePlus {
async buildSchema(datasourceId: string, entities: Record<string, Table>) { async buildSchema(datasourceId: string, entities: Record<string, Table>) {
const tables: { [key: string]: Table } = {} const tables: { [key: string]: Table } = {}
const database = this.config.database
await this.connect() await this.connect()
try { try {
// get the tables first // get the tables first
const tablesResp: Record<string, string>[] = await this.internalQuery( const tableNames = await this.queryTableNames()
{ sql: "SHOW TABLES;" },
{ connect: false }
)
const tableNames: string[] = tablesResp.map(
(obj: any) =>
obj[`Tables_in_${database}`] ||
obj[`Tables_in_${database.toLowerCase()}`]
)
for (let tableName of tableNames) { for (let tableName of tableNames) {
const primaryKeys = [] const primaryKeys = []
const schema: TableSchema = {} const schema: TableSchema = {}
@ -274,6 +265,28 @@ class MySQLIntegration extends Sql implements DatasourcePlus {
this.schemaErrors = final.errors this.schemaErrors = final.errors
} }
async queryTableNames() {
const database = this.config.database
const tablesResp: Record<string, string>[] = await this.internalQuery(
{ sql: "SHOW TABLES;" },
{ connect: false }
)
return tablesResp.map(
(obj: any) =>
obj[`Tables_in_${database}`] ||
obj[`Tables_in_${database.toLowerCase()}`]
)
}
async getTableNames() {
await this.connect()
try {
return this.queryTableNames()
} finally {
await this.disconnect()
}
}
async create(query: SqlQuery | string) { async create(query: SqlQuery | string) {
const results = await this.internalQuery(getSqlQuery(query)) const results = await this.internalQuery(getSqlQuery(query))
return results.length ? results : [{ created: true }] return results.length ? results : [{ created: true }]

View File

@ -323,6 +323,17 @@ class OracleIntegration extends Sql implements DatasourcePlus {
this.schemaErrors = final.errors this.schemaErrors = final.errors
} }
async getTableNames() {
const columnsResponse = await this.internalQuery<OracleColumnsResponse>({
sql: this.COLUMNS_SQL,
})
if (!columnsResponse.rows) {
return []
} else {
return columnsResponse.rows.map(row => row.TABLE_NAME)
}
}
async testConnection() { async testConnection() {
const response: ConnectionInfo = { const response: ConnectionInfo = {
connected: false, connected: false,

View File

@ -311,6 +311,17 @@ class PostgresIntegration extends Sql implements DatasourcePlus {
} }
} }
async getTableNames() {
try {
await this.openConnection()
const columnsResponse: { rows: PostgresColumn[] } =
await this.client.query(this.COLUMNS_SQL)
return columnsResponse.rows.map(row => row.table_name)
} finally {
await this.closeConnection()
}
}
async create(query: SqlQuery | string) { async create(query: SqlQuery | string) {
const response = await this.internalQuery(getSqlQuery(query)) const response = await this.internalQuery(getSqlQuery(query))
return response.rows.length ? response.rows : [{ created: true }] return response.rows.length ? response.rows : [{ created: true }]

View File

@ -150,4 +150,5 @@ export interface DatasourcePlus extends IntegrationBase {
getBindingIdentifier(): string getBindingIdentifier(): string
getStringConcat(parts: string[]): string getStringConcat(parts: string[]): string
buildSchema(datasourceId: string, entities: Record<string, Table>): any buildSchema(datasourceId: string, entities: Record<string, Table>): any
getTableNames(): Promise<string[]>
} }