UNPKG

node-jdbc-connection

Version:
156 lines (129 loc) 5.09 kB
"use strict"; var spawn = require('child_process').spawn; var JSONStream = require('JSONStream'); var fs = require("fs"); var path = require("path"); var lastDbId = 0; function NodeJdbcConnection(verboseLevel, pathToJavaBridge) { this.verboseLevel = verboseLevel; this.encoding = "utf8"; this.pathToJavaBridge = pathToJavaBridge; if (this.pathToJavaBridge === undefined) { this.pathToJavaBridge = path.resolve(__dirname, "..", "JdbcLink", "dist", "JdbcLink.jar"); } this.queryCount = 0; this.currentMessages = {}; // look up msgId to message sent and call back details. this.jsonParser = JSONStream.parse(); this.javaDB = spawn('java', ["-jar", this.pathToJavaBridge]); var that = this; // set up normal listeners. that.javaDB.stdout.setEncoding(that.encoding).pipe(that.jsonParser).on("data", function (jsonMsg) { that.onResponse.call(that, jsonMsg); }); that.javaDB.stderr.setEncoding(that.encoding).on("data", function (err) { that.onSQLError.call(that, err); }); } NodeJdbcConnection.prototype.connect = function (connectionString, username, password, timezone, callback) { var hrstart = process.hrtime(); var msg = {}; msg.type = "connect"; msg.msgId = ++this.queryCount; if (this.verboseLevel >= 2) { console.log("connect, connectionString: " + connectionString + ", queryCount: " + this.queryCount); } else if (this.verboseLevel >= 1) { console.log("connect, queryCount: " + this.queryCount); } msg.connectionString = connectionString; msg.username = username; msg.password = password; msg.timezone = timezone; msg.sentTime = (new Date()).getTime(); var strMsg = JSON.stringify(msg).replace(/[\n]/g, '\\n'); msg.callback = callback; msg.hrstart = hrstart; this.currentMessages[msg.msgId] = msg; if (this.verboseLevel >= 2) { console.log("strMsg: " + strMsg); } this.javaDB.stdin.write(strMsg + "\n"); }; NodeJdbcConnection.prototype.close = function (dbId, callback) { var hrstart = process.hrtime(); var msg = {}; msg.type = "close"; msg.msgId = ++this.queryCount; if (this.verboseLevel >= 1) { console.log("close, dbId: " + dbId + " queryCount: " + this.queryCount); } msg.dbId = dbId; msg.sentTime = (new Date()).getTime(); var strMsg = JSON.stringify(msg).replace(/[\n]/g, '\\n'); msg.callback = callback; msg.hrstart = hrstart; this.currentMessages[msg.msgId] = msg; if (this.verboseLevel >= 2) { console.log("strMsg: " + strMsg); } this.javaDB.stdin.write(strMsg + "\n"); } NodeJdbcConnection.prototype.query = function (dbId, sql, callback) { var hrstart = process.hrtime(); var msg = {}; msg.type = "query"; msg.msgId = ++this.queryCount; if (this.verboseLevel >= 2) { console.log("query, dbId: " + dbId + ", sql: " + sql + ", queryCount: " + this.queryCount); } else if (this.verboseLevel >= 1) { console.log("query, dbId: " + dbId + ", queryCount: " + this.queryCount); } msg.dbId = dbId; msg.sql = sql; msg.sentTime = (new Date()).getTime(); var strMsg = JSON.stringify(msg).replace(/[\n]/g, '\\n'); msg.callback = callback; msg.hrstart = hrstart; this.currentMessages[msg.msgId] = msg; if (this.verboseLevel >= 2) { console.log("strMsg: " + strMsg); } this.javaDB.stdin.write(strMsg + "\n"); }; NodeJdbcConnection.prototype.getLastDbId = function () { return this.lastDbId; } NodeJdbcConnection.prototype.kill = function () { if (this.javaDB.kill) { this.javaDB.kill(); } } NodeJdbcConnection.prototype.onResponse = function (jsonMsg) { var err = jsonMsg.error; var request = this.currentMessages[jsonMsg.msgId]; delete this.currentMessages[jsonMsg.msgId]; if ((!request) || (!request.hrstart)) { console.log("Wrong format: ", request, jsonMsg); } var result = jsonMsg.result; var currentTime = (new Date()).getTime(); var sendTimeMS = currentTime - jsonMsg.javaEndTime; var hrend = process.hrtime(request.hrstart); var javaDuration = (jsonMsg.javaEndTime - jsonMsg.javaStartTime); if (this.verboseLevel >= 2) { console.log("Execution time (hr): %ds %dms dbTime: %dms dbSendTime: %d sql=%s", hrend[0], hrend[1] / 1000000, javaDuration, sendTimeMS, request.sql); } this.lastDbId = jsonMsg.dbId; request.callback(jsonMsg.dbId, err, result); }; NodeJdbcConnection.prototype.onSQLError = function (data) { console.log(data); // var error = new Error(data); // var callBackFunctions = []; // for (var k in this.currentMessages) { // if (this.currentMessages.hasOwnProperty(k)) { // callBackFunctions.push(this.currentMessages[k].callback); // } // } // // clear the current messages before calling back with the error. // this.currentMessages = []; // callBackFunctions.forEach(function (cb) { // cb(error); // }); }; module.exports = NodeJdbcConnection;