mirror of https://github.com/nocodb/nocodb
Pranav C
3 years ago
40 changed files with 18519 additions and 28 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,114 @@
|
||||
class SqlClient { |
||||
protected connectionConfig: any; |
||||
protected sqlClient: any; |
||||
|
||||
constructor(connectionConfig) { |
||||
this.connectionConfig = connectionConfig; |
||||
this.sqlClient = null; |
||||
} |
||||
|
||||
async testConnection(_args): Promise<any> {} |
||||
|
||||
migrationInit(_args) {} |
||||
|
||||
migrationUp(_args) {} |
||||
|
||||
migrationDown(_args) {} |
||||
|
||||
selectAll(_tn) {} |
||||
|
||||
executeSqlFiles() {} |
||||
|
||||
async createDatabaseIfNotExists(_args): Promise<any> {} |
||||
|
||||
async createTableIfNotExists(_args): Promise<any> {} |
||||
|
||||
startTransaction() {} |
||||
|
||||
commit() {} |
||||
|
||||
rollback() {} |
||||
|
||||
hasTable(_tn) {} |
||||
|
||||
hasDatabase(_databaseName) {} |
||||
|
||||
async tableCreate(_args): Promise<any> {} |
||||
|
||||
async tableUpdate(_args): Promise<any> {} |
||||
|
||||
async columnCreate(_args): Promise<any> {} |
||||
|
||||
async columnUpdate(_args): Promise<any> {} |
||||
|
||||
async columnDelete(_args): Promise<any> {} |
||||
|
||||
async indexCreate(_args): Promise<any> {} |
||||
|
||||
async indexUpdate(_args): Promise<any> {} |
||||
|
||||
async indexDelete(_args): Promise<any> {} |
||||
|
||||
async relationCreate(_args): Promise<any> {} |
||||
|
||||
async relationUpdate(_args): Promise<any> {} |
||||
|
||||
async relationDelete(_args): Promise<any> {} |
||||
|
||||
async databaseList(_args): Promise<any> {} |
||||
|
||||
async tableList(_args): Promise<any> {} |
||||
|
||||
async schemaList(_args): Promise<any> {} |
||||
|
||||
async tableDelete(_args): Promise<any> {} |
||||
|
||||
async columnList(_args): Promise<any> {} |
||||
|
||||
async indexList(_args): Promise<any> {} |
||||
|
||||
async relationList(_args): Promise<any> {} |
||||
|
||||
async schemaCreate(_args): Promise<any> {} |
||||
|
||||
async schemaDelete(_args): Promise<any> {} |
||||
|
||||
async triggerList(_args): Promise<any> {} |
||||
|
||||
async triggerCreate(_args): Promise<any> {} |
||||
|
||||
async triggerRead(_args): Promise<any> {} |
||||
|
||||
async functionList(_args): Promise<any> {} |
||||
|
||||
async functionRead(_args): Promise<any> {} |
||||
|
||||
async procedureList(_args): Promise<any> {} |
||||
|
||||
async procedureRead(_args): Promise<any> {} |
||||
|
||||
async viewList(_args): Promise<any> {} |
||||
|
||||
async viewRead(_args): Promise<any> {} |
||||
|
||||
async sequenceList(_args = {}): Promise<any> {} |
||||
async sequenceCreate(_args = {}): Promise<any> {} |
||||
async sequenceUpdate(_args = {}): Promise<any> {} |
||||
async sequenceDelete(_args = {}): Promise<any> {} |
||||
|
||||
async tableCreateStatement(_args): Promise<any> {} |
||||
|
||||
async tableInsertStatement(_args): Promise<any> {} |
||||
|
||||
async tableUpdateStatement(_args): Promise<any> {} |
||||
|
||||
async tableDeleteStatement(_args): Promise<any> {} |
||||
|
||||
async tableTruncateStatement(_args): Promise<any> {} |
||||
|
||||
async tableSelectStatement(_args): Promise<any> {} |
||||
|
||||
async totalRecords(_args): Promise<any> {} |
||||
} |
||||
|
||||
export default SqlClient; |
@ -0,0 +1,40 @@
|
||||
import MySqlClient from './mysql/MysqlClient'; |
||||
import MssqlClient from './mssql/MssqlClient'; |
||||
import OracleClient from './oracle/OracleClient'; |
||||
import SqliteClient from './sqlite/SqliteClient'; |
||||
import PgClient from './pg/PgClient'; |
||||
import YugabyteClient from './pg/YugabyteClient'; |
||||
import TidbClient from './mysql/TidbClient'; |
||||
import VitessClient from './mysql/VitessClient'; |
||||
|
||||
class SqlClientFactory { |
||||
static create(connectionConfig) { |
||||
connectionConfig.meta = connectionConfig.meta || {}; |
||||
connectionConfig.pool = connectionConfig.pool || { min: 0, max: 5 }; |
||||
connectionConfig.meta.dbtype = connectionConfig.meta.dbtype || ''; |
||||
if ( |
||||
connectionConfig.client === 'mysql' || |
||||
connectionConfig.client === 'mysql2' |
||||
) { |
||||
if (connectionConfig.meta.dbtype === 'tidb') |
||||
return new TidbClient(connectionConfig); |
||||
if (connectionConfig.meta.dbtype === 'vitess') |
||||
return new VitessClient(connectionConfig); |
||||
return new MySqlClient(connectionConfig); |
||||
} else if (connectionConfig.client === 'sqlite3') { |
||||
return new SqliteClient(connectionConfig); |
||||
} else if (connectionConfig.client === 'mssql') { |
||||
return new MssqlClient(connectionConfig); |
||||
} else if (connectionConfig.client === 'oracledb') { |
||||
return new OracleClient(connectionConfig); |
||||
} else if (connectionConfig.client === 'pg') { |
||||
if (connectionConfig.meta.dbtype === 'yugabyte') |
||||
return new YugabyteClient(connectionConfig); |
||||
return new PgClient(connectionConfig); |
||||
} |
||||
|
||||
throw new Error('Database not supported'); |
||||
} |
||||
} |
||||
|
||||
export default SqlClientFactory; |
@ -0,0 +1,267 @@
|
||||
export const findOrInsertObjectArrayByKey = (obj, key, array) => { |
||||
let found = 0; |
||||
let i = 0; |
||||
|
||||
for (i = 0; i < array.length; ++i) { |
||||
if (key in array[i]) { |
||||
if (obj[key] === array[i][key]) { |
||||
found = 1; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
if (!found) { |
||||
array.push(obj); |
||||
} |
||||
|
||||
return array[i]; |
||||
}; |
||||
|
||||
export const findObjectInArrayByKey = (key, value, objArray) => { |
||||
for (let i = 0; i < objArray.length; ++i) { |
||||
if (objArray[i][key] === value) { |
||||
return objArray[i]; |
||||
} |
||||
} |
||||
|
||||
return null; |
||||
}; |
||||
|
||||
export const round = function(number, precision) { |
||||
const factor = Math.pow(10, precision); |
||||
const tempNumber = number * factor; |
||||
const roundedTempNumber = Math.round(tempNumber); |
||||
return roundedTempNumber / factor; |
||||
}; |
||||
|
||||
export const numberRound = (number, precision) => { |
||||
const factor = Math.pow(10, precision); |
||||
const tempNumber = number * factor; |
||||
const roundedTempNumber = Math.round(tempNumber); |
||||
return roundedTempNumber / factor; |
||||
}; |
||||
|
||||
export const numberGetLength = number => { |
||||
let n = number; |
||||
|
||||
if (number < 0) { |
||||
n = n * -1; |
||||
} |
||||
|
||||
return n.toString().length; |
||||
}; |
||||
|
||||
export const numberGetFixed = number => { |
||||
//console.log(number, typeof number);
|
||||
return parseInt(number.toFixed()); |
||||
}; |
||||
|
||||
export const getStepArraySimple = function(min, max, step) { |
||||
const arr = []; |
||||
for (let i = min; i <= max; i = i + step) { |
||||
arr.push(i); |
||||
} |
||||
|
||||
return arr; |
||||
}; |
||||
|
||||
export const getStepArray = (min, max, stddev) => { |
||||
// console.log(' = = = = = = = ');
|
||||
//console.log('original numbers', min, max, stddev);
|
||||
|
||||
min = numberGetFixed(min); |
||||
max = numberGetFixed(max); |
||||
stddev = numberGetFixed(stddev); |
||||
|
||||
// console.log('fixed numbers', min, max, stddev);
|
||||
|
||||
let minMinusHalf = min - stddev / 2; |
||||
let maxMinusHalf = max + stddev / 2; |
||||
|
||||
minMinusHalf = numberGetFixed(minMinusHalf); |
||||
maxMinusHalf = numberGetFixed(maxMinusHalf); |
||||
|
||||
// console.log('fixed numbers + (min,max)', min, max, stddev, '(', minMinusHalf, ',', maxMinusHalf, ')');
|
||||
// console.log('numbers length', 'min', numberGetLength(min), 'max', numberGetLength(max), 'stddev', numberGetLength(stddev));
|
||||
|
||||
const minLen = numberGetLength(minMinusHalf); |
||||
const maxLen = numberGetLength(maxMinusHalf); |
||||
const stddevLen = numberGetLength(stddev); |
||||
//
|
||||
// console.log('- - - -');
|
||||
// console.log('Range', 'min', numberRound(minMinusHalf, -1));
|
||||
// console.log('Range', 'max', numberRound(maxMinusHalf, -1));
|
||||
// console.log('Range', 'stddev', numberRound(stddev, -1));
|
||||
|
||||
if (minLen > 1) minMinusHalf = numberRound(minMinusHalf, -1); |
||||
|
||||
if (maxLen > 2) maxMinusHalf = numberRound(maxMinusHalf, -1); |
||||
|
||||
if (stddevLen !== 1) stddev = numberRound(stddev, -1); |
||||
|
||||
const arr = []; |
||||
for (let step = minMinusHalf; step < maxMinusHalf; step = step + stddev) { |
||||
arr.push(step); |
||||
} |
||||
arr.push(maxMinusHalf); |
||||
|
||||
// console.log(arr);
|
||||
|
||||
return arr; |
||||
}; |
||||
|
||||
export const getMysqlSchemaQuery = function() { |
||||
return ( |
||||
'select ' + |
||||
'c.table_name as tn, c.column_name as cn, c.ordinal_position as cop,' + |
||||
'c.column_key as ck,c.is_nullable as nrqd, c.data_type, c.column_type as ct,c.extra as ext,c.privileges as priv, ' + |
||||
'c.cc,c.cdf as cdf,c.data_type,' + |
||||
'c.character_maximum_length as clen,c.numeric_precision as np,c.numeric_scale as ns,c.datetime_precision as dp, ' + |
||||
'k.constraint_name as cstn, k.referenced_table_name as rtn, k.referenced_column_name as rcn, ' + |
||||
's.index_name,s.seq_in_index, ' + |
||||
'v.table_name as is_view ' + |
||||
'from ' + |
||||
'information_schema.columns as c ' + |
||||
'left join ' + |
||||
'information_schema.key_column_usage as k ' + |
||||
'on ' + |
||||
'c.column_name=k.column_name and ' + |
||||
'c.table_schema = k.referenced_table_schema and ' + |
||||
'c.table_name = k.table_name ' + |
||||
'left join ' + |
||||
'information_schema.statistics as s ' + |
||||
'on ' + |
||||
'c.column_name = s.column_name and ' + |
||||
'c.table_schema = s.index_schema and ' + |
||||
'c.table_name = s.table_name ' + |
||||
'LEFT JOIN ' + |
||||
'information_schema.VIEWS as v ' + |
||||
'ON ' + |
||||
'c.table_schema = v.table_schema and ' + |
||||
'c.table_name = v.table_name ' + |
||||
'where ' + |
||||
'c.table_schema=? ' + |
||||
'order by ' + |
||||
'c.table_name, c.ordinal_position' |
||||
); |
||||
}; |
||||
|
||||
export const getChartQuery = function() { |
||||
return 'select ? as ??, count(*) as _count from ?? where ?? between ? and ? '; |
||||
}; |
||||
|
||||
export const getDataType = function(colType, typesArr) { |
||||
// console.log(colType,typesArr);
|
||||
for (let i = 0; i < typesArr.length; ++i) { |
||||
if (colType.indexOf(typesArr[i]) !== -1) { |
||||
return 1; |
||||
} |
||||
} |
||||
return 0; |
||||
}; |
||||
|
||||
export const getColumnType = function(column) { |
||||
const strTypes = [ |
||||
'varchar', |
||||
'text', |
||||
'char', |
||||
'tinytext', |
||||
'mediumtext', |
||||
'longtext', |
||||
'ntext', |
||||
'image', |
||||
'blob', |
||||
'mediumblob', |
||||
'longblob', |
||||
'binary', |
||||
'varbinary', |
||||
'character', |
||||
'character varying', |
||||
'nchar', |
||||
'nvarchar', |
||||
'clob', |
||||
'nvarchar2', |
||||
'varchar2', |
||||
'raw', |
||||
'long raw', |
||||
'bfile', |
||||
'nclob' |
||||
]; |
||||
const intTypes = [ |
||||
'bit', |
||||
'integer', |
||||
'int', |
||||
'smallint', |
||||
'mediumint', |
||||
'bigint', |
||||
'tinyint', |
||||
'int2', |
||||
'int4', |
||||
'int8', |
||||
'long', |
||||
'serial', |
||||
'bigserial', |
||||
'smallserial', |
||||
'bool', |
||||
'boolean', |
||||
'number' |
||||
]; |
||||
const floatTypes = [ |
||||
'float', |
||||
'double', |
||||
'decimal', |
||||
'numeric', |
||||
'real', |
||||
'double precision', |
||||
'real', |
||||
'money', |
||||
'smallmoney', |
||||
'dec' |
||||
]; |
||||
const dateTypes = [ |
||||
'date', |
||||
'datetime', |
||||
'timestamp', |
||||
'time', |
||||
'year', |
||||
'timestamp without time zone', |
||||
'timestamp with time zone', |
||||
'time without time zone', |
||||
'time with time zone', |
||||
'datetime2', |
||||
'smalldatetime', |
||||
'datetimeoffset', |
||||
'interval year', |
||||
'interval day' |
||||
]; |
||||
|
||||
// const rowIds = ['rowId', 'urowid'];
|
||||
|
||||
//console.log(column);
|
||||
if (getDataType(column['data_type'], strTypes)) { |
||||
return 'string'; |
||||
} else if (getDataType(column['data_type'], intTypes)) { |
||||
return 'int'; |
||||
} else if (getDataType(column['data_type'], floatTypes)) { |
||||
return 'float'; |
||||
} else if (getDataType(column['data_type'], dateTypes)) { |
||||
return 'date'; |
||||
} else { |
||||
return 'string'; |
||||
} |
||||
}; |
||||
|
||||
export const getType = function(colType, typesArr) { |
||||
// for (let i = 0; i < typesArr.length; ++i) {
|
||||
// // if (typesArr[i].indexOf(colType) !== -1) {
|
||||
// // return 1;
|
||||
// // }
|
||||
//
|
||||
// if (colType.indexOf(typesArr[i]) !== -1) {
|
||||
// return 1;
|
||||
// }
|
||||
// }
|
||||
return typesArr.includes(colType); |
||||
//return 0;
|
||||
}; |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,39 @@
|
||||
// https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-2017
|
||||
|
||||
export default { |
||||
bigint: {}, |
||||
numeric: {}, |
||||
bit: {}, |
||||
smallint: {}, |
||||
decimal: {}, |
||||
smallmoney: {}, |
||||
int: {}, |
||||
tinyint: {}, |
||||
money: {}, |
||||
float: {}, |
||||
real: {}, |
||||
date: {}, |
||||
datetimeoffset: {}, |
||||
datetime2: {}, |
||||
smalldatetime: {}, |
||||
datetime: {}, |
||||
time: {}, |
||||
char: {}, |
||||
varchar: {}, |
||||
text: {}, |
||||
nchar: {}, |
||||
nvarchar: {}, |
||||
ntext: {}, |
||||
binary: {}, |
||||
varbinary: {}, |
||||
image: {}, |
||||
cursor: {}, |
||||
rowversion: {}, |
||||
hierarchyid: {}, |
||||
uniqueidentifier: {}, |
||||
sql_variant: {}, |
||||
xml: {}, |
||||
'Spatial Geometry Types': {}, |
||||
'Spatial Geography Types': {}, |
||||
table: {} |
||||
}; |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,61 @@
|
||||
import _ from 'lodash'; |
||||
import Debug from '../../../util/Debug'; |
||||
import Result from '../../../util/Result'; |
||||
|
||||
const log = new Debug('TidbClient'); |
||||
|
||||
import MysqlClient from './MysqlClient'; |
||||
|
||||
class Tidb extends MysqlClient { |
||||
/** |
||||
* |
||||
* @param {Object} - args - Input arguments |
||||
* @param {Object} - args.tn - |
||||
* @returns {Object[]} - indexes |
||||
* @property {String} - indexes[].cstn - |
||||
* @property {String} - indexes[].cn - |
||||
* @property {String} - indexes[].op - |
||||
* @property {String} - indexes[].puc - |
||||
* @property {String} - indexes[].cst - |
||||
*/ |
||||
async constraintList(args: any = {}) { |
||||
const func = this.constraintList.name; |
||||
const result = new Result(); |
||||
log.api(`${func}:args:`, args); |
||||
|
||||
try { |
||||
const response = await this.sqlClient.raw( |
||||
`select *, TABLE_NAME as tn from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA='${this.connectionConfig.connection.database}' and TABLE_NAME='${args.tn}'` |
||||
); |
||||
|
||||
if (response.length === 2) { |
||||
const indexes = []; |
||||
|
||||
for (let i = 0; i < response[0].length; ++i) { |
||||
let index = response[0][i]; |
||||
index = _.mapKeys(index, function(_v, k) { |
||||
return k.toLowerCase(); |
||||
}); |
||||
indexes.push(index); |
||||
} |
||||
|
||||
result.data.list = indexes; |
||||
} else { |
||||
log.debug( |
||||
'Unknown response for databaseList:', |
||||
result.data.list.length |
||||
); |
||||
result.data.list = []; |
||||
} |
||||
} catch (e) { |
||||
log.ppe(e, func); |
||||
throw e; |
||||
} |
||||
|
||||
log.api(`${func}: result`, result); |
||||
|
||||
return result; |
||||
} |
||||
} |
||||
|
||||
export default Tidb; |
@ -0,0 +1,247 @@
|
||||
import _ from 'lodash'; |
||||
import Debug from '../../../util/Debug'; |
||||
import Result from '../../../util/Result'; |
||||
|
||||
const log = new Debug('VitessClient'); |
||||
|
||||
import MysqlClient from './MysqlClient'; |
||||
|
||||
class Vitess extends MysqlClient { |
||||
constructor(connectionConfig: any) { |
||||
super(connectionConfig); |
||||
} |
||||
|
||||
async relationList(_args: any = {}) { |
||||
const result = new Result(); |
||||
result.data.list = []; |
||||
return result; |
||||
} |
||||
|
||||
async relationListAll(_args: any = {}) { |
||||
const result = new Result(); |
||||
result.data.list = []; |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param {Object} - args - for future reasons |
||||
* @returns {Object[]} - databases |
||||
* @property {String} - databases[].database_name |
||||
*/ |
||||
async databaseList(args: any = {}) { |
||||
const func = this.databaseList.name; |
||||
const result = new Result(); |
||||
log.api(`${func}:args:`, args); |
||||
|
||||
try { |
||||
const response = await this.sqlClient.raw('SHOW databases'); |
||||
|
||||
log.debug(response.length); |
||||
|
||||
if (response.length === 2) { |
||||
for (let i = 0; i < response[0].length; ++i) { |
||||
response[0][i].database_name = response[0][i].Databases; |
||||
} |
||||
result.data.list = response[0]; |
||||
} else { |
||||
log.debug( |
||||
'Unknown response for databaseList:', |
||||
result.data.list.length |
||||
); |
||||
result.data.list = []; |
||||
} |
||||
} catch (e) { |
||||
log.ppe(e, func); |
||||
throw e; |
||||
} |
||||
|
||||
log.api(`${func}: result`, result.data.list.length); |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param {Object} - args - for future reasons |
||||
* @returns {Object[]} - tables |
||||
* @property {String} - tables[].tn |
||||
*/ |
||||
async tableList(args: any = {}) { |
||||
const func = this.tableList.name; |
||||
const result = new Result(); |
||||
log.api(`${func}:args:`, args); |
||||
|
||||
try { |
||||
const response = await this.sqlClient.raw('SHOW TABLES'); |
||||
const keyInResponse = `Tables_in_vt_${this.connectionConfig.connection.database}`; |
||||
|
||||
if (response.length === 2) { |
||||
for (let i = 0; i < response[0].length; ++i) { |
||||
response[0][i].tn = response[0][i][keyInResponse]; |
||||
} |
||||
result.data.list = response[0]; |
||||
} else { |
||||
log.debug( |
||||
'Unknown response for databaseList:', |
||||
result.data.list.length |
||||
); |
||||
result.data.list = []; |
||||
} |
||||
} catch (e) { |
||||
log.ppe(e, func); |
||||
throw e; |
||||
} |
||||
|
||||
log.api(`${func}: result`, result.data.list.length); |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param {Object} - args - Input arguments |
||||
* @param {Object} - args.tn - |
||||
* @returns {Object[]} - columns |
||||
* @property {String} - columns[].tn |
||||
* @property {String} - columns[].cn |
||||
* @property {String} - columns[].dt |
||||
* @property {String} - columns[].dtx |
||||
* @property {String} - columns[].np |
||||
* @property {String} - columns[].ns - |
||||
* @property {String} - columns[].clen - |
||||
* @property {String} - columns[].dp - |
||||
* @property {String} - columns[].cop - |
||||
* @property {String} - columns[].pk - |
||||
* @property {String} - columns[].nrqd - |
||||
* @property {String} - columns[].not_nullable - |
||||
* @property {String} - columns[].ct - |
||||
* @property {String} - columns[].un - |
||||
* @property {String} - columns[].ai - |
||||
* @property {String} - columns[].unique - |
||||
* @property {String} - columns[].cdf - |
||||
* @property {String} - columns[].cc - |
||||
* @property {String} - columns[].csn - |
||||
*/ |
||||
async columnList(args: any = {}) { |
||||
const func = this.columnList.name; |
||||
const result = new Result(); |
||||
log.api(`${func}:args:`, args); |
||||
|
||||
try { |
||||
args.databaseName = this.connectionConfig.connection.database; |
||||
|
||||
const response = await this.sqlClient.raw( |
||||
`select *, table_name as tn from information_schema.columns where table_name = '${args.tn}' ORDER by ordinal_position` |
||||
); |
||||
|
||||
if (response.length === 2) { |
||||
const columns = []; |
||||
|
||||
for (let i = 0; i < response[0].length; ++i) { |
||||
const column: any = {}; |
||||
|
||||
response[0][i] = _.mapKeys(response[0][i], (_v, k) => |
||||
k.toLowerCase() |
||||
); |
||||
|
||||
column.tn = args.tn; |
||||
column.cn = response[0][i].cn; |
||||
column.dt = response[0][i].dt; |
||||
column.np = response[0][i].np; |
||||
column.ns = response[0][i].ns; |
||||
column.clen = response[0][i].clen; |
||||
// column.dp = response[0][i].dp;
|
||||
column.cop = response[0][i].op; |
||||
column.dtx = this.getKnexDataType(column.dt); |
||||
column.pk = response[0][i].ck === 'PRI'; |
||||
|
||||
column.nrqd = response[0][i].nrqd !== 'NO'; |
||||
column.not_nullable = !column.nrqd; |
||||
|
||||
response[0][i].ct = response[0][i].ct || ''; |
||||
column.un = response[0][i].ct.indexOf('unsigned') !== -1; |
||||
|
||||
column.ct = response[0][i].ct || ''; |
||||
response[0][i].ext = response[0][i].ext || ''; |
||||
column.ai = response[0][i].ext.indexOf('auto_increment') !== -1; |
||||
|
||||
response[0][i].cst = response[0][i].cst || ' '; |
||||
column.unique = response[0][i].cst.indexOf('UNIQUE') !== -1; |
||||
|
||||
column.cdf = response[0][i].cdf; |
||||
column.cc = response[0][i].cc; |
||||
|
||||
column.csn = response[0][i].csn; |
||||
|
||||
columns.push(column); |
||||
|
||||
// column['dtx'] = response[0][i]['dt'];
|
||||
} |
||||
|
||||
result.data.list = columns; |
||||
} else { |
||||
log.debug('Unknown response for databaseList:', response); |
||||
result.data.list = []; |
||||
} |
||||
} catch (e) { |
||||
log.ppe(e, func); |
||||
throw e; |
||||
} |
||||
|
||||
log.api(`${func}: result list length = `, result.data.list.length); |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param {Object} - args - Input arguments |
||||
* @param {Object} - args.tn - |
||||
* @returns {Object[]} - indexes |
||||
* @property {String} - indexes[].cstn - |
||||
* @property {String} - indexes[].cn - |
||||
* @property {String} - indexes[].op - |
||||
* @property {String} - indexes[].puc - |
||||
* @property {String} - indexes[].cst - |
||||
*/ |
||||
async constraintList(args: any = {}) { |
||||
const func = this.constraintList.name; |
||||
const result = new Result(); |
||||
log.api(`${func}:args:`, args); |
||||
|
||||
try { |
||||
const response = await this.sqlClient.raw( |
||||
`select *, TABLE_NAME as tn from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '${args.tn}' ORDER by ordinal_position;` |
||||
); |
||||
|
||||
if (response.length === 2) { |
||||
const indexes = []; |
||||
|
||||
for (let i = 0; i < response[0].length; ++i) { |
||||
let index = response[0][i]; |
||||
index = _.mapKeys(index, function(_v, k) { |
||||
return k.toLowerCase(); |
||||
}); |
||||
indexes.push(index); |
||||
} |
||||
|
||||
result.data.list = indexes; |
||||
} else { |
||||
log.debug( |
||||
'Unknown response for databaseList:', |
||||
result.data.list.length |
||||
); |
||||
result.data.list = []; |
||||
} |
||||
} catch (e) { |
||||
log.ppe(e, func); |
||||
throw e; |
||||
} |
||||
|
||||
log.api(`${func}: result`, result); |
||||
|
||||
return result; |
||||
} |
||||
} |
||||
export default Vitess; |
@ -0,0 +1,898 @@
|
||||
export default [ |
||||
{ |
||||
name: 'zipCode', |
||||
group: 'address', |
||||
value: 'address.zipCode', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'city', |
||||
group: 'address', |
||||
value: 'address.city', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'cityPrefix', |
||||
group: 'address', |
||||
value: 'address.cityPrefix', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'citySuffix', |
||||
group: 'address', |
||||
value: 'address.citySuffix', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'streetName', |
||||
group: 'address', |
||||
value: 'address.streetName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'streetAddress', |
||||
group: 'address', |
||||
value: 'address.streetAddress', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'streetSuffix', |
||||
group: 'address', |
||||
value: 'address.streetSuffix', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'streetPrefix', |
||||
group: 'address', |
||||
value: 'address.streetPrefix', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'secondaryAddress', |
||||
group: 'address', |
||||
value: 'address.secondaryAddress', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'county', |
||||
group: 'address', |
||||
value: 'address.county', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'country', |
||||
group: 'address', |
||||
value: 'address.country', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'countryCode', |
||||
group: 'address', |
||||
value: 'address.countryCode', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'state', |
||||
group: 'address', |
||||
value: 'address.state', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'stateAbbr', |
||||
group: 'address', |
||||
value: 'address.stateAbbr', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'latitude', |
||||
group: 'address', |
||||
value: 'address.latitude', |
||||
type: 'number' |
||||
}, |
||||
{ |
||||
name: 'longitude', |
||||
group: 'address', |
||||
value: 'address.longitude', |
||||
type: 'number' |
||||
}, |
||||
{ |
||||
name: 'color', |
||||
group: 'commerce', |
||||
value: 'commerce.color', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'department', |
||||
group: 'commerce', |
||||
value: 'commerce.department', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'productName', |
||||
group: 'commerce', |
||||
value: 'commerce.productName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'price', |
||||
group: 'commerce', |
||||
value: 'commerce.price', |
||||
type: 'number' |
||||
}, |
||||
{ |
||||
name: 'productAdjective', |
||||
group: 'commerce', |
||||
value: 'commerce.productAdjective', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'productMaterial', |
||||
group: 'commerce', |
||||
value: 'commerce.productMaterial', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'product', |
||||
group: 'commerce', |
||||
value: 'commerce.product', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'suffixes', |
||||
group: 'company', |
||||
value: 'company.suffixes', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'companyName', |
||||
group: 'company', |
||||
value: 'company.companyName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'companySuffix', |
||||
group: 'company', |
||||
value: 'company.companySuffix', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'catchPhrase', |
||||
group: 'company', |
||||
value: 'company.catchPhrase', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'bs', |
||||
group: 'company', |
||||
value: 'company.bs', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'catchPhraseAdjective', |
||||
group: 'company', |
||||
value: 'company.catchPhraseAdjective', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'catchPhraseDescriptor', |
||||
group: 'company', |
||||
value: 'company.catchPhraseDescriptor', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'catchPhraseNoun', |
||||
group: 'company', |
||||
value: 'company.catchPhraseNoun', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'bsAdjective', |
||||
group: 'company', |
||||
value: 'company.bsAdjective', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'bsBuzz', |
||||
group: 'company', |
||||
value: 'company.bsBuzz', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'bsNoun', |
||||
group: 'company', |
||||
value: 'company.bsNoun', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'column', |
||||
group: 'database', |
||||
value: 'database.column', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'type', |
||||
group: 'database', |
||||
value: 'database.type', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'collation', |
||||
group: 'database', |
||||
value: 'database.collation', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'engine', |
||||
group: 'database', |
||||
value: 'database.engine', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'past', |
||||
group: 'date', |
||||
value: 'date.past', |
||||
type: 'date' |
||||
}, |
||||
{ |
||||
name: 'future', |
||||
group: 'date', |
||||
value: 'date.future', |
||||
type: 'date' |
||||
}, |
||||
// {
|
||||
// name: 'between',
|
||||
// group: 'date',
|
||||
// value: 'date.between',
|
||||
// type: 'date'
|
||||
// },
|
||||
{ |
||||
name: 'recent', |
||||
group: 'date', |
||||
value: 'date.recent', |
||||
type: 'date' |
||||
}, |
||||
{ |
||||
name: 'soon', |
||||
group: 'date', |
||||
value: 'date.soon', |
||||
type: 'date' |
||||
}, |
||||
{ |
||||
name: 'month', |
||||
group: 'date', |
||||
value: 'date.month', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'weekday', |
||||
group: 'date', |
||||
value: 'date.weekday', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'account', |
||||
group: 'finance', |
||||
value: 'finance.account', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'accountName', |
||||
group: 'finance', |
||||
value: 'finance.accountName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'mask', |
||||
group: 'finance', |
||||
value: 'finance.mask', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'amount', |
||||
group: 'finance', |
||||
value: 'finance.amount', |
||||
type: 'number' |
||||
}, |
||||
{ |
||||
name: 'transactionType', |
||||
group: 'finance', |
||||
value: 'finance.transactionType', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'currencyCode', |
||||
group: 'finance', |
||||
value: 'finance.currencyCode', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'currencyName', |
||||
group: 'finance', |
||||
value: 'finance.currencyName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'currencySymbol', |
||||
group: 'finance', |
||||
value: 'finance.currencySymbol', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'bitcoinAddress', |
||||
group: 'finance', |
||||
value: 'finance.bitcoinAddress', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'ethereumAddress', |
||||
group: 'finance', |
||||
value: 'finance.ethereumAddress', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'iban', |
||||
group: 'finance', |
||||
value: 'finance.iban', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'bic', |
||||
group: 'finance', |
||||
value: 'finance.bic', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'abbreviation', |
||||
group: 'hacker', |
||||
value: 'hacker.abbreviation', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'adjective', |
||||
group: 'hacker', |
||||
value: 'hacker.adjective', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'noun', |
||||
group: 'hacker', |
||||
value: 'hacker.noun', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'verb', |
||||
group: 'hacker', |
||||
value: 'hacker.verb', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'ingverb', |
||||
group: 'hacker', |
||||
value: 'hacker.ingverb', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'phrase', |
||||
group: 'hacker', |
||||
value: 'hacker.phrase', |
||||
type: 'string' |
||||
}, |
||||
// {
|
||||
// name: 'randomize',
|
||||
// group: 'helpers',
|
||||
// value: 'helpers.randomize',
|
||||
// type: 'string'
|
||||
// },
|
||||
// {
|
||||
// name: 'slugify',
|
||||
// group: 'helpers',
|
||||
// value: 'helpers.slugify',
|
||||
// type: 'string'
|
||||
// },
|
||||
// {
|
||||
// name: 'replaceSymbolWithNumber',
|
||||
// group: 'helpers',
|
||||
// value: 'helpers.replaceSymbolWithNumber',
|
||||
// type: 'string'
|
||||
// },
|
||||
// {
|
||||
// name: 'replaceSymbols',
|
||||
// group: 'helpers',
|
||||
// value: 'helpers.replaceSymbols',
|
||||
// type: 'string'
|
||||
// },
|
||||
// {
|
||||
// name: 'shuffle',
|
||||
// group: 'helpers',
|
||||
// value: 'helpers.shuffle',
|
||||
// type: 'string'
|
||||
// },
|
||||
// {
|
||||
// name: 'mustache',
|
||||
// group: 'helpers',
|
||||
// value: 'helpers.mustache',
|
||||
// type: 'string'
|
||||
// },
|
||||
{ |
||||
name: 'createCard', |
||||
group: 'helpers', |
||||
value: 'helpers.createCard', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'contextualCard', |
||||
group: 'helpers', |
||||
value: 'helpers.contextualCard', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'userCard', |
||||
group: 'helpers', |
||||
value: 'helpers.userCard', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'createTransaction', |
||||
group: 'helpers', |
||||
value: 'helpers.createTransaction', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'image', |
||||
group: 'image', |
||||
value: 'image.image', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'avatar', |
||||
group: 'image', |
||||
value: 'image.avatar', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'imageUrl', |
||||
group: 'image', |
||||
value: 'image.imageUrl', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'abstract', |
||||
group: 'image', |
||||
value: 'image.abstract', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'animals', |
||||
group: 'image', |
||||
value: 'image.animals', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'business', |
||||
group: 'image', |
||||
value: 'image.business', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'cats', |
||||
group: 'image', |
||||
value: 'image.cats', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'city', |
||||
group: 'image', |
||||
value: 'image.city', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'food', |
||||
group: 'image', |
||||
value: 'image.food', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'nightlife', |
||||
group: 'image', |
||||
value: 'image.nightlife', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'fashion', |
||||
group: 'image', |
||||
value: 'image.fashion', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'people', |
||||
group: 'image', |
||||
value: 'image.people', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'nature', |
||||
group: 'image', |
||||
value: 'image.nature', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'sports', |
||||
group: 'image', |
||||
value: 'image.sports', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'technics', |
||||
group: 'image', |
||||
value: 'image.technics', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'transport', |
||||
group: 'image', |
||||
value: 'image.transport', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'dataUri', |
||||
group: 'image', |
||||
value: 'image.dataUri', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'avatar', |
||||
group: 'internet', |
||||
value: 'internet.avatar', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'email', |
||||
group: 'internet', |
||||
value: 'internet.email', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'exampleEmail', |
||||
group: 'internet', |
||||
value: 'internet.exampleEmail', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'userName', |
||||
group: 'internet', |
||||
value: 'internet.userName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'protocol', |
||||
group: 'internet', |
||||
value: 'internet.protocol', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'url', |
||||
group: 'internet', |
||||
value: 'internet.url', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'domainName', |
||||
group: 'internet', |
||||
value: 'internet.domainName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'domainSuffix', |
||||
group: 'internet', |
||||
value: 'internet.domainSuffix', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'domainWord', |
||||
group: 'internet', |
||||
value: 'internet.domainWord', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'ip', |
||||
group: 'internet', |
||||
value: 'internet.ip', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'ipv6', |
||||
group: 'internet', |
||||
value: 'internet.ipv6', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'userAgent', |
||||
group: 'internet', |
||||
value: 'internet.userAgent', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'color', |
||||
group: 'internet', |
||||
value: 'internet.color', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'mac', |
||||
group: 'internet', |
||||
value: 'internet.mac', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'password', |
||||
group: 'internet', |
||||
value: 'internet.password', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'word', |
||||
group: 'lorem', |
||||
value: 'lorem.word', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'words', |
||||
group: 'lorem', |
||||
value: 'lorem.words', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'sentence', |
||||
group: 'lorem', |
||||
value: 'lorem.sentence', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'slug', |
||||
group: 'lorem', |
||||
value: 'lorem.slug', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'sentences', |
||||
group: 'lorem', |
||||
value: 'lorem.sentences', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'paragraph', |
||||
group: 'lorem', |
||||
value: 'lorem.paragraph', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'paragraphs', |
||||
group: 'lorem', |
||||
value: 'lorem.paragraphs', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'text', |
||||
group: 'lorem', |
||||
value: 'lorem.text', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'lines', |
||||
group: 'lorem', |
||||
value: 'lorem.lines', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'firstName', |
||||
group: 'name', |
||||
value: 'name.firstName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'lastName', |
||||
group: 'name', |
||||
value: 'name.lastName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'findName', |
||||
group: 'name', |
||||
value: 'name.findName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'jobTitle', |
||||
group: 'name', |
||||
value: 'name.jobTitle', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'prefix', |
||||
group: 'name', |
||||
value: 'name.prefix', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'suffix', |
||||
group: 'name', |
||||
value: 'name.suffix', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'title', |
||||
group: 'name', |
||||
value: 'name.title', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'jobDescriptor', |
||||
group: 'name', |
||||
value: 'name.jobDescriptor', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'jobArea', |
||||
group: 'name', |
||||
value: 'name.jobArea', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'jobType', |
||||
group: 'name', |
||||
value: 'name.jobType', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'phoneNumber', |
||||
group: 'phone', |
||||
value: 'phone.phoneNumber', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'phoneNumberFormat', |
||||
group: 'phone', |
||||
value: 'phone.phoneNumberFormat', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'phoneFormats', |
||||
group: 'phone', |
||||
value: 'phone.phoneFormats', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'number', |
||||
group: 'random', |
||||
value: 'random.number', |
||||
type: 'number' |
||||
}, |
||||
{ |
||||
name: 'float', |
||||
group: 'random', |
||||
value: 'random.float', |
||||
type: 'number' |
||||
}, |
||||
// Todo : use it for collection or enum
|
||||
// {
|
||||
// name: 'arrayElement',
|
||||
// group: 'random',
|
||||
// value: 'random.arrayElement',
|
||||
// type: 'collection'
|
||||
// },
|
||||
// {
|
||||
// name: 'objectElement',
|
||||
// group: 'random',
|
||||
// value: 'random.objectElement',
|
||||
// type: 'string'
|
||||
// },
|
||||
{ |
||||
name: 'uuid', |
||||
group: 'random', |
||||
value: 'random.uuid', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'boolean', |
||||
group: 'random', |
||||
value: 'random.boolean', |
||||
type: 'boolean' |
||||
}, |
||||
{ |
||||
name: 'word', |
||||
group: 'random', |
||||
value: 'random.word', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'words', |
||||
group: 'random', |
||||
value: 'random.words', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'image', |
||||
group: 'random', |
||||
value: 'random.image', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'locale', |
||||
group: 'random', |
||||
value: 'random.locale', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'alphaNumeric', |
||||
group: 'random', |
||||
value: 'random.alphaNumeric', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'hexaDecimal', |
||||
group: 'random', |
||||
value: 'random.hexaDecimal', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'fileName', |
||||
group: 'system', |
||||
value: 'system.fileName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'commonFileName', |
||||
group: 'system', |
||||
value: 'system.commonFileName', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'mimeType', |
||||
group: 'system', |
||||
value: 'system.mimeType', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'commonFileType', |
||||
group: 'system', |
||||
value: 'system.commonFileType', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'commonFileExt', |
||||
group: 'system', |
||||
value: 'system.commonFileExt', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'fileType', |
||||
group: 'system', |
||||
value: 'system.fileType', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'fileExt', |
||||
group: 'system', |
||||
value: 'system.fileExt', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'directoryPath', |
||||
group: 'system', |
||||
value: 'system.directoryPath', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'filePath', |
||||
group: 'system', |
||||
value: 'system.filePath', |
||||
type: 'string' |
||||
}, |
||||
{ |
||||
name: 'semver', |
||||
group: 'system', |
||||
value: 'system.semver', |
||||
type: 'string' |
||||
} |
||||
]; |
||||
// export default functionList;
|
@ -0,0 +1,65 @@
|
||||
export const mapDataType = function(type) { |
||||
switch (type) { |
||||
case 'int': |
||||
case 'tinyint': |
||||
case 'smallint': |
||||
case 'mediumint': |
||||
case 'bigint': |
||||
case 'bit': |
||||
case 'boolean': |
||||
case 'float': |
||||
case 'decimal': |
||||
case 'double': |
||||
case 'serial': |
||||
return 'number'; |
||||
case 'date': |
||||
case 'datetime': |
||||
case 'timestamp': |
||||
case 'time': |
||||
case 'year': |
||||
return 'date'; |
||||
case 'char': |
||||
case 'varchar': |
||||
case 'nchar': |
||||
case 'text': |
||||
case 'tinytext': |
||||
case 'mediumtext': |
||||
case 'longtext': |
||||
return 'string'; |
||||
case 'binary': |
||||
break; |
||||
case 'varbinary': |
||||
break; |
||||
case 'blob': |
||||
break; |
||||
case 'tinyblob': |
||||
break; |
||||
case 'mediumblob': |
||||
break; |
||||
case 'longblob': |
||||
break; |
||||
case 'enum': |
||||
case 'set': |
||||
return 'string'; |
||||
break; |
||||
case 'geometry': |
||||
break; |
||||
case 'point': |
||||
break; |
||||
case 'linestring': |
||||
break; |
||||
case 'polygon': |
||||
break; |
||||
case 'multipoint': |
||||
break; |
||||
case 'multilinestring': |
||||
break; |
||||
case 'multipolygon': |
||||
break; |
||||
case 'json': |
||||
return 'string'; |
||||
break; |
||||
} |
||||
|
||||
return 'string'; |
||||
}; |
@ -0,0 +1,364 @@
|
||||
const columnListOld = `SELECT
|
||||
c.table_name as tn, |
||||
c.column_name as cn, |
||||
c.data_type as dt, |
||||
c.column_type as ct, |
||||
c.character_maximum_length as clen, |
||||
c.numeric_precision as np, |
||||
c.numeric_scale as ns, |
||||
-- c.datetime_precision as dp, |
||||
c.ordinal_position as cop, |
||||
c.column_key as ck, |
||||
c.extra as ext, -- gives ai |
||||
c.column_default as cdf, |
||||
c.is_nullable as nrqd, |
||||
c.privileges as priv, |
||||
c.column_comment as cc, |
||||
-- c.generation_expression, |
||||
c.character_set_name as csn, |
||||
c.collation_name as clnn, |
||||
ct.CONSTRAINT_TYPE as cst |
||||
FROM |
||||
information_schema.COLUMNS as c |
||||
Left join( |
||||
select |
||||
tc.CONSTRAINT_NAME, |
||||
tc.TABLE_NAME, |
||||
tc.CONSTRAINT_SCHEMA, |
||||
tc.CONSTRAINT_TYPE, |
||||
s.COLUMN_NAME |
||||
from |
||||
information_schema.TABLE_CONSTRAINTS as tc |
||||
LEFT JOIN information_schema.STATISTICS as s ON |
||||
s.table_schema = tc.CONSTRAINT_SCHEMA |
||||
and s.TABLE_NAME = tc.TABLE_NAME |
||||
and s.INDEX_NAME = tc.CONSTRAINT_NAME |
||||
where |
||||
tc.CONSTRAINT_SCHEMA = ? |
||||
and s.TABLE_NAME = ? |
||||
) ct on |
||||
c.TABLE_SCHEMA = ct.CONSTRAINT_SCHEMA |
||||
AND c.TABLE_NAME = ct.TABLE_NAME |
||||
AND c.COLUMN_NAME = ct.COLUMN_NAME |
||||
WHERE |
||||
c.table_schema = ? |
||||
and c.TABLE_NAME = ? |
||||
ORDER BY |
||||
c.table_name, |
||||
c.ordinal_position`;
|
||||
|
||||
export default { |
||||
columnList: { |
||||
'55': { |
||||
sql: columnListOld, |
||||
paramsHints: ['databaseName', 'tn', 'databaseName', 'tn'] |
||||
}, |
||||
'56': { |
||||
sql: columnListOld, |
||||
paramsHints: ['databaseName', 'tn', 'databaseName', 'tn'] |
||||
}, |
||||
default: { |
||||
sql: `SELECT
|
||||
c.table_name as tn, |
||||
c.column_name as cn, |
||||
c.data_type as dt, |
||||
c.column_type as ct, |
||||
c.character_maximum_length as clen, |
||||
c.numeric_precision as np, |
||||
c.numeric_scale as ns, |
||||
c.datetime_precision as dp, |
||||
c.ordinal_position as cop, |
||||
c.column_key as ck, |
||||
c.extra as ext, -- gives ai |
||||
c.column_default as cdf, |
||||
c.is_nullable as nrqd, |
||||
c.privileges as priv, |
||||
c.column_comment as cc, |
||||
-- c.generation_expression, |
||||
c.character_set_name as csn, |
||||
c.collation_name as clnn, |
||||
ct.CONSTRAINT_TYPE as cst |
||||
FROM |
||||
information_schema.COLUMNS as c |
||||
Left join( |
||||
select |
||||
tc.CONSTRAINT_NAME, |
||||
tc.TABLE_NAME, |
||||
tc.CONSTRAINT_SCHEMA, |
||||
tc.CONSTRAINT_TYPE, |
||||
s.COLUMN_NAME |
||||
from |
||||
information_schema.TABLE_CONSTRAINTS as tc |
||||
LEFT JOIN information_schema.STATISTICS as s ON |
||||
s.table_schema = tc.CONSTRAINT_SCHEMA |
||||
and s.TABLE_NAME = tc.TABLE_NAME |
||||
and s.INDEX_NAME = tc.CONSTRAINT_NAME |
||||
and tc.CONSTRAINT_TYPE != 'UNIQUE' |
||||
and tc.CONSTRAINT_TYPE != 'FOREIGN KEY' |
||||
where |
||||
tc.CONSTRAINT_SCHEMA = ? |
||||
and s.TABLE_NAME = ? |
||||
) ct on |
||||
c.TABLE_SCHEMA = ct.CONSTRAINT_SCHEMA |
||||
AND c.TABLE_NAME = ct.TABLE_NAME |
||||
AND c.COLUMN_NAME = ct.COLUMN_NAME |
||||
WHERE |
||||
c.table_schema = ? |
||||
and c.TABLE_NAME = ? |
||||
ORDER BY |
||||
c.table_name, |
||||
c.ordinal_position`,
|
||||
paramsHints: ['databaseName', 'tn', 'databaseName', 'tn'] |
||||
} |
||||
}, |
||||
constraintList: { |
||||
default: { |
||||
sql: `SELECT
|
||||
k.constraint_name as cstn, |
||||
k.column_name as cn, |
||||
k.ordinal_position as op, |
||||
k.position_in_unique_constraint as puc, |
||||
t.constraint_type as cst |
||||
FROM information_schema.table_constraints t |
||||
LEFT JOIN information_schema.key_column_usage k |
||||
USING(constraint_name,table_schema,table_name) |
||||
WHERE |
||||
t.table_schema=? |
||||
AND t.table_name=?;`,
|
||||
paramsHints: ['database', 'tn'] |
||||
} |
||||
}, |
||||
createDatabaseIfNotExists: { |
||||
default: { |
||||
sql: `create database if not exists ??`, |
||||
paramsHints: ['database'] |
||||
} |
||||
}, |
||||
createTableIfNotExists: { |
||||
default: { |
||||
sql: ``, |
||||
paramsHints: [] |
||||
} |
||||
}, |
||||
|
||||
dropDatabase: { |
||||
default: { |
||||
sql: `drop database ??`, |
||||
paramsHints: ['database'] |
||||
} |
||||
}, |
||||
databaseList: { |
||||
default: { |
||||
sql: `SHOW databases`, |
||||
paramsHints: [] |
||||
} |
||||
}, |
||||
|
||||
hasDatabase: { |
||||
default: { |
||||
sql: `SHOW DATABASES LIKE ?`, |
||||
paramsHints: ['databaseName'] |
||||
} |
||||
}, |
||||
indexList: { |
||||
default: { |
||||
sql: `show index from ??`, |
||||
paramsHints: ['tn'] |
||||
} |
||||
}, |
||||
|
||||
functionList: { |
||||
default: { |
||||
sql: `show function status where db=?`, |
||||
paramsHints: ['databaseName'] |
||||
} |
||||
}, |
||||
functionRead: { |
||||
default: { |
||||
sql: `SHOW CREATE FUNCTION ??`, |
||||
paramsHints: ['function_name'] |
||||
} |
||||
}, |
||||
functionDelete: { |
||||
default: { |
||||
sql: `DROP FUNCTION IF EXISTS ??`, |
||||
paramsHints: ['function_name'] |
||||
} |
||||
}, |
||||
|
||||
procedureList: { |
||||
default: { |
||||
sql: `show procedure status where db=?`, |
||||
paramsHints: ['databaseName'] |
||||
} |
||||
}, |
||||
procedureRead: { |
||||
default: { |
||||
sql: `show create procedure ??`, |
||||
paramsHints: ['procedure_name'] |
||||
} |
||||
}, |
||||
procedureDelete: { |
||||
default: { |
||||
sql: `DROP PROCEDURE IF EXISTS ??`, |
||||
paramsHints: ['procedure_name'] |
||||
} |
||||
}, |
||||
|
||||
relationList: { |
||||
default: { |
||||
sql: `SELECT
|
||||
kcu.CONSTRAINT_NAME as cstn, |
||||
kcu.TABLE_NAME as tn, |
||||
kcu.COLUMN_NAME as cn, |
||||
kcu.POSITION_IN_UNIQUE_CONSTRAINT as puc, |
||||
kcu.REFERENCED_TABLE_NAME as rtn,
|
||||
kcu.REFERENCED_COLUMN_NAME as rcn, |
||||
rc.MATCH_OPTION as mo, |
||||
rc.UPDATE_RULE as ur, |
||||
rc.DELETE_RULE as dr, |
||||
kcu.table_schema as ts |
||||
FROM |
||||
information_schema.KEY_COLUMN_USAGE AS kcu |
||||
INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS AS rc ON |
||||
kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME |
||||
Group by kcu.CONSTRAINT_NAME, |
||||
kcu.TABLE_NAME, |
||||
kcu.COLUMN_NAME, |
||||
kcu.POSITION_IN_UNIQUE_CONSTRAINT, |
||||
kcu.REFERENCED_TABLE_NAME, |
||||
kcu.REFERENCED_COLUMN_NAME, |
||||
rc.MATCH_OPTION, |
||||
rc.UPDATE_RULE, |
||||
rc.DELETE_RULE ,kcu.table_schema |
||||
Having |
||||
kcu.table_schema = ? |
||||
AND kcu.referenced_column_name IS NOT NULL |
||||
AND kcu.table_name=?`,
|
||||
paramsHints: ['database', 'tn'] |
||||
} |
||||
}, |
||||
|
||||
relationListAll: { |
||||
default: { |
||||
sql: ` |
||||
SELECT |
||||
kcu.CONSTRAINT_NAME AS cstn, |
||||
kcu.TABLE_NAME AS tn, |
||||
kcu.COLUMN_NAME AS cn, |
||||
kcu.POSITION_IN_UNIQUE_CONSTRAINT AS puc, |
||||
kcu.REFERENCED_TABLE_NAME AS rtn, |
||||
kcu.REFERENCED_COLUMN_NAME AS rcn, |
||||
rc.MATCH_OPTION AS mo, |
||||
rc.UPDATE_RULE AS ur, |
||||
rc.DELETE_RULE AS dr, |
||||
kcu.table_schema AS ts |
||||
FROM |
||||
(SELECT |
||||
table_schema, |
||||
CONSTRAINT_NAME, |
||||
TABLE_NAME, |
||||
COLUMN_NAME, |
||||
POSITION_IN_UNIQUE_CONSTRAINT, |
||||
REFERENCED_TABLE_NAME, |
||||
REFERENCED_COLUMN_NAME |
||||
FROM |
||||
information_schema.KEY_COLUMN_USAGE |
||||
WHERE |
||||
table_schema = :databaseName) AS kcu |
||||
INNER JOIN |
||||
(SELECT |
||||
CONSTRAINT_SCHEMA, |
||||
MATCH_OPTION, |
||||
UPDATE_RULE, |
||||
DELETE_RULE, |
||||
CONSTRAINT_NAME |
||||
FROM |
||||
information_schema.REFERENTIAL_CONSTRAINTS |
||||
WHERE |
||||
CONSTRAINT_SCHEMA = :databaseName) AS rc ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME |
||||
AND kcu.table_schema = rc.CONSTRAINT_SCHEMA |
||||
INNER JOIN |
||||
(SELECT |
||||
table_schema, TABLE_NAME, COLUMN_NAME |
||||
FROM |
||||
INFORMATION_SCHEMA.COLUMNS |
||||
WHERE |
||||
table_schema = :databaseName AND TABLE_NAME IN (SELECT |
||||
TABLE_NAME |
||||
FROM |
||||
INFORMATION_SCHEMA.TABLES |
||||
WHERE |
||||
table_schema = :databaseName |
||||
AND LOWER(TABLE_TYPE) = 'base table')) AS col ON col.table_schema = kcu.table_schema |
||||
AND col.table_name = kcu.TABLE_NAME |
||||
|
||||
AND kcu.REFERENCED_COLUMN_NAME IS NOT NULL |
||||
GROUP BY cstn , tn , rcn , cn , puc , rtn ,cn, mo , ur , dr , ts`,
|
||||
paramsHints: ['database'] |
||||
} |
||||
}, |
||||
|
||||
schemaCreate: { |
||||
default: { |
||||
sql: `create database ??`, |
||||
paramsHints: ['database_name'] |
||||
} |
||||
}, |
||||
schemaDelete: { |
||||
default: { |
||||
sql: `drop database ??`, |
||||
paramsHints: ['database_name'] |
||||
} |
||||
}, |
||||
triggerList: { |
||||
default: { |
||||
sql: `SHOW TRIGGERS like ?`, |
||||
paramsHints: ['tn'] |
||||
} |
||||
}, |
||||
tableList: { |
||||
default: { |
||||
sql: ``, |
||||
paramsHints: [] |
||||
} |
||||
}, |
||||
testConnection: { |
||||
default: { |
||||
sql: ``, |
||||
paramsHints: [] |
||||
} |
||||
}, |
||||
triggerRead: { |
||||
default: { |
||||
sql: `SHOW FULL TABLES IN ?? WHERE TABLE_TYPE LIKE 'VIEW';`, |
||||
paramsHints: ['databaseName'] |
||||
} |
||||
}, |
||||
triggerDelete: { |
||||
default: { |
||||
sql: `DROP TRIGGER ??`, |
||||
paramsHints: ['trigger_name'] |
||||
} |
||||
}, |
||||
version: { |
||||
default: { |
||||
sql: ``, |
||||
paramsHints: [] |
||||
} |
||||
}, |
||||
viewRead: { |
||||
default: { |
||||
sql: `select * FROM INFORMATION_SCHEMA.VIEWS WHERE
|
||||
TABLE_SCHEMA = ? AND TABLE_NAME = ?`,
|
||||
paramsHints: ['databaseName', 'view_name'] |
||||
} |
||||
}, |
||||
//
|
||||
viewList: { |
||||
default: { |
||||
sql: `SHOW FULL TABLES WHERE TABLE_TYPE LIKE 'VIEW'`, |
||||
paramsHints: [] |
||||
} |
||||
} |
||||
}; |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,25 @@
|
||||
// https://docs.oracle.com/cd/E11882_01/appdev.112/e10646/oci03typ.htm#LNOCI16276
|
||||
|
||||
const oracleQueries = { |
||||
varchar2: {}, |
||||
number: {}, |
||||
integer: {}, |
||||
float: {}, |
||||
string: {}, |
||||
varnum: {}, |
||||
decimal: {}, |
||||
long: {}, |
||||
varchar: {}, |
||||
date: {}, |
||||
varraw: {}, |
||||
raw: {}, |
||||
'long raw': {}, |
||||
un: {}, |
||||
'long varchar': {}, |
||||
'long varraw': {}, |
||||
char: {}, |
||||
charz: {}, |
||||
rowiddescriptor: {} |
||||
}; |
||||
|
||||
export default oracleQueries; |
@ -0,0 +1,111 @@
|
||||
//define class
|
||||
class Order { |
||||
private matrix: any; |
||||
private squareLen: any; |
||||
constructor(squareMatrix) { |
||||
if (squareMatrix) { |
||||
this.matrix = squareMatrix; |
||||
this.squareLen = this.matrix.length; |
||||
} |
||||
} |
||||
|
||||
_hasColumnZeroes(index) { |
||||
for (let i = 0; i < this.matrix.length; ++i) { |
||||
if (this.matrix[i][index] !== 0) { |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
_makeAllElementsInRowAsZero(index) { |
||||
for (let i = 0; i < this.matrix.length; ++i) { |
||||
this.matrix[index][i] = 0; |
||||
} |
||||
} |
||||
|
||||
_selfPointing() { |
||||
const self = {}; |
||||
for (let i = 0; i < this.matrix.length; ++i) { |
||||
if (this.matrix[i][i] === 1) { |
||||
this.matrix[i][i] = 0; |
||||
self[i] = i; |
||||
} |
||||
} |
||||
return self; |
||||
} |
||||
|
||||
_CycleBetweenNodes() { |
||||
const two = []; |
||||
|
||||
for (let i = 0; i < this.matrix.length; ++i) { |
||||
for (let j = i + 1; j < this.matrix.length; ++j) { |
||||
if (i !== j && this.matrix[i][j] === 1 && this.matrix[j][i] === 1) { |
||||
two.push([i, j]); |
||||
console.log(i, j); |
||||
} |
||||
} |
||||
} |
||||
|
||||
return two; |
||||
} |
||||
|
||||
/*** |
||||
* |
||||
* @returns {order:[],one:{},two:[],cycle:{}} |
||||
*/ |
||||
getOrder() { |
||||
console.time('getOrder'); |
||||
|
||||
const visited = {}; |
||||
const cycle = {}; |
||||
const order = []; |
||||
const one = this._selfPointing(); |
||||
const two = this._CycleBetweenNodes(); |
||||
|
||||
for (let i = 0; i < this.squareLen; ++i) { |
||||
cycle[i] = i; |
||||
} |
||||
|
||||
for (let i = 0; i < this.squareLen; ++i) { |
||||
for (let j = 0; j < this.squareLen; ++j) { |
||||
//console.log('- - - - - - - - - - - -- ');
|
||||
|
||||
if (j in visited) { |
||||
//console.log('Already visited',j);
|
||||
} else if (this._hasColumnZeroes(j)) { |
||||
//console.log('Inserting to visit order --> ',j);
|
||||
visited[j] = j; |
||||
delete cycle[j]; |
||||
order.push(j); |
||||
this._makeAllElementsInRowAsZero(j); |
||||
} else { |
||||
//console.log('Column does not have zeroes',j);
|
||||
} |
||||
|
||||
if (order.length === this.squareLen) { |
||||
console.timeEnd('getOrder'); |
||||
return { order, one, cycle }; |
||||
} |
||||
} |
||||
} |
||||
|
||||
console.timeEnd('getOrder'); |
||||
return { order, one, cycle, two }; |
||||
} |
||||
|
||||
setIndex(i, j) { |
||||
if (i < this.matrix.length && j < this.matrix.length) { |
||||
this.matrix[i][j] = 1; |
||||
} |
||||
} |
||||
|
||||
resetIndex(i, j) { |
||||
if (i < this.matrix.length && j < this.matrix.length) { |
||||
this.matrix[i][j] = 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
export default Order; |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,140 @@
|
||||
import PGClient from './PgClient'; |
||||
import Debug from '../../../util/Debug'; |
||||
import Result from '../../../util/Result'; |
||||
|
||||
const log = new Debug('YBClient'); |
||||
|
||||
class YBClient extends PGClient { |
||||
constructor(connectionConfig) { |
||||
super(connectionConfig); |
||||
} |
||||
/** |
||||
* |
||||
* @param {Object} - args - for future reasons |
||||
* @returns {Object[]} - tables |
||||
* @property {String} - tables[].tn |
||||
*/ |
||||
async tableList(args: any = {}) { |
||||
const _func = this.tableList.name; |
||||
const result = new Result(); |
||||
log.api(`${_func}:args:`, args); |
||||
|
||||
try { |
||||
const { rows } = await this.raw( |
||||
`select tablename as tn, * from pg_catalog.pg_tables where schemaname != 'information_schema' and schemaname != 'pg_catalog'` |
||||
); |
||||
|
||||
result.data.list = rows; |
||||
} catch (e) { |
||||
log.ppe(e, _func); |
||||
throw e; |
||||
} |
||||
|
||||
log.api(`${_func}: result`, result); |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param {Object} - args - Input arguments |
||||
* @param {Object} - args.tn - |
||||
* @returns {Object[]} - columns |
||||
* @property {String} - columns[].tn |
||||
* @property {String} - columns[].cn |
||||
* @property {String} - columns[].dt |
||||
* @property {String} - columns[].dtx |
||||
* @property {String} - columns[].np |
||||
* @property {String} - columns[].ns - |
||||
* @property {String} - columns[].clen - |
||||
* @property {String} - columns[].dp - |
||||
* @property {String} - columns[].cop - |
||||
* @property {String} - columns[].pk - |
||||
* @property {String} - columns[].nrqd - |
||||
* @property {String} - columns[].not_nullable - |
||||
* @property {String} - columns[].ct - |
||||
* @property {String} - columns[].un - |
||||
* @property {String} - columns[].ai - |
||||
* @property {String} - columns[].unique - |
||||
* @property {String} - columns[].cdf - |
||||
* @property {String} - columns[].cc - |
||||
* @property {String} - columns[].csn - |
||||
*/ |
||||
|
||||
async columnList(args: any = {}) { |
||||
const _func = this.columnList.name; |
||||
const result = new Result(); |
||||
log.api(`${_func}:args:`, args); |
||||
try { |
||||
args.databaseName = this.connectionConfig.connection.database; |
||||
|
||||
const response = await this.raw(` |
||||
select c.relname as tn, a.attname as cn, pg_catalog.format_type(a.atttypid, a.atttypmod) as "dt",a.attnotnull as "not_nullable", |
||||
pg_catalog.pg_get_expr(ad.adbin, ad.adrelid, true) as cdf, dsc.description as comment,a.attnum as cop, |
||||
coalesce(i.indisprimary,false) as pk, |
||||
a.*,ad.oid as attr_id |
||||
FROM pg_catalog.pg_attribute a |
||||
INNER JOIN pg_catalog.pg_class c ON (a.attrelid=c.oid) |
||||
LEFT OUTER JOIN pg_catalog.pg_attrdef ad ON (a.attrelid=ad.adrelid AND a.attnum = ad.adnum) |
||||
LEFT OUTER JOIN pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum = dsc.objsubid) |
||||
LEFT JOIN pg_index i ON (a.attnum = any(i.indkey) and a.attrelid = i.indrelid and i.indrelid = '${args.tn}'::regclass AND i.indisprimary) |
||||
WHERE NOT a.attisdropped AND c.relname = '${args.tn}' and a.attnum > 0 ORDER BY a.attnum`);
|
||||
|
||||
const columns = []; |
||||
|
||||
for (let i = 0; i < response.rows.length; ++i) { |
||||
const column: any = {}; |
||||
|
||||
column.tn = args.tn; |
||||
column.cn = response.rows[i].cn; |
||||
column.dt = response.rows[i].dt; |
||||
column.np = response.rows[i].np; |
||||
column.ns = response.rows[i].ns; |
||||
column.clen = response.rows[i].clen; |
||||
column.dp = response.rows[i].dp; |
||||
column.cop = response.rows[i].cop; |
||||
|
||||
// todo : there are lot of types in pg - handle them
|
||||
column.dtx = this.getKnexDataType(column.dt); |
||||
column.pk = response.rows[i].pk_constraint_name !== null; |
||||
|
||||
column.not_nullable = response.rows[i].not_nullable; |
||||
column.nrqd = !column.not_nullable; |
||||
|
||||
// todo: there is no type of unsigned in postgres
|
||||
response.rows[i].ct = response.rows[i].dt || ''; |
||||
column.un = response.rows[i].ct.indexOf('unsigned') !== -1; |
||||
|
||||
column.ai = false; |
||||
if (response.rows[i].cdf) { |
||||
column.ai = response.rows[i].cdf.indexOf('nextval') !== -1; |
||||
} |
||||
|
||||
// todo : need to find if column is unique or not
|
||||
// column['unique'] = response.rows[i]['cst'].indexOf('UNIQUE') === -1 ? false : true;
|
||||
|
||||
column.cdf = response.rows[i].cdf |
||||
? response.rows[i].cdf.split('::')[0].replace(/'/g, '') |
||||
: response.rows[i].cdf; |
||||
|
||||
// todo : need to find column comment
|
||||
column.cc = response.rows[i].comment; |
||||
|
||||
column.csn = response.rows[i].csn; |
||||
|
||||
columns.push(column); |
||||
} |
||||
|
||||
result.data.list = columns; |
||||
} catch (e) { |
||||
log.ppe(e, _func); |
||||
throw e; |
||||
} |
||||
|
||||
log.api(`${_func}: result`, result); |
||||
|
||||
return result; |
||||
} |
||||
} |
||||
|
||||
export default YBClient; |
@ -0,0 +1,239 @@
|
||||
// https://www.postgresql.org/docs/9.5/datatype.html
|
||||
|
||||
const pgQueries = { |
||||
columnList: { |
||||
default: { |
||||
sql: `SELECT
|
||||
c.table_name as tn, |
||||
c.column_name as cn, |
||||
c.data_type as dt, |
||||
c.column_type as ct, |
||||
c.character_maximum_length as clen, |
||||
c.numeric_precision as np, |
||||
c.numeric_scale as ns, |
||||
c.datetime_precision as dp, |
||||
c.ordinal_position as cop, |
||||
c.column_key as ck, |
||||
c.extra as ext, -- gives ai |
||||
c.column_default as cdf, |
||||
c.is_nullable as nrqd, |
||||
c.privileges as priv, |
||||
c.column_comment as cc, |
||||
c.generation_expression, |
||||
c.character_set_name as csn, |
||||
c.collation_name as clnn, |
||||
ct.CONSTRAINT_TYPE as cst |
||||
FROM |
||||
information_schema.COLUMNS as c |
||||
Left join( |
||||
select |
||||
tc.CONSTRAINT_NAME, |
||||
tc.TABLE_NAME, |
||||
tc.CONSTRAINT_SCHEMA, |
||||
tc.CONSTRAINT_TYPE, |
||||
s.COLUMN_NAME |
||||
from |
||||
information_schema.TABLE_CONSTRAINTS as tc |
||||
LEFT JOIN information_schema.STATISTICS as s ON |
||||
s.table_schema = tc.CONSTRAINT_SCHEMA |
||||
and s.TABLE_NAME = tc.TABLE_NAME |
||||
and s.INDEX_NAME = tc.CONSTRAINT_NAME |
||||
where |
||||
tc.CONSTRAINT_SCHEMA = ? |
||||
and s.TABLE_NAME = ?
|
||||
) ct on |
||||
c.TABLE_SCHEMA = ct.CONSTRAINT_SCHEMA |
||||
AND c.TABLE_NAME = ct.TABLE_NAME |
||||
AND c.COLUMN_NAME = ct.COLUMN_NAME |
||||
WHERE |
||||
c.table_schema = ? |
||||
and c.TABLE_NAME = ? |
||||
ORDER BY |
||||
c.table_name, |
||||
c.ordinal_position`,
|
||||
paramsHints: ['databaseName', 'tn', 'databaseName', 'tn'] |
||||
} |
||||
}, |
||||
constraintList: { |
||||
default: { |
||||
sql: `SELECT
|
||||
k.constraint_name as cstn,
|
||||
k.column_name as cn,
|
||||
k.ordinal_position as op,
|
||||
k.position_in_unique_constraint as puc,
|
||||
t.constraint_type as cst |
||||
FROM information_schema.table_constraints t |
||||
LEFT JOIN information_schema.key_column_usage k |
||||
USING(constraint_name,table_schema,table_name) |
||||
WHERE |
||||
t.table_schema=? |
||||
AND t.table_name=?;`,
|
||||
paramsHints: ['database', 'tn'] |
||||
} |
||||
}, |
||||
createDatabaseIfNotExists: { |
||||
default: { |
||||
sql: `create database if not exists ??`, |
||||
paramsHints: ['database'] |
||||
} |
||||
}, |
||||
createTableIfNotExists: { |
||||
default: { |
||||
sql: ``, |
||||
paramsHints: [] |
||||
} |
||||
}, |
||||
|
||||
dropDatabase: { |
||||
default: { |
||||
sql: `drop database ??`, |
||||
paramsHints: ['database'] |
||||
} |
||||
}, |
||||
databaseList: { |
||||
default: { |
||||
sql: `SHOW databases`, |
||||
paramsHints: [] |
||||
} |
||||
}, |
||||
|
||||
hasDatabase: { |
||||
default: { |
||||
sql: `SHOW DATABASES LIKE ??`, |
||||
paramsHints: ['databaseName'] |
||||
} |
||||
}, |
||||
indexList: { |
||||
default: { |
||||
sql: `show index from ??`, |
||||
paramsHints: ['tn'] |
||||
} |
||||
}, |
||||
|
||||
functionList: { |
||||
default: { |
||||
sql: `show function status where db=?`, |
||||
paramsHints: ['databaseName'] |
||||
} |
||||
}, |
||||
functionRead: { |
||||
default: { |
||||
sql: `SHOW CREATE FUNCTION ??`, |
||||
paramsHints: ['function_name'] |
||||
} |
||||
}, |
||||
functionDelete: { |
||||
default: { |
||||
sql: `DROP FUNCTION IF EXISTS ??`, |
||||
paramsHints: ['function_name'] |
||||
} |
||||
}, |
||||
|
||||
procedureList: { |
||||
default: { |
||||
sql: `show procedure status where db=?`, |
||||
paramsHints: ['databaseName'] |
||||
} |
||||
}, |
||||
procedureRead: { |
||||
default: { |
||||
sql: `show create procedure ??`, |
||||
paramsHints: ['procedure_name'] |
||||
} |
||||
}, |
||||
procedureDelete: { |
||||
default: { |
||||
sql: `DROP PROCEDURE IF EXISTS ??`, |
||||
paramsHints: ['procedure_name'] |
||||
} |
||||
}, |
||||
|
||||
relationList: { |
||||
default: { |
||||
sql: `SELECT
|
||||
kcu.CONSTRAINT_NAME as cstn, |
||||
kcu.TABLE_NAME as tn, |
||||
kcu.COLUMN_NAME as cn, |
||||
kcu.POSITION_IN_UNIQUE_CONSTRAINT as puc, |
||||
kcu.REFERENCED_TABLE_NAME as rtn, |
||||
kcu.REFERENCED_COLUMN_NAME as rcn, |
||||
rc.MATCH_OPTION as mo, |
||||
rc.UPDATE_RULE as ur, |
||||
rc.DELETE_RULE as dr |
||||
FROM |
||||
information_schema.\`KEY_COLUMN_USAGE\` AS kcu
|
||||
INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS AS rc ON |
||||
kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME |
||||
WHERE |
||||
kcu.table_schema = ? |
||||
AND kcu.referenced_column_name IS NOT NULL |
||||
AND kcu.table_name=?`,
|
||||
paramsHints: ['database', 'tn'] |
||||
} |
||||
}, |
||||
|
||||
schemaCreate: { |
||||
default: { |
||||
sql: `create database ??`, |
||||
paramsHints: ['database_name'] |
||||
} |
||||
}, |
||||
schemaDelete: { |
||||
default: { |
||||
sql: `drop database ??`, |
||||
paramsHints: ['database_name'] |
||||
} |
||||
}, |
||||
triggerList: { |
||||
default: { |
||||
sql: `SHOW TRIGGERS like ?`, |
||||
paramsHints: ['tn'] |
||||
} |
||||
}, |
||||
tableList: { |
||||
default: { |
||||
sql: ``, |
||||
paramsHints: [] |
||||
} |
||||
}, |
||||
testConnection: { |
||||
default: { |
||||
sql: ``, |
||||
paramsHints: [] |
||||
} |
||||
}, |
||||
triggerRead: { |
||||
default: { |
||||
sql: `SHOW FULL TABLES IN ?? WHERE TABLE_TYPE LIKE 'VIEW';`, |
||||
paramsHints: ['databaseName'] |
||||
} |
||||
}, |
||||
triggerDelete: { |
||||
default: { |
||||
sql: `DROP TRIGGER ??`, |
||||
paramsHints: ['trigger_name'] |
||||
} |
||||
}, |
||||
version: { |
||||
default: { |
||||
sql: ``, |
||||
paramsHints: [] |
||||
} |
||||
}, |
||||
viewRead: { |
||||
default: { |
||||
sql: `select * FROM INFORMATION_SCHEMA.VIEWS WHERE
|
||||
TABLE_SCHEMA = ? AND TABLE_NAME = ?`,
|
||||
paramsHints: ['databaseName', 'view_name'] |
||||
} |
||||
}, |
||||
//
|
||||
viewList: { |
||||
default: { |
||||
sql: `SHOW FULL TABLES IN ?? WHERE TABLE_TYPE LIKE 'VIEW'`, |
||||
paramsHints: ['databaseName'] |
||||
} |
||||
} |
||||
}; |
||||
|
||||
export default pgQueries; |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,34 @@
|
||||
// https://www.sqlite.org/datatype3.html
|
||||
const sqliteQueries = { |
||||
int: {}, |
||||
integer: {}, |
||||
tinyint: {}, |
||||
smallint: {}, |
||||
mediumint: {}, |
||||
bigint: {}, |
||||
'unsigned big int': {}, |
||||
int2: {}, |
||||
int4: {}, |
||||
|
||||
character: {}, |
||||
varchar: {}, |
||||
nchar: {}, |
||||
text: {}, |
||||
clob: {}, |
||||
'varying character': {}, |
||||
'native character': {}, |
||||
|
||||
blob: {}, |
||||
real: {}, |
||||
double: {}, |
||||
'double precision': {}, |
||||
float: {}, |
||||
|
||||
numeric: {}, |
||||
decimal: {}, |
||||
boolean: {}, |
||||
date: {}, |
||||
datetime: {} |
||||
}; |
||||
|
||||
export default sqliteQueries; |
@ -0,0 +1,14 @@
|
||||
const Emittery = require('emittery'); |
||||
|
||||
let emitSingleton = null; |
||||
|
||||
class Emit { |
||||
public readonly evt: any; |
||||
|
||||
constructor() { |
||||
if (emitSingleton) return emitSingleton; |
||||
this.evt = new Emittery(); |
||||
emitSingleton = this; |
||||
} |
||||
} |
||||
module.exports = Emit; |
@ -0,0 +1,13 @@
|
||||
class Result { |
||||
|
||||
constructor(code = 0, message = '', data = {}) { |
||||
this.code = code; |
||||
this.message = message; |
||||
this.data = data; |
||||
} |
||||
|
||||
|
||||
|
||||
} |
||||
|
||||
module.exports = Result; |
Loading…
Reference in new issue