daily pastebin goal
94%
SHARE
TWEET

Untitled

a guest Dec 7th, 2017 60 in 1 day
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Author:         Christian K.
  3. Organization:   XXXXX
  4.  
  5. Das Logging optimieren:
  6.     -z.B.: Changes to Commit summieren und am schluss gesammelt ausgeben.
  7. */
  8. var mysql = require('mysql');
  9. var filesystem = require("fs");
  10. require('../ErrorLogger/color/colors.js');
  11.  
  12. var pool = mysql.createPool({
  13.     connectionLimit: 100,
  14.     host: "localhost",
  15.     user: "nodejsusr",
  16.     port: "3306",
  17.     password: "XXXXXXXX",
  18.     database: "XXXXXXXX",
  19.     debug: false
  20. });
  21.  
  22.  
  23. var readInfo = JSON.parse(filesystem.readFileSync("Database/Infos/database-read-info.json"));
  24.  
  25. function queryRequest(requestInfo, id, resultHandler) {
  26.     //console.log(requestInfo.requestName);
  27.     var requestName = requestInfo.requestName;
  28.     var prefix = requestInfo.prefix;
  29.     requestInfo.requests = readInfo[requestName].requests;
  30.     if (requestName != null) {
  31.         requestId = id;
  32.         var foundRequest = readInfo[requestName];
  33.         if (foundRequest != null) {
  34.             //console.log(table,id);
  35.             try {
  36.                 pool.getConnection((err, connection) => {
  37.                     var isList = foundRequest.is_list;
  38.                     if (isList == null) {
  39.                         isList = false;
  40.                     }
  41.                     var query;
  42.                     console.log("FoundRequestname: " + requestName);
  43.                     console.log("isList: " + isList);
  44.                     try {
  45.                         if (err) throw err;
  46.                         if (isList) {
  47.                             query = listQuery(foundRequest);
  48.                         } else {
  49.                             query = objectQuery(foundRequest, requestId);
  50.                         }
  51.                         if (query != null) {
  52.                             var sql = connection.query(query, (err, rows) => {     //SQL QUERY
  53.                                 console.log(green, "Querystring: " + sql.sql + "\n");
  54.                                 connection.release();
  55.                                 if (err) {
  56.                                     requestInfo.error = err;
  57.                                     console.log(orange, "Warning: Error in Database-Query: " + err.stack);
  58.                                     resultHandler(new Object(), requestInfo);
  59.                                     return;
  60.                                 }
  61.                                 //console.log(rows[0]);
  62.                                 // Bug workaround?: resultHandler(JSON.parse(JSON.stringify(rows[0])), requestInfo);                        
  63.                                 //connection.release();
  64.                                 if (isList) {
  65.                                     //console.log("Complete LIST: " + JSON.stringify(rows, null, 2));
  66.                                     resultHandler(rows, requestInfo);
  67.                                 } else {
  68.                                     if ((rows[0] != undefined)) {                 //Abfrage ob ID in Datanbank vorhanden
  69.                                         resultHandler(rows[0], requestInfo);
  70.                                     } else {
  71.                                         requestInfo.error = new Error("Warning: ID not found: " + requestId)
  72.                                         console.log(orange, "Warning: ID not found: " + requestId);
  73.                                         resultHandler(new Object(), requestInfo);
  74.                                     }
  75.                                 }
  76.                             });
  77.                         } else {
  78.                             resultHandler({}, requestInfo);
  79.                             throw {
  80.                                 name: "SQL Query: ",
  81.                                 message: "Query String is null..."
  82.                             }
  83.                         }
  84.                     } catch (e) {
  85.                         console.log(e.name + ': ' + e.message);
  86.                     }
  87.  
  88.                 });
  89.             }
  90.             catch (e) {
  91.                 console.log(e.name + ': ' + e.message);
  92.             }
  93.         } else {
  94.             console.log(orange, "Warning: foundrequest either null or not found in info: " + foundRequest);
  95.         }
  96.     } else {
  97.  
  98.         console.log(orange, "Warning: requestName is null or not found: " + requestId);
  99.     }
  100.  
  101. }
  102.  
  103.  
  104. function listQuery(requestInfo) {
  105.     var queryStr = "";
  106.     var table = requestInfo.table;
  107.     if (readInfo[table].requests) {
  108.         requestInfo.requests += readInfo[table].requests;
  109.     }
  110.     console.log("Table : " + table);
  111.     if (table != null) {
  112.         var selectQuery = table + ".id AS " + table + "__id, " + table + ".revision_id AS " + table + "__revision_id, " + table + ".deleted_by";
  113.         selectQuery += selectedFieldsForTable(table);
  114.         var joins = requestInfo.joins;
  115.         if (joins != null) {
  116.             var joinConcatStr = new String;
  117.             for (join of joins) {
  118.                 var joinTable = join.table;
  119.                 if (joinTable != null) {
  120.                     selectQuery += selectedFieldsForTable(joinTable);
  121.                 } else {
  122.                     throw {
  123.                         name: "listQuery: ",
  124.                         message: "joinTable is nul"
  125.                     }
  126.                 }
  127.                 joinConcatStr += makeJoin(join);  //Joinsfunktion
  128.             }
  129.             //console.log("JoinConcatString: " + joinConcatStr);
  130.             queryStr = "SELECT " + selectQuery + " FROM " + table + " LEFT JOIN " + table + "_revision ON " + table + "_revision.id = " + table + ".revision_id ";
  131.             queryStr += joinConcatStr + "WHERE " + table + ".deleted_by IS NULL";
  132.         } else {
  133.             console.log(orange, "Warning: no joins in table: " + table);
  134.         }
  135.     } else {
  136.         throw {
  137.             name: "listQuery: ",
  138.             message: "table is null..."
  139.         }
  140.     }
  141.     return queryStr;
  142. }
  143.  
  144.  
  145. var rightsInfo = JSON.parse(filesystem.readFileSync("Database/Infos/rights-access-fields.json"));
  146.  
  147. function selectedFieldsForTable(table) {
  148.     var selectQuery = "";
  149.     var fields = rightsInfo[table];
  150.     if (fields instanceof Array) {
  151.         for (field of fields) {
  152.             selectQuery += ", " + table + "_revision." + field + " AS "  + table + "_revision__" + field;
  153.         }
  154.     } else {
  155.         throw {
  156.             name: "selectedFieldsForTable",
  157.             message: "fields is not type of Array, fields: " + fields
  158.         }
  159.     }
  160.     return selectQuery;
  161. }
  162.  
  163. function objectQuery(requestInfo, id) {
  164.     var queryStr = "";
  165.     console.log(blue,"RequestInfo from Controller: "+JSON.stringify(requestInfo, null, 2));
  166.     var table = requestInfo.table;
  167.     if (readInfo[table].requests) {
  168.         requestInfo.requests += readInfo[table].requests;
  169.     }
  170.     queryStr = listQuery(requestInfo) + " AND " + table + ".id = " + id;
  171.     return queryStr;
  172. }
  173.  
  174. function makeJoin(joinInfo) {
  175.     var referenceId = joinInfo.referenceId;
  176.     var referenceTable = joinInfo.referenceTable;
  177.     var table = joinInfo.table;
  178.     var ret = null;
  179.     if (table != null) {
  180.         //     if (table == "clientList") {
  181.         //         console.log(red,"table is: "+table);
  182.         //         ret =  " LEFT JOIN " + table + " ON " + referenceTable + "_revision." + referenceId + " = " + table + ".id ";
  183.         //     }
  184.         ret = " LEFT JOIN " + table + " ON " + referenceTable + "_revision." + referenceId + " = " + table + ".id LEFT JOIN " + table + "_revision ON " + table + ".revision_id = " + table + "_revision.id ";
  185.         console.log(red, "table is: " + table);
  186.  
  187.     } else {
  188.         throw {
  189.             name: "makeJoin: ",
  190.             message: "table is null..."
  191.         }
  192.     }
  193.     return ret;
  194. }
  195.  
  196.  
  197. //var objectDataMockup = JSON.parse(filesystem.readFileSync("Database/Infos/dbmockup.json"));
  198. var updateInfo = JSON.parse(filesystem.readFileSync("Database/Infos/database-update-info.json"));//Only 4 testing
  199.  
  200. //console.log(JSON.stringify(updateInfo));
  201.  
  202. function updateObject(requestName, objectData) {
  203.  
  204.     console.log(blue, "RequestName: " + requestName + "\n");
  205.     console.log(blue, "ObjectData: " + JSON.stringify(objectData) + "\n");
  206.  
  207.  
  208.     if (requestName == null || objectData == null) {
  209.         console.log(orange, "Warning: The method updateObject has only one, or no arguments... Fill in exact two arguments: (\'requestName\',\'objectData\')");
  210.     } else {
  211.         var requestInfo = updateInfo[requestName];
  212.         if (requestInfo != null) {
  213.             var updates = requestInfo.requests;
  214.             if ((updates != null) && (updates instanceof Array)) {
  215.                 for (request of updates) {
  216.                     var idName = request.jsIdName;
  217.                     if (idName != null) {
  218.                         var id = objectData[idName];
  219.                         if (id == null) {
  220.                             console.log(orange, "Warning: Update-Controller can´t access proper id, value: " + id + " for table: " + request.tableName);
  221.                         } else {
  222.                             saveRevision(request, objectData, id);
  223.                         }
  224.                     } else {
  225.                         console.log(orange, "Warning: idName has no proper value: " + idName);
  226.                     }
  227.                 }
  228.             } else {
  229.                 console.log(orange, "Warning: requests is either null or not typ of array! requests: " + updates);
  230.             }
  231.         } else {
  232.             console.log(orange, "Warning: can´t access proper requestInfo, value is: " + requestInfo);
  233.         }
  234.     }
  235.  
  236.     function saveRevision(requestInfo, objectData, id) {
  237.         console.log(blue, "requestInfo : " + JSON.stringify(requestInfo) + "\nObjectData : " + JSON.stringify(objectData) + "\nID: " + id);
  238.         if (requestInfo != null) {
  239.             var tableName = requestInfo.tableName;
  240.             if (tableName != null) {
  241.                 pool.getConnection(function (err, connection) {
  242.                     if (connection != null) {
  243.                         console.log(tableName);
  244.                         //connection.query("SELECT * FROM " + tableName + " WHERE " + tableName + ".id = " + id, function (err, rows) {
  245.                         var qselect = connection.query("SELECT " + tableName + ".id " + selectedFieldsForTable(tableName) + " FROM " + tableName + ", " + tableName + "_revision WHERE " + tableName + ".revision_id = " + tableName + "_revision.id AND owner_id=" + id, function (err, rows) {
  246.                             if ((rows == null) || (rows.length == null)) {
  247.                                 console.log("DB Output: " + JSON.stringify(rows, null, 2));
  248.                                 data = requestInfo.defaultData;
  249.                                 if (data != null) {
  250.                                     data[tableName + "__id"] = id;
  251.                                     console.log("SELECT * FROM " + tableName + " " + tableName + "_revision WHERE " + tableName + ".revision_id = " + tableName + "_revision.id AND owner_id=" + id);
  252.                                 } else {
  253.                                     console.log(orange, "Warning: Default data is missing in requestInfo. Available keys: " + Object.keys(requestInfo));
  254.                                 }
  255.                             } else {
  256.                                 if (err) {
  257.                                     console.log(orange, "Warning: Error when querying database: " + err.stack);
  258.                                 }
  259.                                 //console.log("\n"+green, "Query-SELECT: " + qselect.sql)+"\n";
  260.                                 //console.log("Found Data: " + JSON.stringify(rows[0], null, 2));
  261.                                 data = rows[0];
  262.                                 //data.__id = rows[0].id;
  263.  
  264.                             }
  265.                             console.log(green, "Query-SELECT:\n" + qselect.sql);
  266.                             var hasChanges = false;
  267.                             var fieldNames = requestInfo.fieldNames;
  268.                             if (fieldNames != null) {
  269.                                 for (key of fieldNames) {
  270.                                     var newValue = objectData[key]; //ToDo beziehung auf table herstellen z.B.: ('client_person_revision__' + objectData[key] )
  271.  
  272.                                     if ((newValue != null) && (data[key] != newValue)) {
  273.                                         console.log(blue, "DATAKEY: " + data[key]);
  274.                                         console.log(yellow, "Changes: " + key + " from " + data[key] + " to " + newValue + " compare: " + (data[key] != newValue) + " reverse " + (data[key] == newValue));
  275.                                         data[key] = newValue;
  276.                                         hasChanges = true;
  277.                                     }
  278.  
  279.  
  280.                                 }
  281.  
  282.                             } else {
  283.                                 console.log(orange, "Warning: fieldNames is missing for id:" + id + " available keys: " + Object.keys(requestInfo));
  284.                             }
  285.  
  286.  
  287.  
  288.                             if (hasChanges) {
  289.                                 console.log(blue, "DATA: " + JSON.stringify(data));
  290.                                 console.log(green, "Committing: " + tableName);
  291.                                 var filteredData = {};
  292.                                 Object.keys(data).forEach((key) => {
  293.                                     var copyKey = Object.assign(key);
  294.                                     if (key != 'id') {
  295.                                         key = copyKey.slice(copyKey.indexOf('__') + 2), copyKey.length - 1,
  296.                                             filteredData[key] = data[copyKey]
  297.                                     }
  298.                                 });
  299.                                 //Object.keys(data).forEach(key => filteredData[key.replace('__', text => text.split('__'))] = data[key]);
  300.                                 console.log(blue, "FilteredData: " + JSON.stringify(filteredData));
  301.                                 var sql = connection.query("INSERT INTO " + tableName + "_revision SET ?", filteredData, (err, res, resultHandler) => { // update
  302.                                     connection.release();
  303.                                     if (err) {
  304.                                         console.log(orange, "Warning: Insert Error when querying database: " + err.stack);
  305.                                         console.log(green, "SQL-INSERT: " + sql.sql);
  306.                                         connection.rollback(function () {
  307.                                             throw err;
  308.                                         });
  309.                                     }
  310.                                     if (!err) {
  311.                                         console.log(green, "SQL-INSERT response: \n" + JSON.stringify(res, null, 2));
  312.                                         connection.query("Update " + tableName + " SET revision_id = " + res.insertId + " WHERE ID = " + id, (err, res, resultHandler) => { console.log("SQL-UPDATE: " + JSON.stringify(res)); });
  313.                                     }
  314.                                 });
  315.                             } else {
  316.                                 console.log(blue, "No changes to commit: " + tableName);
  317.                                 connection.release();
  318.                             }
  319.                         });
  320.                     } else {
  321.                         console.log(orange, "Warning: can´t connect to Database: " + err.stack);
  322.                     }
  323.                 });
  324.             } else {
  325.                 console.log(red, "Table: " + tableName + " not found in Database...");
  326.             }
  327.         } else {
  328.             console.log(orange, "Warning: requestInfo is null");
  329.         }
  330.     }
  331. }
  332.  
  333.  
  334. function splitRequestInfo(objectData) {
  335.     var rows = Object.assign(objectData);
  336.     var resObj = {};
  337.     if (rows != null) {
  338.         for (var row of rows) {
  339.             let splitStr = row.split("__");
  340.             for (var singleStr of splitStr) {
  341.                 resObj = singleStr;
  342.             }
  343.             return resObj;
  344.         }
  345.     } else {
  346.         return 0;
  347.     }
  348. }
  349.  
  350. function toObject(arr) {
  351.     var rv = {};
  352.     for (var i = 0; i < arr.length; ++i)
  353.         rv[i] = arr[i];;
  354.     var newObject = {};
  355.     newObject = rv[0];
  356.  
  357.     return newObject;
  358. }
  359.  
  360. module.exports.queryRequest = queryRequest;
  361. module.exports.updateObject = updateObject;
RAW Paste Data
Top