UNPKG

@aws-amplify/graphql-schema-generator

Version:
120 lines 4.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getMySQLSchemaQuery = exports.MySQLDataSourceAdapter = void 0; const knex_1 = require("knex"); const ora_1 = __importDefault(require("ora")); const vpc_helper_1 = require("../utils/vpc-helper"); const utils_1 = require("../utils"); const datasource_adapter_1 = require("./datasource-adapter"); const mysql_string_datasource_adapter_1 = require("./mysql-string-datasource-adapter"); const spinner = (0, ora_1.default)(); class MySQLDataSourceAdapter extends datasource_adapter_1.DataSourceAdapter { constructor(config) { super(); this.config = config; } async test() { const TEST_QUERY = 'SELECT 1'; if (!this.dbBuilder) { this.establishDBConnection(); } try { await this.dbBuilder.raw(TEST_QUERY); } catch (error) { return false; } return true; } async initialize() { spinner.start('Fetching the database schema...'); try { await this.establishDBConnection(); const schema = await this.querySchema(); this.adapter = new mysql_string_datasource_adapter_1.MySQLStringDataSourceAdapter(schema); } catch (error) { spinner.fail('Failed to fetch the database schema.'); throw error; } spinner.succeed('Successfully fetched the database schema.'); } establishDBConnection() { const databaseConfig = { host: this.config.host, database: this.config.database, port: this.config.port, user: this.config.username, password: this.config.password, ssl: (0, utils_1.getSSLConfig)(this.config.host, this.config.sslCertificate), }; try { this.dbBuilder = (0, knex_1.knex)({ client: 'mysql2', connection: databaseConfig, pool: { min: 5, max: 30, createTimeoutMillis: 30000, acquireTimeoutMillis: 30000, idleTimeoutMillis: 30000, reapIntervalMillis: 1000, createRetryIntervalMillis: 100, }, debug: false, }); } catch (err) { console.info(err); throw err; } } getTablesList() { return this.adapter.getTablesList(); } getFields(tableName) { return this.adapter.getFields(tableName); } getPrimaryKey(tableName) { return this.adapter.getPrimaryKey(tableName); } getIndexes(tableName) { return this.adapter.getIndexes(tableName); } async querySchema() { const schemaQuery = getMySQLSchemaQuery(this.config.database); const result = this.useVPC && this.vpcSchemaInspectorLambda ? await (0, vpc_helper_1.invokeSchemaInspectorLambda)(this.vpcSchemaInspectorLambda, this.config, schemaQuery, this.vpcLambdaRegion) : (await this.dbBuilder.raw(schemaQuery))[0]; return this.queryToCSV(result); } cleanup() { this.dbBuilder && this.dbBuilder.destroy(); } } exports.MySQLDataSourceAdapter = MySQLDataSourceAdapter; function getMySQLSchemaQuery(databaseName) { return ` SELECT DISTINCT INFORMATION_SCHEMA.COLUMNS.TABLE_NAME, INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT, INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION, INFORMATION_SCHEMA.COLUMNS.DATA_TYPE, INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE, INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE, INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH, INFORMATION_SCHEMA.STATISTICS.INDEX_NAME, INFORMATION_SCHEMA.STATISTICS.NON_UNIQUE, INFORMATION_SCHEMA.STATISTICS.SEQ_IN_INDEX, INFORMATION_SCHEMA.STATISTICS.NULLABLE FROM INFORMATION_SCHEMA.COLUMNS LEFT JOIN INFORMATION_SCHEMA.STATISTICS ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME=INFORMATION_SCHEMA.STATISTICS.TABLE_NAME AND INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME=INFORMATION_SCHEMA.STATISTICS.COLUMN_NAME WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = '${databaseName}' `; } exports.getMySQLSchemaQuery = getMySQLSchemaQuery; //# sourceMappingURL=mysql-datasource-adapter.js.map