UNPKG

@reldens/storage

Version:
86 lines (79 loc) 3.2 kB
/** * * Reldens - MySQLTablesProvider * */ const { Logger, sc } = require('@reldens/utils'); class MySQLTablesProvider { static async fetchTables(server) { let tablesQuery = 'SELECT ' + ' TABLE_NAME, ' + ' COLUMN_NAME, ' + ' DATA_TYPE, ' + ' CAST(CHARACTER_MAXIMUM_LENGTH AS CHAR) as CHARACTER_MAXIMUM_LENGTH, ' + ' COLUMN_TYPE, ' + ' IS_NULLABLE, ' + ' COLUMN_KEY, ' + ' EXTRA, ' + ' COLUMN_DEFAULT ' + 'FROM ' + ' information_schema.COLUMNS ' + 'WHERE ' + ' TABLE_SCHEMA = \'' + server.config.database + '\' ' + 'ORDER BY ' + ' TABLE_NAME, ORDINAL_POSITION;'; try { let result = await server.rawQuery(tablesQuery); if(!sc.isArray(result) || 0 === result.length){ Logger.critical('No tables found in the database.'); return false; } let tables = {}; for(let row of result){ if(!tables[row.TABLE_NAME]){ tables[row.TABLE_NAME] = { name: row.TABLE_NAME, columns: {} }; } tables[row.TABLE_NAME].columns[row.COLUMN_NAME] = { name: row.COLUMN_NAME, type: row.DATA_TYPE, columnType: row.COLUMN_TYPE, length: row.CHARACTER_MAXIMUM_LENGTH, nullable: 'YES' === row.IS_NULLABLE, key: row.COLUMN_KEY, extra: row.EXTRA, default: row.COLUMN_DEFAULT }; } let foreignKeysQuery = 'SELECT ' + ' TABLE_NAME, ' + ' COLUMN_NAME, ' + ' REFERENCED_TABLE_NAME, ' + ' REFERENCED_COLUMN_NAME ' + 'FROM ' + ' information_schema.KEY_COLUMN_USAGE ' + 'WHERE ' + ' TABLE_SCHEMA = \'' + server.config.database + '\' ' + ' AND REFERENCED_TABLE_NAME IS NOT NULL;'; let foreignKeysResult = await server.rawQuery(foreignKeysQuery); if(!sc.isArray(foreignKeysResult) || 0 === foreignKeysResult.length){ return tables; } for(let row of foreignKeysResult){ if(tables[row.TABLE_NAME] && tables[row.TABLE_NAME].columns[row.COLUMN_NAME]){ tables[row.TABLE_NAME].columns[row.COLUMN_NAME].referencedTable = row.REFERENCED_TABLE_NAME; tables[row.TABLE_NAME].columns[row.COLUMN_NAME].referencedColumn = row.REFERENCED_COLUMN_NAME; } } return tables; } catch(error) { Logger.critical('Failed to fetch tables from database: '+error.message); } return false; } } module.exports.MySQLTablesProvider = MySQLTablesProvider;