json-schema-table
Advanced tools
Comparing version 1.0.9 to 1.0.10
{ | ||
"name": "json-schema-table", | ||
"version": "1.0.9", | ||
"version": "1.0.10", | ||
"description": "Creates and maintains a SQL table structure", | ||
@@ -25,7 +25,7 @@ "homepage": "", | ||
"chai": "^3.4.1", | ||
"eslint-config-google": "^0.7.1", | ||
"eslint-config-google": "^0.9.1", | ||
"gulp": "^3.9.1", | ||
"gulp-coveralls": "^0.1.4", | ||
"gulp-eslint": "^3.0.1", | ||
"gulp-istanbul": "^1.1.1", | ||
"gulp-eslint": "^4.0.0", | ||
"gulp-istanbul": "^1.1.2", | ||
"gulp-mocha": "3.0.1", | ||
@@ -35,3 +35,3 @@ "gulp-nsp": "^2.4.1", | ||
"mssql-cr-layer": "^2.0.0", | ||
"pg-cr-layer": "^2.0.2", | ||
"pg-cr-layer": "^2.0.3", | ||
"pretty-hrtime": "^1.0.2" | ||
@@ -38,0 +38,0 @@ }, |
163
src/index.js
@@ -96,2 +96,18 @@ /* eslint-disable max-len */ | ||
function getDbMetadata(dialect, tableName, dbSchemaName) { | ||
function isRedshift() { | ||
return new Promise(function(resolve, reject) { | ||
if (dialect.db.dialect !== 'postgres') { | ||
resolve(false); | ||
} else { | ||
dialect.db.isRedshift() | ||
.then(function(res) { | ||
resolve(res); | ||
}) | ||
.catch(function(err) { | ||
reject(err); | ||
}); | ||
} | ||
}); | ||
} | ||
var dbToProperty = dialect.db.dialect === 'mssql' ? mssqlToProperty : postgresToProperty; | ||
@@ -105,68 +121,79 @@ var metadata = { | ||
var catalog = dialect.db.dialect === 'mssql' ? 'db_name()' : 'current_database()'; | ||
return dialect.db.query('SELECT pk.CONSTRAINT_NAME as constraint_name,pk.TABLE_NAME as table_name,' + | ||
'pk.COLUMN_NAME as column_name,' + | ||
'rfk.TABLE_NAME as ref_table_name,rfk.COLUMN_NAME as ref_column_name,' + | ||
'c.DATA_TYPE as data_type,c.CHARACTER_MAXIMUM_LENGTH as character_maximum_length,' + | ||
'c.NUMERIC_PRECISION as numeric_precision,c.NUMERIC_SCALE as numerico_scale ' + | ||
'FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE as pk ' + | ||
'INNER JOIN INFORMATION_SCHEMA.COLUMNS as c ON pk.COLUMN_NAME=c.COLUMN_NAME AND pk.TABLE_NAME=c.TABLE_NAME AND ' + | ||
'pk.TABLE_CATALOG=c.TABLE_CATALOG AND pk.TABLE_SCHEMA=c.TABLE_SCHEMA ' + | ||
'LEFT OUTER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as rk ON pk.CONSTRAINT_NAME=rk.CONSTRAINT_NAME AND ' + | ||
'pk.TABLE_CATALOG=rk.CONSTRAINT_CATALOG AND pk.TABLE_SCHEMA=rk.CONSTRAINT_SCHEMA ' + | ||
'LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as rfk ON rk.UNIQUE_CONSTRAINT_NAME=rfk.CONSTRAINT_NAME ' + | ||
'AND pk.ORDINAL_POSITION=rfk.ORDINAL_POSITION AND ' + | ||
'pk.TABLE_CATALOG=rfk.TABLE_CATALOG AND pk.TABLE_SCHEMA=rfk.TABLE_SCHEMA ' + | ||
'WHERE pk.TABLE_CATALOG=' + catalog + | ||
'AND pk.TABLE_SCHEMA=\'' + dbSchemaName + '\'' + | ||
'ORDER BY pk.TABLE_NAME,pk.CONSTRAINT_NAME,pk.ORDINAL_POSITION') | ||
.then(function(recordset) { | ||
var constraints = {}; | ||
recordset.map(function(record) { | ||
var constraint = | ||
constraints[record.constraint_name] = constraints[record.constraint_name] || { | ||
table: record.table_name, | ||
references: record.ref_table_name, | ||
columns: [] | ||
}; | ||
constraint.columns.push(dbToProperty(record)); | ||
}); | ||
return constraints; | ||
}) | ||
.then(function(constraints) { | ||
_.forEach(constraints, function(constraint, constraintName) { | ||
var constraintType = constraintName.substr(0, 2).toLowerCase(); | ||
switch (constraintType) { | ||
case 'pk': | ||
metadata.tablesWithPrimaryKey[constraint.table] = constraint.columns; | ||
break; | ||
case 'fk': | ||
var fk = metadata.tablesWithForeignKeys[constraint.table] = | ||
metadata.tablesWithForeignKeys[constraint.table] || []; | ||
fk.push({ | ||
table: constraint.references, | ||
columns: constraint.columns | ||
}); | ||
break; | ||
case 'uk': | ||
var uk = metadata.tablesWithUniqueKeys[constraint.table] = | ||
metadata.tablesWithUniqueKeys[constraint.table] || []; | ||
uk.push(constraint.columns); | ||
break; | ||
} | ||
}); | ||
return dialect.db.query('SELECT COLUMN_NAME as column_name,IS_NULLABLE as is_nullable,' + | ||
'DATA_TYPE as data_type,' + | ||
'CHARACTER_MAXIMUM_LENGTH as character_maximum_length,NUMERIC_PRECISION as numeric_precision,' + | ||
'NUMERIC_SCALE as numeric_scale FROM ' + | ||
'INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=\'' + tableName + '\'' + | ||
'AND TABLE_CATALOG=' + catalog + | ||
'AND TABLE_SCHEMA=\'' + dbSchemaName + '\''); | ||
}) | ||
.then(function(recordset) { | ||
recordset.map(function(record) { | ||
metadata.columns[record.column_name] = | ||
dbToProperty(record); | ||
}); | ||
return metadata; | ||
return isRedshift() | ||
.then(function(rs) { | ||
if (!rs) { | ||
return dialect.db.query('SELECT pk.CONSTRAINT_NAME as constraint_name,pk.TABLE_NAME as table_name,' + | ||
'pk.COLUMN_NAME as column_name,' + | ||
'rfk.TABLE_NAME as ref_table_name,rfk.COLUMN_NAME as ref_column_name,' + | ||
'c.DATA_TYPE as data_type,c.CHARACTER_MAXIMUM_LENGTH as character_maximum_length,' + | ||
'c.NUMERIC_PRECISION as numeric_precision,c.NUMERIC_SCALE as numerico_scale ' + | ||
'FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE as pk ' + | ||
'INNER JOIN INFORMATION_SCHEMA.COLUMNS as c ON pk.COLUMN_NAME=c.COLUMN_NAME AND pk.TABLE_NAME=c.TABLE_NAME AND ' + | ||
'pk.TABLE_CATALOG=c.TABLE_CATALOG AND pk.TABLE_SCHEMA=c.TABLE_SCHEMA ' + | ||
'LEFT OUTER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as rk ON pk.CONSTRAINT_NAME=rk.CONSTRAINT_NAME AND ' + | ||
'pk.TABLE_CATALOG=rk.CONSTRAINT_CATALOG AND pk.TABLE_SCHEMA=rk.CONSTRAINT_SCHEMA ' + | ||
'LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as rfk ON rk.UNIQUE_CONSTRAINT_NAME=rfk.CONSTRAINT_NAME ' + | ||
'AND pk.ORDINAL_POSITION=rfk.ORDINAL_POSITION AND ' + | ||
'pk.TABLE_CATALOG=rfk.TABLE_CATALOG AND pk.TABLE_SCHEMA=rfk.TABLE_SCHEMA ' + | ||
'WHERE pk.TABLE_CATALOG=' + catalog + | ||
'AND pk.TABLE_SCHEMA=\'' + dbSchemaName + '\'' + | ||
'ORDER BY pk.TABLE_NAME,pk.CONSTRAINT_NAME,pk.ORDINAL_POSITION') | ||
.then(function(recordset) { | ||
var constraints = {}; | ||
recordset.map(function(record) { | ||
if (!constraints[record.constraint_name]) { | ||
constraints[record.constraint_name] = { | ||
table: record.table_name, | ||
references: record.ref_table_name, | ||
columns: [] | ||
}; | ||
} | ||
var constraint = constraints[record.constraint_name]; | ||
constraint.columns.push(dbToProperty(record)); | ||
}); | ||
return constraints; | ||
}); | ||
} else { | ||
// Redshift does not support PK or FK constraints so just return an empty array. | ||
return Promise.resolve({}); | ||
} | ||
}) | ||
.then(function(constraints) { | ||
_.forEach(constraints, function(constraint, constraintName) { | ||
var constraintType = constraintName.substr(0, 2).toLowerCase(); | ||
switch (constraintType) { | ||
case 'pk': | ||
metadata.tablesWithPrimaryKey[constraint.table] = constraint.columns; | ||
break; | ||
case 'fk': | ||
var fk = metadata.tablesWithForeignKeys[constraint.table] = | ||
metadata.tablesWithForeignKeys[constraint.table] || []; | ||
fk.push({ | ||
table: constraint.references, | ||
columns: constraint.columns | ||
}); | ||
break; | ||
case 'uk': | ||
var uk = metadata.tablesWithUniqueKeys[constraint.table] = | ||
metadata.tablesWithUniqueKeys[constraint.table] || []; | ||
uk.push(constraint.columns); | ||
break; | ||
} | ||
}); | ||
return dialect.db.query('SELECT COLUMN_NAME as column_name,IS_NULLABLE as is_nullable,' + | ||
'DATA_TYPE as data_type,' + | ||
'CHARACTER_MAXIMUM_LENGTH as character_maximum_length,NUMERIC_PRECISION as numeric_precision,' + | ||
'NUMERIC_SCALE as numeric_scale FROM ' + | ||
'INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=\'' + tableName + '\'' + | ||
'AND TABLE_CATALOG=' + catalog + | ||
'AND TABLE_SCHEMA=\'' + dbSchemaName + '\''); | ||
}) | ||
.then(function(recordset) { | ||
recordset.map(function(record) { | ||
metadata.columns[record.column_name] = | ||
dbToProperty(record); | ||
}); | ||
return metadata; | ||
}); | ||
} | ||
@@ -707,7 +734,7 @@ | ||
var found = false; | ||
var hash = (key.join('')).toLowerCase(); | ||
var hash = key.join('').toLowerCase(); | ||
_.forEach(existentKeys, function(uk) { | ||
var ukHash = (uk.reduce(function(columns, column) { | ||
var ukHash = uk.reduce(function(columns, column) { | ||
return columns + column.name; | ||
}, '')).toLowerCase(); | ||
}, '').toLowerCase(); | ||
if (hash === ukHash) { | ||
@@ -714,0 +741,0 @@ found = true; |
29628
738