365 lines
12 KiB
JavaScript
365 lines
12 KiB
JavaScript
var DBPRV = WScript.Arguments(0);
|
|
var DBVER = WScript.Arguments(1);
|
|
|
|
var newdb = 'TEST_DB' + DBVER;
|
|
var olddb = 'TEST_DB' + DBPRV + 'toDB' + DBVER;
|
|
|
|
WScript.Echo("CScript Compare.js " + DBPRV + " " + DBVER);
|
|
WScript.Echo("Comparing " + olddb + " to " + newdb)
|
|
|
|
|
|
var Oracle = new ActiveXObject("ADODB.Connection");
|
|
var strconn = "Provider=OraOLEDB.Oracle.1;"
|
|
+ "Data Source=Work;"
|
|
+ "User Id=system;"
|
|
+ "Password=XZSTXnHGjfNNODfQc";
|
|
|
|
Oracle.Open(strconn);
|
|
// De eerste paar onderkennen vooral als iets gedropt moet worden
|
|
checkora("all_tables", "TABLE_NAME")
|
|
checkora("all_views", "VIEW_NAME")
|
|
checkora("all_triggers", "TRIGGER_NAME, TABLE_NAME")
|
|
checkora("all_sequences", "SEQUENCE_NAME, MIN_VALUE, INCREMENT_BY", "SEQUENCE_OWNER")
|
|
|
|
// DATA_DEFAULT zou ik graag contoleren maar is WIDE-MEMO
|
|
checkora("all_tab_columns", "TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE")
|
|
// CONSTRAINT_NAME en R_CONSTRAINT_NAME, zou ik graag controleren maar is vaak systeem gegenereerd
|
|
checkora("all_constraints", "CONSTRAINT_TYPE, TABLE_NAME, DELETE_RULE")
|
|
|
|
// INDEX_NAME, zou ik graag controleren maar is vaak systeem gegenereerd
|
|
checkora("all_indexes", "TABLE_NAME, UNIQUENESS")
|
|
|
|
checkora("all_ind_columns", "INDEX_NAME, TABLE_NAME, COLUMN_NAME, COLUMN_POSITION, DESCEND", "INDEX_OWNER", " AND INDEX_NAME NOT LIKE 'SYS_%'")
|
|
|
|
var sql = "SELECT *"
|
|
+ " FROM all_tables"
|
|
+ " WHERE owner = UPPER('" + newdb + "')"
|
|
+ " AND table_name <> 'ADM_TRACKING'"
|
|
+ " AND table_name <> 'FAC_AUDIT'"
|
|
+ " ORDER BY table_name";
|
|
var oRs = Oracle.Execute(sql);
|
|
while (!oRs.Eof)
|
|
{
|
|
checkauto(oRs("table_name").Value);
|
|
oRs.MoveNext();
|
|
}
|
|
|
|
// Controleer default lcl's
|
|
var sql = "SELECT fac_srtnotificatie_oms"
|
|
+ " FROM " + newdb + ".fac_srtnotificatie"
|
|
+ " WHERE fac_srtnotificatie_oms IS NOT NULL"
|
|
+ " AND NOT EXISTS"
|
|
+ " (SELECT 1"
|
|
+ " FROM " + newdb + ".fac_locale_xsl"
|
|
+ " WHERE fac_locale_xsl_label = fac_srtnotificatie_oms)";
|
|
checkempty(sql, "ORA- fac_srtnotificatie_oms lcl's die in FAC_LCL.SRC missen");
|
|
|
|
var sql = "SELECT fac_menuitems_label"
|
|
+ " FROM " + newdb + ".fac_menuitems"
|
|
+ " WHERE NOT EXISTS"
|
|
+ " (SELECT 1"
|
|
+ " FROM " + newdb + ".fac_locale_xsl"
|
|
+ " WHERE fac_locale_xsl_label = fac_menuitems_label)";
|
|
checkempty(sql, "ORA- fac_menuitems_label lcl's die in FAC_LCL.SRC missen");
|
|
|
|
var sql = "SELECT fac_menu_altlabel"
|
|
+ " FROM " + newdb + ".fac_menu"
|
|
+ " WHERE SUBSTR(fac_menu_altlabel, 1, 4) = 'lcl_'"
|
|
+ " AND NOT EXISTS"
|
|
+ " (SELECT 1"
|
|
+ " FROM " + newdb + ".fac_locale_xsl"
|
|
+ " WHERE fac_locale_xsl_label = fac_menu_altlabel)";
|
|
checkempty(sql, "ORA- fac_menu_altlabel lcl's die in FAC_LCL.SRC missen");
|
|
|
|
var sql = "SELECT fac_functie_omschrijving"
|
|
+ " FROM " + newdb + ".fac_functie"
|
|
+ " WHERE NOT EXISTS"
|
|
+ " (SELECT 1"
|
|
+ " FROM " + newdb + ".fac_locale_xsl"
|
|
+ " WHERE fac_locale_xsl_label = fac_functie_omschrijving)";
|
|
checkempty(sql, "ORA- fac_functie_omschrijving lcl's die in FAC_LCL.SRC missen");
|
|
|
|
var sql = "SELECT fac_functie_info"
|
|
+ " FROM " + newdb + ".fac_functie"
|
|
+ " WHERE NOT EXISTS"
|
|
+ " (SELECT 1"
|
|
+ " FROM " + newdb + ".fac_locale_xsl"
|
|
+ " WHERE fac_locale_xsl_label = fac_functie_info)";
|
|
checkempty(sql, "ORA- fac_functie_info lcl's die in FAC_LCL.SRC missen");
|
|
|
|
function checkora(sysview, cols, owner, extrawhere)
|
|
{
|
|
owner = owner || 'OWNER';
|
|
var sql = "SELECT " + cols
|
|
+ " FROM " + sysview
|
|
+ " WHERE " + owner + " = UPPER('" + olddb + "')"
|
|
+ (extrawhere||"")
|
|
+ " MINUS "
|
|
+ "SELECT " + cols
|
|
+ " FROM " + sysview
|
|
+ " WHERE " + owner + " = UPPER('" + newdb + "')"
|
|
+ (extrawhere||"");
|
|
checkempty(sql, "ORA- " + sysview + " in " + olddb + " maar niet in " + newdb);
|
|
var sql = "SELECT " + cols
|
|
+ " FROM " + sysview
|
|
+ " WHERE " + owner + " = UPPER('" + newdb + "')"
|
|
+ (extrawhere||"")
|
|
+ " MINUS "
|
|
+ "SELECT " + cols
|
|
+ " FROM " + sysview
|
|
+ " WHERE " + owner + " = UPPER('" + olddb + "')"
|
|
+ (extrawhere||"");
|
|
checkempty(sql, "ORA- " + sysview + " in " + newdb + " maar niet in " +olddb);
|
|
}
|
|
|
|
function checkauto(tbl)
|
|
{
|
|
var oldwhere = "";
|
|
if (tbl == "FAC_LOCALE_XSL")
|
|
{
|
|
oldwhere = " WHERE FAC_LOCALE_XSL_LANG NOT IN ('DE', 'FR')";
|
|
}
|
|
WScript.Echo("Checking " + tbl);
|
|
var cnt1 = Oracle.Execute("SELECT COUNT(*) FROM " + olddb + "." + tbl + oldwhere)(0).Value;
|
|
var cnt2 = Oracle.Execute("SELECT COUNT(*) FROM " + newdb + "." + tbl)(0).Value;
|
|
if (cnt1 != cnt2)
|
|
WScript.Echo("Aantal records " + tbl + " verschilt: " + olddb + " " + cnt1 + ", " + newdb + " " + cnt2);
|
|
|
|
var cols = [];
|
|
var sql = "SELECT *"
|
|
+ " FROM all_tab_columns"
|
|
+ " WHERE owner = UPPER('" + newdb + "')"
|
|
+ " AND table_name = UPPER('" + tbl + "')"
|
|
+ " AND data_type NOT IN ('DATE', 'LONG', 'MLD_T_UITVOERTIJD')";
|
|
var oRs = Oracle.Execute(sql);
|
|
while (!oRs.Eof)
|
|
{
|
|
var col = oRs("COLUMN_NAME").Value;
|
|
if (!col.match(/(FAC_WIDGET_TYPEREFKEY|_KEY|_VOLGNR|_SALT|_HASH|_OTPSECRET|AUT_IDP_SECRET|APIKEY|RES_RUIMTE_SYNCSTATE|MLD_MELDING_OMSCHRIJVING|FAC_LOCALE_KOLOMKEYVAL)$/))
|
|
cols.push(col)
|
|
oRs.MoveNext();
|
|
}
|
|
//WScript.Echo(cols);
|
|
if (cols.length) // Niet alleen _KEY's
|
|
{
|
|
var where = "";
|
|
if (tbl == 'FAC_SETTING')
|
|
where = " WHERE fac_setting_name NOT IN ('fac_logfilename','fac_logfilename','puo_fclt_web_apikey')"
|
|
check(tbl, cols, where);
|
|
}
|
|
}
|
|
|
|
function checkempty(sql, txt)
|
|
{
|
|
//WScript.Echo(sql);
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.Eof)
|
|
{
|
|
WScript.Echo("==================== " + txt);
|
|
//WScript.Echo(prettysql(sql));
|
|
//WScript.Echo("\n");
|
|
var n = 0;
|
|
var names = [];
|
|
while (!oRs.Eof)
|
|
{
|
|
n++;
|
|
var flds = [];
|
|
for (var i = 0; i < oRs.Fields.Count; i++)
|
|
{
|
|
if (n == 1)
|
|
names.push(oRs.Fields(i).Name);
|
|
flds.push(oRs.Fields(i).Value);
|
|
}
|
|
if (n == 1)
|
|
WScript.Echo(names.join(",") + "\n---");
|
|
WScript.Echo(flds.join(","));
|
|
oRs.MoveNext();
|
|
|
|
}
|
|
//WScript.Echo("\nVreemd, " + n + " record(s));
|
|
WScript.Echo("\n");
|
|
}
|
|
oRs.Close();
|
|
}
|
|
|
|
function check(tbl, cols, where)
|
|
{
|
|
var oldwhere = "";
|
|
if (tbl == "FAC_LOCALE_XSL")
|
|
{
|
|
oldwhere = " WHERE FAC_LOCALE_XSL_LANG NOT IN ('DE', 'FR')";
|
|
}
|
|
var sql = "SELECT " + cols
|
|
+ " FROM " + olddb + "." + tbl
|
|
+ (where || "") + oldwhere
|
|
+ " MINUS "
|
|
+ "SELECT " + cols
|
|
+ " FROM " + newdb + "." + tbl
|
|
+ (where || "");
|
|
checkempty(sql, tbl + " in " + olddb + " maar niet in " + newdb);
|
|
var sql = "SELECT " + cols
|
|
+ " FROM " + newdb + "." + tbl
|
|
+ (where || "")
|
|
+ " MINUS "
|
|
+ "SELECT " + cols
|
|
+ " FROM " + olddb + "." + tbl
|
|
+ (where || "") + oldwhere;
|
|
checkempty(sql, tbl + " in " + newdb + " maar niet in " + olddb);
|
|
}
|
|
|
|
function createShiftArr(step) {
|
|
|
|
var space = ' ';
|
|
|
|
if ( isNaN(parseInt(step)) ) { // argument is string
|
|
space = step;
|
|
} else { // argument is integer
|
|
switch(step) {
|
|
case 1: space = ' '; break;
|
|
case 2: space = ' '; break;
|
|
case 3: space = ' '; break;
|
|
case 4: space = ' '; break;
|
|
case 5: space = ' '; break;
|
|
case 6: space = ' '; break;
|
|
case 7: space = ' '; break;
|
|
case 8: space = ' '; break;
|
|
case 9: space = ' '; break;
|
|
case 10: space = ' '; break;
|
|
case 11: space = ' '; break;
|
|
case 12: space = ' '; break;
|
|
}
|
|
}
|
|
|
|
var shift = ['\n']; // array of shifts
|
|
for(ix=0;ix<100;ix++){
|
|
shift.push(shift[ix]+space);
|
|
}
|
|
return shift;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// http://www.eslinstructor.net/vkbeautify/
|
|
|
|
function isSubquery(str, parenthesisLevel) {
|
|
return parenthesisLevel - (str.replace(/\(/g,'').length - str.replace(/\)/g,'').length )
|
|
}
|
|
|
|
function split_sql(str, tab) {
|
|
|
|
return str.replace(/\s{1,}/g," ")
|
|
|
|
.replace(/ AND /ig,"~::~"+tab+tab+"AND ")
|
|
.replace(/ BETWEEN /ig,"~::~"+tab+"BETWEEN ")
|
|
.replace(/ CASE /ig,"~::~"+tab+"CASE ")
|
|
.replace(/ ELSE /ig,"~::~"+tab+"ELSE ")
|
|
.replace(/ END /ig,"~::~"+tab+"END ")
|
|
.replace(/ FROM /ig,"~::~FROM ")
|
|
.replace(/ GROUP\s{1,}BY/ig,"~::~GROUP BY ")
|
|
.replace(/ HAVING /ig,"~::~HAVING ")
|
|
//.replace(/ SET /ig," SET~::~")
|
|
.replace(/ IN /ig," IN ")
|
|
|
|
.replace(/ JOIN /ig,"~::~JOIN ")
|
|
.replace(/ CROSS~::~{1,}JOIN /ig,"~::~CROSS JOIN ")
|
|
.replace(/ INNER~::~{1,}JOIN /ig,"~::~INNER JOIN ")
|
|
.replace(/ LEFT~::~{1,}JOIN /ig,"~::~LEFT JOIN ")
|
|
.replace(/ RIGHT~::~{1,}JOIN /ig,"~::~RIGHT JOIN ")
|
|
|
|
.replace(/ ON /ig,"~::~"+tab+"ON ")
|
|
.replace(/ OR /ig,"~::~"+tab+tab+"OR ")
|
|
.replace(/ ORDER\s{1,}BY/ig,"~::~ORDER BY ")
|
|
.replace(/ OVER /ig,"~::~"+tab+"OVER ")
|
|
|
|
.replace(/\(\s{0,}SELECT /ig,"~::~(SELECT ")
|
|
.replace(/\)\s{0,}SELECT /ig,")~::~SELECT ")
|
|
|
|
.replace(/ THEN /ig," THEN~::~"+tab+"")
|
|
.replace(/ MINUS /ig,"~::~MINUS~::~")
|
|
.replace(/ UNION /ig,"~::~UNION~::~")
|
|
.replace(/ USING /ig,"~::~USING ")
|
|
.replace(/ WHEN /ig,"~::~"+tab+"WHEN ")
|
|
.replace(/ WHERE /ig,"~::~WHERE ")
|
|
.replace(/ WITH /ig,"~::~WITH ")
|
|
|
|
//.replace(/\,\s{0,}\(/ig,",~::~( ")
|
|
//.replace(/\,/ig,",~::~"+tab+tab+"")
|
|
|
|
.replace(/ ALL /ig," ALL ")
|
|
.replace(/ AS /ig," AS ")
|
|
.replace(/ ASC /ig," ASC ")
|
|
.replace(/ DESC /ig," DESC ")
|
|
.replace(/ DISTINCT /ig," DISTINCT ")
|
|
.replace(/ EXISTS /ig," EXISTS ")
|
|
.replace(/ NOT /ig," NOT ")
|
|
.replace(/ NULL /ig," NULL ")
|
|
.replace(/ LIKE /ig," LIKE ")
|
|
.replace(/\s{0,}SELECT /ig,"SELECT ")
|
|
.replace(/\s{0,}UPDATE /ig,"UPDATE ")
|
|
.replace(/ SET /ig," SET ")
|
|
|
|
.replace(/~::~{1,}/g,"~::~")
|
|
.split('~::~');
|
|
}
|
|
|
|
function prettysql(text,step)
|
|
{
|
|
|
|
var ar_by_quote = text.replace(/\s{1,}/g," ")
|
|
.replace(/\'/ig,"~::~\'")
|
|
.split('~::~'),
|
|
len = ar_by_quote.length,
|
|
ar = [],
|
|
deep = 0,
|
|
tab = ' ',
|
|
inComment = true,
|
|
inQuote = false,
|
|
parenthesisLevel = 0,
|
|
str = '',
|
|
ix = 0,
|
|
shift = createShiftArr(4);
|
|
|
|
for(ix=0;ix<len;ix++) {
|
|
if(ix%2) {
|
|
ar = ar.concat(ar_by_quote[ix]);
|
|
} else {
|
|
ar = ar.concat(split_sql(ar_by_quote[ix], tab) );
|
|
}
|
|
}
|
|
|
|
len = ar.length;
|
|
for(ix=0;ix<len;ix++)
|
|
{
|
|
parenthesisLevel = isSubquery(ar[ix], parenthesisLevel);
|
|
|
|
if( /\s{0,}\s{0,}SELECT\s{0,}/.exec(ar[ix])) {
|
|
ar[ix] = ar[ix].replace(/\,/g,",\n"+tab+tab+"")
|
|
}
|
|
|
|
if( /\s{0,}\s{0,}SET\s{0,}/.exec(ar[ix])) {
|
|
ar[ix] = ar[ix].replace(/\,/g,",\n"+tab+tab+"")
|
|
}
|
|
|
|
if( /\s{0,}\(\s{0,}SELECT\s{0,}/.exec(ar[ix])) {
|
|
deep++;
|
|
str += shift[deep]+ar[ix];
|
|
} else
|
|
if( /\'/.exec(ar[ix]) ) {
|
|
if(parenthesisLevel<1 && deep) {
|
|
deep--;
|
|
}
|
|
str += ar[ix];
|
|
}
|
|
else {
|
|
str += shift[deep]+ar[ix];
|
|
if(parenthesisLevel<1 && deep) {
|
|
deep--;
|
|
}
|
|
}
|
|
var junk = 0;
|
|
}
|
|
|
|
str = str.replace(/^\n{1,}/,'').replace(/\n{1,}/g,"\n");
|
|
return str;
|
|
}
|