sql-source-control-follow
Version:
Simple CLI for getting SQL into source control systems.
564 lines • 21.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
/* tslint:disable:max-line-length */
var os_1 = require("os");
var ts_util_is_1 = require("ts-util-is");
/**
* MSSQL generator.
*/
var MSSQLGenerator = /** @class */ (function () {
function MSSQLGenerator(config) {
this.config = config;
}
/**
* Get data file content.
*
* @param item Row from query.
*/
MSSQLGenerator.prototype.data = function (item) {
var _this = this;
var output = '';
switch (this.config.idempotency.data) {
case 'delete':
output += "DELETE FROM " + item.name + os_1.EOL;
output += os_1.EOL;
break;
case 'delete-and-reseed':
output += "DELETE FROM " + item.name;
output += os_1.EOL;
output += "DBCC CHECKIDENT ('" + item.name + "', RESEED, 0)";
output += os_1.EOL;
break;
case 'truncate':
output += "TRUNCATE TABLE " + item.name;
output += os_1.EOL;
break;
}
output += os_1.EOL;
output += "SET IDENTITY_INSERT " + item.name + " ON";
output += os_1.EOL;
output += os_1.EOL;
var counter = 0;
item.result.recordset.forEach(function (row) {
var keys = Object.keys(row);
var columns = keys.join(', ');
var values = keys.map(function (key) { return _this.safeValue(row[key]); }).join(', ');
if (counter === 0) {
output += "INSERT INTO " + item.name + " (" + columns + ") \n VALUES \n (" + values + ")";
}
else {
output += ",(" + values + ")";
}
counter++;
output += os_1.EOL;
});
output += os_1.EOL;
output += "SET IDENTITY_INSERT " + item.name + " OFF";
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Get function file content.
*
* @param item Row from query.
*/
MSSQLGenerator.prototype.function = function (item) {
var objectId = "[" + item.schema + "].[" + item.name + "]";
var type = item.type.trim();
var output = '';
switch (this.config.idempotency.functions) {
case 'if-exists-drop':
output += "IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
output += "DROP FUNCTION " + objectId;
output += os_1.EOL;
output += 'GO';
output += os_1.EOL;
break;
case 'if-not-exists':
output += "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
break;
}
output += item.text;
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Get stored procedure file content.
*
* @param item Row from query.
*/
MSSQLGenerator.prototype.storedProcedure = function (item) {
var objectId = "[" + item.schema + "].[" + item.name + "]";
var type = item.type.trim();
var output = '';
switch (this.config.idempotency.procs) {
case 'if-exists-drop':
output += "IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
output += "DROP PROCEDURE " + objectId;
output += os_1.EOL;
output += 'GO';
output += os_1.EOL;
break;
case 'if-not-exists':
output += "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
break;
}
output += item.text;
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Get schema file content.
*
* @param item Row from query.
*/
MSSQLGenerator.prototype.schema = function (item) {
var output = '';
output += "IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '" + item.name + "')";
output += os_1.EOL;
output += "EXEC('CREATE SCHEMA " + item.name + "')";
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Get table file content.
*
* @param item Row from query.
* @param columns Columns from query.
* @param primaryKeys Primary key from query.
* @param foreignKeys Foreign keys from query.
* @param indexes Indexes from query.
*/
MSSQLGenerator.prototype.table = function (item, columns, primaryKeys, foreignKeys, indexes) {
var _this = this;
var objectId = "[" + item.schema + "].[" + item.name + "]";
var type = item.type.trim();
var output = '';
switch (this.config.idempotency.tables) {
case 'if-exists-drop':
output += "IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
output += "DROP TABLE " + objectId;
output += os_1.EOL;
output += 'GO';
output += os_1.EOL;
break;
case 'if-not-exists':
output += "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
break;
}
output += "CREATE TABLE " + objectId;
output += os_1.EOL;
output += '(';
output += os_1.EOL;
columns
.filter(function (x) { return x.object_id === item.object_id; }).forEach(function (col, index, array) {
if (index !== array.length - 1) {
output += ' ' + _this.column(col) + ',';
}
else {
output += ' ' + _this.column(col);
}
output += os_1.EOL;
});
/*
* PrimaryKey, charge the pkObjectIds.length,if
* >1, do primaryKeyMulti
* =1, do primaryKey
* =0,output =''
* */
var pkObjectIds = primaryKeys.filter(function (x) { return x.object_id === item.object_id; });
if (pkObjectIds.length > 1) {
output += ' ' + this.primaryKey(pkObjectIds);
output += os_1.EOL;
}
else if (pkObjectIds.length === 1) {
output += ' ' + this.primaryKey(pkObjectIds);
output += os_1.EOL;
}
output += ')';
foreignKeys = foreignKeys.filter(function (x) { return x.object_id === item.object_id; });
if (foreignKeys.length || indexes.length) {
output += os_1.EOL;
output += os_1.EOL;
}
var fkIndex = [];
foreignKeys.forEach(function (v, index, arr) {
var flag = 0;
fkIndex.forEach(function (vx, i, arrx) {
if (fkIndex[i].name === v.name) {
flag = 1;
}
});
if (flag === 0) {
fkIndex.push({ name: v.name, flag: 0 });
}
});
fkIndex.forEach(function (vx, i, arrx) {
foreignKeys.filter(function (x) { return x.name === fkIndex[i].name; })
.forEach(function (v, index, arr) {
if (vx.flag === 0) {
output += _this.foreignKey(arr);
output += os_1.EOL;
vx.flag = 1;
}
});
});
output += os_1.EOL;
indexes = indexes.filter(function (x) { return x.object_id === item.object_id; });
if (foreignKeys.length && indexes.length) {
output += os_1.EOL;
}
var indexsx = [];
indexes.forEach(function (v, index, arr) {
var flag = 0;
indexsx.forEach(function (vx, i, arrx) {
if (indexsx[i].name === v.name) {
flag = 1;
}
});
if (flag === 0) {
indexsx.push({ name: v.name, flag: 0 });
}
});
indexsx.forEach(function (vx, i, arrx) {
indexes.filter(function (x) { return x.name === indexsx[i].name; })
.forEach(function (v, index, arr) {
if (vx.flag === 0) {
output += _this.index(arr);
output += os_1.EOL;
vx.flag = 1;
}
});
});
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Get trigger file content.
*
* @param item Row from query.
*/
MSSQLGenerator.prototype.trigger = function (item) {
var objectId = "[" + item.schema + "].[" + item.name + "]";
var type = item.type.trim();
var output = '';
switch (this.config.idempotency.triggers) {
case 'if-exists-drop':
output += "IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
output += "DROP TRIGGER " + objectId;
output += os_1.EOL;
output += 'GO';
output += os_1.EOL;
break;
case 'if-not-exists':
output += "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
break;
}
output += item.text;
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Get type file content.
*
* @param item Row from query.
* @param columns Columns from query.
*/
MSSQLGenerator.prototype.type = function (item, columns) {
var _this = this;
var objectId = "[" + item.schema + "].[" + item.name + "]";
var type = item.type.trim();
var output = '';
switch (this.config.idempotency.types) {
case 'if-exists-drop':
output += 'IF EXISTS (';
output += os_1.EOL;
output += ' SELECT 1 FROM sys.table_types AS t';
output += os_1.EOL;
output += ' JOIN sys.schemas s ON t.schema_id = s.schema_id';
output += os_1.EOL;
output += " WHERE t.name = '" + item.name + "' AND s.name = '" + item.schema + "'";
output += os_1.EOL;
output += ')';
output += os_1.EOL;
output += "DROP TYPE " + objectId;
output += os_1.EOL;
output += 'GO';
output += os_1.EOL;
break;
case 'if-not-exists':
output += "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
break;
}
output += "CREATE TYPE " + objectId + " AS TABLE";
output += os_1.EOL;
output += '(';
output += os_1.EOL;
columns
.filter(function (x) { return x.object_id === item.object_id; })
.forEach(function (col, idx, array) {
output += ' ' + _this.column(col);
if (idx !== array.length - 1) {
// not the last column
output += ',';
}
output += os_1.EOL;
});
output += ')';
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Get view file content.
*
* @param item Row from query.
*/
MSSQLGenerator.prototype.view = function (item) {
var objectId = "[" + item.schema + "].[" + item.name + "]";
var type = item.type.trim();
var output = '';
switch (this.config.idempotency.views) {
case 'if-exists-drop':
output += "IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
output += "DROP VIEW " + objectId;
output += os_1.EOL;
output += 'GO';
output += os_1.EOL;
break;
case 'if-not-exists':
output += "IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('" + objectId + "') AND type = '" + type + "')";
output += os_1.EOL;
break;
}
output += item.text;
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Safely transform SQL value for scripting.
*
* @param value SQL data value.
*/
MSSQLGenerator.prototype.safeValue = function (value) {
if (ts_util_is_1.isNull(value)) {
return 'NULL';
}
if (ts_util_is_1.isString(value)) {
value = value.replace(/'/ig, "''");
return "'" + value + "'";
}
if (ts_util_is_1.isDate(value)) {
value = value.toISOString();
return "'" + value + "'";
}
if (ts_util_is_1.isBoolean(value)) {
return value ? 1 : 0;
}
return value;
};
/**
* Get script for table's column.
*
* @param item Row from query.
*/
MSSQLGenerator.prototype.column = function (item) {
var output = "[" + item.name + "]";
if (item.is_computed) {
output += " AS " + item.formula;
return output;
}
output += " " + item.datatype;
switch (item.datatype) {
case 'varchar':
output += '(' + (item.max_length === -1 ? 'max' : item.max_length) + ')';
break;
case 'char':
output += '(' + (item.max_length === -1 ? 'max' : item.max_length) + ')';
break;
case 'varbinary': break;
case 'binary': break;
case 'text': break;
case 'nvarchar':
output += '(' + (item.max_length === -1 ? 'max' : item.max_length / 2) + ')';
break;
case 'nchar':
output += '(' + (item.max_length === -1 ? 'max' : item.max_length / 2) + ')';
break;
case 'ntext': break;
case 'datetime2': break;
case 'time2': break;
case 'datetimeoffset':
output += "(" + item.scale + ")";
break;
case 'decimal':
output += "(" + item.precision + ", " + item.scale + ")";
break;
}
if (item.collation_name) {
output += " COLLATE " + item.collation_name;
}
output += item.is_nullable ? ' NULL' : ' NOT NULL';
if (item.definition) {
output += " DEFAULT" + item.definition;
}
if (item.is_identity) {
output += " IDENTITY(" + (item.seed_value || 0) + ", " + (item.increment_value || 1) + ")";
}
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Get script for table's primary key.
*
* @param Row from query.
*/
MSSQLGenerator.prototype.primaryKey = function (arr) {
var output = '';
if (arr.length > 1) {
arr.forEach(function (v, i, a) {
var direction = a[i].is_descending_key ? 'DESC' : 'ASC';
if (i === 0) {
output += "CONSTRAINT [" + a[i].name + "] PRIMARY KEY ([" + a[i].column + "] " + direction + ",";
}
else {
if (i === (a.length - 1)) {
output += "[" + a[i].column + "] " + direction + ")";
}
else {
output += "[" + a[i].column + "] " + direction + ",";
}
}
});
}
else if (arr.length === 1) {
var direction = arr[0].is_descending_key ? 'DESC' : 'ASC';
output += "CONSTRAINT [" + arr[0].name + "] PRIMARY KEY ([" + arr[0].column + "] " + direction + ")";
}
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Get script for table's foreign key.
*
* @param item Row from foreignKeys query.
*/
MSSQLGenerator.prototype.foreignKey = function (arr) {
var item = arr[0];
var objectId = "[" + arr[0].schema + "].[" + arr[0].table + "]";
var parentObjectId = "[" + arr[0].parent_schema + "].[" + arr[0].parent_table + "]";
var output = '';
var output1 = '';
if (arr.length > 1) {
arr.forEach(function (v, i, a) {
if (i === 0) {
output += "ALTER TABLE " + objectId + " WITH " + (a[i].is_not_trusted ? 'NOCHECK' : 'CHECK');
output += " ADD CONSTRAINT [" + a[i].name + "] FOREIGN KEY ([" + a[i].column + "],";
output1 += " REFERENCES " + parentObjectId + " ([" + a[i].reference + "],";
}
else {
if (i === (a.length - 1)) {
output += "[" + a[i].column + "])";
output1 += " [" + a[i].reference + "])";
}
else {
output += "[" + a[i].column + "],";
output1 += "[" + a[i].reference + "],";
}
}
});
output += output1;
}
else if (arr.length === 1) {
output += "ALTER TABLE " + objectId + " WITH " + (item.is_not_trusted ? 'NOCHECK' : 'CHECK');
output += " ADD CONSTRAINT [" + item.name + "] FOREIGN KEY ([" + item.column + "])";
output += " REFERENCES " + parentObjectId + " ([" + item.reference + "])";
}
switch (item.delete_referential_action) {
case 1:
output += ' ON DELETE CASCADE';
break;
case 2:
output += ' ON DELETE SET NULL';
break;
case 3:
output += ' ON DELETE SET DEFAULT';
break;
}
switch (item.update_referential_action) {
case 1:
output += ' ON UPDATE CASCADE';
break;
case 2:
output += ' ON UPDATE SET NULL';
break;
case 3:
output += ' ON UPDATE SET DEFAULT';
break;
}
output += os_1.EOL;
output += "ALTER TABLE " + objectId + " CHECK CONSTRAINT [" + item.name + "]";
output += os_1.EOL;
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
/**
* Get script for table's indexes.
*
* @param arr Row from query.
*/
MSSQLGenerator.prototype.index = function (arr) {
var output = '';
if (arr.length > 1) {
arr.forEach(function (v, i, a) {
var direction = a[i].is_descending_key ? 'DESC' : 'ASC';
if (i === 0) {
var objectId = "[" + a[i].schema + "].[" + a[i].table + "]";
output += "IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID('" + objectId + "') AND name = '" + a[i].name + "')";
output += os_1.EOL;
output += 'CREATE';
if (a[i].is_unique) {
output += ' UNIQUE';
}
output += " NONCLUSTERED INDEX [" + a[i].name + "] ON " + objectId;
output += "([" + a[i].column + "] " + (a[i].is_descending_key ? 'DESC' : 'ASC') + ",";
}
else {
if (i === (a.length - 1)) {
output += "[" + a[i].column + "] " + (a[i].is_descending_key ? 'DESC' : 'ASC') + ")";
}
else {
output += "[" + a[i].column + "] " + (a[i].is_descending_key ? 'DESC' : 'ASC') + ",";
}
}
});
}
else if (arr.length === 1) {
var objectId = "[" + arr[0].schema + "].[" + arr[0].table + "]";
output += "IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID('" + objectId + "') AND name = '" + arr[0].name + "')";
output += os_1.EOL;
output += 'CREATE';
if (arr[0].is_unique) {
output += ' UNIQUE';
}
output += " NONCLUSTERED INDEX [" + arr[0].name + "] ON " + objectId;
output += "([" + arr[0].column + "] " + (arr[0].is_descending_key ? 'DESC' : 'ASC') + ")";
}
// todo (jbl): includes
output += os_1.EOL;
output = output.trim().replace(/[\x00-\x08\x0E-\x1F\x7F]/g, '');
return output;
};
return MSSQLGenerator;
}());
exports.default = MSSQLGenerator;
//# sourceMappingURL=mssql.js.map