Skip to content

Commit f89b399

Browse files
committed
Support for retry logic incase connection gets dropped (both nodes)
1 parent 35e60b9 commit f89b399

File tree

2 files changed

+102
-98
lines changed

2 files changed

+102
-98
lines changed

98-sqldb-dashdb-cf.js

Lines changed: 101 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ module.exports = function(RED) {
6767
var db = require('ibm_db')();
6868
this.table = n.table;
6969
var dashDBconfig = _getdashDBconfig(n);
70+
var columnList = null;
71+
var insertStatement = null;
7072

7173
if (!this.table) {
7274
this.error("dashDB node configuration error: table not defined");
@@ -81,7 +83,7 @@ module.exports = function(RED) {
8183
var node = this;
8284

8385
if (dashDBconfig.ssldsn != null) {
84-
var connString = dashDBconfig.ssldsn;
86+
var connString = dashDBconfig.ssldsn;
8587
}
8688
else {
8789
var connString = "DATABASE="+dashDBconfig.db+";HOSTNAME="+dashDBconfig.hostname+";PORT="+dashDBconfig.port+";PROTOCOL=TCPIP;UID="+dashDBconfig.username+";PWD="+dashDBconfig.password;
@@ -90,47 +92,53 @@ module.exports = function(RED) {
9092
}
9193
}
9294

93-
try {
94-
console.log("dashDB output node: Opening db connection...");
95-
db.openSync(connString);
96-
console.log("dashDB output node: Connection open");
97-
}
98-
catch (e) {
99-
node.error(e.message);
100-
}
101-
102-
var columnList = getColumns(node,db,node.table,"dashDB output node");
103-
104-
var columnListWithQuotes = "";
105-
for (var i = 0; i < columnList.length; i++) {
106-
if (i != 0) columnListWithQuotes += ',';
107-
columnListWithQuotes += "\"" + columnList[i] + "\"";
108-
109-
}
110-
console.log("dashDB output node: columnList: " + columnListWithQuotes);
111-
11295
node.on("close", function() {
11396
console.log("dashDB: Closing db connection...");
11497
db.closeSync();
11598
console.log("dashDB output node: Connection closed");
11699
});
117100

118-
var questionMarks = genQuestionMarks(columnList);
101+
node.on("input", function(msg) {
102+
103+
if (!db.connected) {
104+
console.log("DB2 output node: Database not connected; connecting first...");
105+
db.open(connString,doTheRest);
106+
}
107+
else {
108+
//console.log("We are connected because the value for db.connected is: " + db.connected);
109+
doTheRest(null,db);
110+
}
111+
112+
function doTheRest (err,conn) {
113+
if (err) {
114+
node.error("DB2 output node, error connecting: " + err);
115+
return;
116+
}
119117

120-
var insertStatement = "insert into \""+node.table+"\" (" + columnListWithQuotes + ") values("+questionMarks+")";
121-
console.log("dashDB output node: Preparing insert statement: " + insertStatement);
118+
if (columnList == null) {
119+
columnList = getColumns(node,db,node.table,"dashDB output node");
120+
var columnListWithQuotes = "";
121+
for (var i = 0; i < columnList.length; i++) {
122+
if (i != 0) columnListWithQuotes += ',';
123+
columnListWithQuotes += "\"" + columnList[i] + "\"";
124+
}
125+
console.log("dashDB output node: columnList: " + columnListWithQuotes);
126+
var questionMarks = genQuestionMarks(columnList);
127+
insertStatement = "insert into \""+node.table+"\" (" + columnListWithQuotes + ") values("+questionMarks+")";
128+
console.log("dashDB output node: Preparing insert statement: " + insertStatement);
129+
}
122130

123-
node.on("input", function(msg) {
124-
db.prepare(insertStatement, function (err, stmt) {
125-
if (err) {
126-
node.error("dashDB output node: " + err);
127-
}
128-
else {
129-
console.log("dashDB output node: Prepare successful");
130-
processInput(node,msg,db,stmt,columnList,"dashDB");
131-
}
132-
});
133-
});
131+
db.prepare(insertStatement, function (err, stmt) {
132+
if (err) {
133+
node.error("dashDB output node: " + err);
134+
}
135+
else {
136+
console.log("dashDB output node: Prepare successful");
137+
processInput(node,msg,db,stmt,columnList,"dashDB");
138+
}
139+
});
140+
}
141+
});
134142
}
135143

136144
RED.nodes.registerType("dashDB out", dashDBOutNode);
@@ -161,8 +169,6 @@ function getColumns (node,db,table,service) {
161169
}
162170

163171
function processInput (node,msg,db,stmt,columnList,service) {
164-
console.log(service+": Input event received");
165-
console.log(service+": columnList: "+columnList);
166172
var valueToInsert;
167173
var batchInsert;
168174
var valueList;
@@ -200,6 +206,10 @@ function processInput (node,msg,db,stmt,columnList,service) {
200206
stmt.execute(valueList, function (err, result) {
201207
if (err) {
202208
node.error(service+": Insert failed: "+err);
209+
if(err.message.indexOf('30081') > -1) {
210+
console.log("30081 connection error detected; will flag the connection to reconnect on next try");
211+
db.connected = false;
212+
}
203213
} else {
204214
console.log(service+": Insert successful!");
205215
result.closeSync();
@@ -272,19 +282,6 @@ function genDB2Timestamp() {
272282
("00" + d.getSeconds()).slice(-2);
273283
}
274284

275-
function connectToDB(node,db,connString) {
276-
try {
277-
console.log("dashDB query node: Opening db connection...");
278-
db.openSync(connString);
279-
console.log("dashDB query node: Connection open");
280-
return false;
281-
}
282-
catch (e) {
283-
node.error(e.message);
284-
return true;
285-
}
286-
}
287-
288285
function dashDBQueryNode(n) {
289286

290287
RED.nodes.createNode(this,n);
@@ -312,64 +309,71 @@ function dashDBQueryNode(n) {
312309
}
313310
}
314311

315-
jail = connectToDB(node,db,connString);
316-
317312
node.on("close", function() {
318-
console.log("dashDB query node: Closing db connection...");
313+
console.log("DB2 query node: Closing db connection...");
319314
db.closeSync();
320-
console.log("dashDB query node: Connection closed");
315+
console.log("DB2 query node: Connection closed");
321316
});
322317

323318
this.on('input', function(msg) {
324-
if (jail == true) {
325-
console.log("dashDB Query Node: Because previous connection was dropped, attempting reconnect...");
326-
jail = connectToDB(node,db,connString);
319+
if (!db.connected) {
320+
console.log("DB2 query node: Database not connected; connecting first...");
321+
db.open(connString,doTheRest);
322+
}
323+
else {
324+
//console.log("We are connected because the value for db.connected is: " + db.connected);
325+
doTheRest(null,db);
326+
}
327+
328+
function doTheRest (err,conn) {
329+
if (err) {
330+
node.error("DB2 query node, error connecting: " + err);
331+
return;
327332
}
328-
if (jail == false) {
329-
if (query == "" || query == null) {
330-
if (msg.payload == "" || msg.payload == null) {
331-
node.error("dashDB query node: msg.payload is empty!");
332-
return;
333+
else {
334+
if (query == "" || query == null) {
335+
if (msg.payload == "" || msg.payload == null) {
336+
node.error("DB2 query node: msg.payload is empty!");
337+
return;
338+
}
339+
queryToUse = msg.payload;
333340
}
334-
queryToUse = msg.payload;
335-
}
336-
else {
337-
queryToUse = query;
338-
}
339-
var parameterValues=[];
340-
if (params != "" && params != null) {
341-
var path = pathToArray(params.toString());
342-
console.log("Input node: pathToArray: " + path);
343-
parameterValues = extractValues(msg, path);
344-
console.log("Input node: parameterValues: " + parameterValues);
345-
}
346-
db.query(queryToUse,parameterValues,function (err, rows, moreResultSets) {
347-
queryresult = null;
348-
if (err) {
349-
node.error("dashDB query node: " + err);
350-
//debug: to print out the err message
351-
//console.log(util.inspect(err, {showHidden: false, depth: null}))
352-
if(err.message.indexOf('30081') > -1) {
353-
console.log("30081 connection error detected; entering jail mode...");
354-
jail = true;
355-
}
356-
msg.error = err;
357-
} else {
358-
msg.error = null;
359-
console.log("Fetching rows: " + rows);
360-
console.log("value 1: " + JSON.stringify(rows[0]));
361-
if (rows.length == 1) {queryresult = rows[0];}
362341
else {
363-
queryresult = [];
364-
for (var i = 0; i < rows.length; i++) {
365-
queryresult.push(rows[i]);
366-
}
342+
queryToUse = query;
367343
}
344+
var parameterValues=[];
345+
if (params != "" && params != null) {
346+
var path = pathToArray(params.toString());
347+
console.log("Input node: pathToArray: " + path);
348+
parameterValues = extractValues(msg, path);
349+
console.log("Input node: parameterValues: " + parameterValues);
368350
}
369-
msg.payload = queryresult;
370-
node.send(msg);
371-
});
372-
}
351+
db.query(queryToUse,parameterValues,function (err, rows, moreResultSets) {
352+
queryresult = null;
353+
if (err) {
354+
node.error("DB2 query node, error in query: " + err);
355+
msg.error = err;
356+
if(err.message.indexOf('30081') > -1) {
357+
console.log("30081 connection error detected; will flag the connection to reconnect on next try");
358+
db.connected = false;
359+
}
360+
} else {
361+
msg.error = null;
362+
console.log("Fetching rows: " + rows);
363+
console.log("value 1: " + JSON.stringify(rows[0]));
364+
if (rows.length == 1) {queryresult = rows[0];}
365+
else {
366+
queryresult = [];
367+
for (var i = 0; i < rows.length; i++) {
368+
queryresult.push(rows[i]);
369+
}
370+
}
371+
}
372+
msg.payload = queryresult;
373+
node.send(msg);
374+
});
375+
}
376+
}
373377
});
374378
}
375379
RED.nodes.registerType("dashDB in",dashDBQueryNode);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name" : "node-red-nodes-cf-sqldb-dashdb",
3-
"version" : "0.2.27",
3+
"version" : "0.2.28",
44
"description" : "Node-RED nodes to access SQLDB and dashDB services on Bluemix",
55
"dependencies" : {
66
"cfenv": "x",

0 commit comments

Comments
 (0)