Advertisement
Guest User

Db file

a guest
May 26th, 2016
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var path = require('path');
  2. var fs = require('fs');
  3. var errors = require('../../utilities/errors');
  4. var logger = require('../../utilities/clog');
  5. //object for making & consolidating a db connection
  6.  
  7. var JDBC = require('jdbc');
  8. var jinst = require('jdbc/lib/jinst')
  9. var _ = require('underscore');
  10. var dbConneInit = false;
  11.  
  12. function dbConnection(db, cb, minPoolSize, maxPoolSize){
  13.  
  14.     var dbConn = this;
  15.  
  16.     var prefix = '';
  17.  
  18.     var jarPath = db['*JDBC_driver_path'];
  19.     var connOpts = {
  20.         libpath: jarPath,
  21.         drivername: '',
  22.         url: ''
  23.     };
  24.     fs.exists(jarPath, function(exists){
  25.         if(!exists){
  26.             jarPath = path.join(__dirname,'..', '..', '..','jdbc', jarPath);
  27.             fs.exists(jarPath, function(exists){
  28.                 if(!exists){
  29.                     console.log(jarPath + ' is not a valid path/file!');
  30.                 }else{
  31.                     initJDBC();
  32.                 }
  33.             });
  34.         }else{
  35.             initJDBC();
  36.         }
  37.     });
  38.  
  39.  
  40.     function initJDBC()
  41.     {
  42.         connOpts.libpath = jarPath;
  43.         var file = path.basename(jarPath);
  44.         var useOverride = db.use_override_url;
  45.  
  46.         if(file == 'ojdbc6.jar'){ //oracle db
  47.             connOpts.drivername = 'oracle.jdbc.OracleDriver';
  48.  
  49.             if(useOverride) {
  50.                 connOpts.url = db.override_url;
  51.                 console.log("[********** USE OVERRIDE ENABLED : " + useOverride);
  52.                 console.log("[********** DB CONNECTION STRING : " + db.override_url);
  53.             }
  54.             else
  55.                 connOpts.url = 'jdbc:oracle:thin:' + db.username + '/' + db.password + '@' + db.hostname + ':' + db.port +':'+ db.sid_or_db_name;
  56.  
  57.             dbConn.getVersionInfo = function getVersionInfo(cb){
  58.                 doQuery('SELECT * FROM v$version', function(err, data){
  59.                     if(err) return cb(err);
  60.  
  61.                     var info = [];
  62.                     data.forEach(function(val){
  63.                         info.push(val.BANNER);
  64.                     });
  65.                     cb(err, info);
  66.                 });
  67.             };
  68.  
  69.         }else if(file.match('mysql-connector')){ //else MySQL db
  70.             connOpts.drivername = 'com.mysql.jdbc.Driver';
  71.  
  72.             if(useOverride)
  73.                 connOpts.url = db.override_url;
  74.             else
  75.                 connOpts.url = 'jdbc:mysql://' + db.hostname + ':' + db.port +'/' + db.sid_or_db_name + '?user=' + db.username + '&password=' + db.password;
  76.  
  77.  
  78.  
  79.             dbConn.getVersionInfo = function getVersionInfo(cb){
  80.                 doQuery('SHOW VARIABLES LIKE "%version%"', function(err, data){
  81.                     if(err) return cb(err);
  82.  
  83.                     var info = [];
  84.                     data.forEach(function(val){
  85.                         info.push(val.VARIABLE_NAME +' : ' + val.VARIABLE_VALUE);
  86.                     });
  87.                     cb(err, info);
  88.                 });
  89.             };
  90.  
  91.         }else if(file.match('db2jcc')){ //else DB2
  92.             connOpts.drivername = 'com.ibm.db2.jcc.DB2Driver';
  93.  
  94.  
  95.             if(useOverride)
  96.                 connOpts.url = db.override_url;
  97.             else
  98.                 connOpts.url = 'jdbc:db2://' + db.hostname + ':' + db.port + '/' + db.sid_or_db_name +
  99.                 ':user=' + db.username + ';password=' + db.password +';';
  100.  
  101.             if(db.default_schema)
  102.                 connOpts.url += 'currentSchema=' + db.default_schema + ';';
  103.             prefix = db.default_schema? db.default_schema + '.': '';
  104.  
  105.  
  106.             dbConn.getVersionInfo = function getVersionInfo(cb){
  107.                 doQuery('SELECT * FROM SYSIBMADM.ENV_INST_INFO', function(err, data){
  108.                     if(err) return cb(err);
  109.  
  110.                     var info = [];
  111.                     data = data[0];
  112.                     for(var key in data)
  113.                         info.push(key + ': ' + data[key]);
  114.                     cb(err, info);
  115.                 });
  116.                
  117.             };
  118.  
  119.         }else if(file.match('sqljdbc')){ //else SQL server db
  120.             connOpts.drivername = 'com.microsoft.sqlserver.jdbc.SQLServerDriver';
  121.  
  122.  
  123.             if(useOverride)
  124.                 connOpts.url = db.override_url;
  125.             else
  126.                 connOpts.url = 'jdbc:sqlserver://' + db.hostname + ':' + db.port + ';' +
  127.                 'databaseName=' + db.sid_or_db_name + ';user=' + db.username + ';password=' + db.password + ';';
  128.             prefix = db.default_schema? db.default_schema + '.': '';
  129.  
  130.  
  131.             dbConn.getVersionInfo = function getVersionInfo(cb){
  132.                 doQuery('SELECT @@VERSION', function(err, data){
  133.                     if(err) return cb(err);
  134.                     var info = [];
  135.                     data = data[0];
  136.                     for(var key in data)
  137.                         info.push(data[key]);
  138.                     cb(err, info);
  139.                 });
  140.             };
  141.  
  142.         }else{
  143.             console.log('ERROR: Unsupported JDBC driver: ' + connOpts.libpath + '\nExternal database access is impossible!');
  144.         }
  145.        
  146.         if (!jinst.isJvmCreated())
  147.         {
  148.             jinst.addOption("-Xrs");
  149.             jinst.setupClasspath([connOpts.libpath]);
  150.         }
  151.        
  152.         dbConn.JDBC = new JDBC({
  153.             url: connOpts.url,
  154.             minpoolsize : minPoolSize,
  155.             maxpoolsize: maxPoolSize,
  156.             drivername : connOpts.drivername,
  157.  
  158.             });
  159.        
  160.        
  161.         if(cb) cb();
  162.     }
  163.  
  164.     // prints error if theres an error
  165.     function errCatch(err, query){
  166.         if(err) console.log('\n' + query + '\n\n' + err);
  167.     }
  168.    
  169.    
  170.     /**
  171.     * Convenience 'from' sql query clause.
  172.     * MS sql server needs schema to prefix tables. This method
  173.     * will know and add the prefix when needed.
  174.     *
  175.     * from('yourtable', 'someothertable') //as many as you want
  176.     *
  177.     * @params variable length of table strings
  178.     * @return formatted FROM clause string
  179.     */
  180.     this.from = function from(){
  181.         var rtn = ' FROM ';
  182.         for(var i=0; i<arguments.length; i++)
  183.             rtn += prefix + arguments[i] + ' ';
  184.         return rtn.length > 6? rtn: '';
  185.     };
  186.    
  187.    
  188.    
  189.     this.doQuery = function(query, cb){
  190.  
  191.         this.connection(function(err, con){
  192.            
  193.             errCatch(err, query);
  194.  
  195.             executeQuery(con, query, function(err, data){
  196.            
  197.                 errCatch(err, query)
  198.                            
  199.                 data.toObject(function(err, result){
  200.                    
  201.                     errCatch(err, query);                  
  202.                     cb(null, result.rows);
  203.                 });
  204.  
  205.             });    
  206.         });
  207.     }
  208.    
  209.     this.doUpdate = function(query, cb){
  210.         this.connection(function(err, con){
  211.            
  212.             errCatch(err, query);
  213.            
  214.             executeUpdate(con, query, function(err, data){
  215.                
  216.                 errCatch(err, query);
  217.                 cb(err, data);
  218.             });    
  219.         });
  220.     }
  221.    
  222.                
  223.     this.tableexists = function(db, catalog, schema, name, callback) {
  224.     reserve(db, function(err, connobj, conn) {
  225.         conn.getMetaData(function(err, metadata) {
  226.         if (err) {
  227.             release(db, connobj, err, null, callback);
  228.         } else {
  229.             metadata.getTables(catalog, schema, name, null, function(err, resultset) {
  230.             if (err) {
  231.                 release(db, connobj, err, null, callback);
  232.             } else {
  233.                 resultset.toObjArray(function(err, results) {
  234.                     release(db, connobj, err, results.length > 0, callback);
  235.                 });
  236.             }
  237.             });
  238.         }
  239.         });
  240.     });
  241.     }
  242.    
  243.     this.executePreparedStatement = function(sql, generatedKeys, callback)
  244.     {  
  245.         var that = this;
  246.  
  247.         that.connection(function(err, con){
  248.            
  249.             if(err)
  250.                 logger.logError('THERE WAS AN ERROR CONNECTING TO DB: ' + err);
  251.            
  252.             that.prepare(con, sql, generatedKeys, callback) ;    
  253.            
  254.         });
  255.    
  256.     }
  257.    
  258.    
  259.     this.prepare = function(db, sql, generatedKeys, callback) {
  260.         reserve(db, function(err, connobj, conn)
  261.         {
  262.             if(!generatedKeys)
  263.             {
  264.                 conn.prepareStatement(sql, function(err, preparedstatement) {
  265.                     release(db, connobj, err, preparedstatement, callback);
  266.                 });
  267.             }
  268.             else
  269.             {
  270.                 conn.prepareStatement(sql, 1, function(err, preparedstatement) {
  271.                                        
  272.                 release(db, connobj, err, preparedstatement, callback);
  273.                
  274.                 });
  275.             }
  276.         });
  277.     };
  278.  
  279.     this.prepareCall = function(db, sql, callback) {
  280.         reserve(db, function(err, connobj, conn) {
  281.             conn.prepareCall(sql, function(err, callablestatement) {
  282.                 release(db, connobj, err, callablestatement, callback);
  283.             });
  284.         });
  285.     }
  286.    
  287.    
  288.  
  289.     this.metadata = function(db, callback) {
  290.     reserve(db, function(err, connobj, conn) {
  291.         conn.getMetaData(function(err, metadata) {
  292.         release(db, connobj, err, metadata, callback);
  293.         });
  294.     });
  295.     }
  296.    
  297.     this.connection = function (callback)
  298.     {
  299.         if (!dbConneInit) {
  300.             dbConn.JDBC.initialize(function(err) {
  301.             if (err) {
  302.                 return callback(err);
  303.             } else {
  304.                 dbConneInit = true;
  305.                 return callback(null, dbConn.JDBC);
  306.             }
  307.             });
  308.         } else {
  309.             return callback(null, dbConn.JDBC);
  310.         }
  311.     }
  312. }
  313.  
  314.  
  315. function reserve(db, callback)
  316. {
  317.   db.reserve(function(err, connobj)
  318.   {
  319.     //logger.logInfo('reserveing connection');
  320.     if (err) {
  321.       return callback(err + ' error accquiring connection');
  322.     } else
  323.     {
  324.       return callback(null, connobj, connobj.conn);
  325.     }
  326.   });
  327. }
  328.  
  329. function release(db, connobj, err, result, callback)
  330. {
  331.    
  332.   db.release(connobj, function(e)
  333.   {
  334.     //logger.logInfo('releasing connection');
  335.     if (err) {
  336.       return callback(err + ' error releaseing connection');
  337.     } else
  338.     {
  339.       return callback(null, result);
  340.     }
  341.   });
  342. }
  343.  
  344. var dbs = {};
  345. exports.dbs = dbs;
  346. /**
  347. * Loads the database configurations & makes new dbConnections.
  348. * Will not overwrite unless force is true.
  349. *
  350. * @param force boolean to tru if you want to force a load even if there's already databases.
  351. */
  352. function loadQaDatabase(force){
  353.     if(force){
  354.         for(var key in dbs)
  355.             delete dbs[key];
  356.     }
  357.     var db = require('../../../config.js').jdbc;
  358.  
  359.     //If database is set to not active, make sure it's not being used.
  360.     if(!db.platform.active) {
  361.         errors.missingFeature('Platform Database Is Not Active');
  362.     }
  363.     else if(db.qa.active)
  364.     {
  365.         if(!dbs.qa) dbs.qa = new dbConnection(db.qa, null, 200, 600);
  366.     }
  367. }
  368.  
  369. exports.load = loadQaDatabase;
  370.  
  371.  
  372. function executeQuery (db, sql, callback)
  373. {
  374.     reserve(db, function(err, connobj, conn) {
  375.         conn.createStatement(function(err, statement) {
  376.         if (err) {
  377.             release(db, connobj, err, null, callback);
  378.         } else {
  379.             statement.executeQuery(sql, function(err, result) {
  380.             release(db, connobj, err, result, callback);
  381.             });
  382.         }
  383.         });
  384.     });
  385. }
  386.  
  387. function executeUpdate(db, sql, callback) {
  388.         reserve(db, function(err, connobj, conn) {
  389.             conn.createStatement(function(err, statement) {
  390.             if (err) {
  391.                 release(db, connobj, err, null, callback);
  392.             } else {
  393.                 statement.executeUpdate(sql, function(err, result) {
  394.                 release(db, connobj, err, result, callback);
  395.                 });
  396.             }
  397.             });
  398.         });
  399.     };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement