@aws-amplify/graphql-schema-generator
Version:
Amplify GraphQL schema generator
120 lines • 4.5 kB
JavaScript
"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