@@ -67,6 +67,8 @@ module.exports = function(RED) {
67
67
var db = require ( 'ibm_db' ) ( ) ;
68
68
this . table = n . table ;
69
69
var dashDBconfig = _getdashDBconfig ( n ) ;
70
+ var columnList = null ;
71
+ var insertStatement = null ;
70
72
71
73
if ( ! this . table ) {
72
74
this . error ( "dashDB node configuration error: table not defined" ) ;
@@ -81,7 +83,7 @@ module.exports = function(RED) {
81
83
var node = this ;
82
84
83
85
if ( dashDBconfig . ssldsn != null ) {
84
- var connString = dashDBconfig . ssldsn ;
86
+ var connString = dashDBconfig . ssldsn ;
85
87
}
86
88
else {
87
89
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) {
90
92
}
91
93
}
92
94
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
-
112
95
node . on ( "close" , function ( ) {
113
96
console . log ( "dashDB: Closing db connection..." ) ;
114
97
db . closeSync ( ) ;
115
98
console . log ( "dashDB output node: Connection closed" ) ;
116
99
} ) ;
117
100
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
+ }
119
117
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
+ }
122
130
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
+ } ) ;
134
142
}
135
143
136
144
RED . nodes . registerType ( "dashDB out" , dashDBOutNode ) ;
@@ -161,8 +169,6 @@ function getColumns (node,db,table,service) {
161
169
}
162
170
163
171
function processInput ( node , msg , db , stmt , columnList , service ) {
164
- console . log ( service + ": Input event received" ) ;
165
- console . log ( service + ": columnList: " + columnList ) ;
166
172
var valueToInsert ;
167
173
var batchInsert ;
168
174
var valueList ;
@@ -200,6 +206,10 @@ function processInput (node,msg,db,stmt,columnList,service) {
200
206
stmt . execute ( valueList , function ( err , result ) {
201
207
if ( err ) {
202
208
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
+ }
203
213
} else {
204
214
console . log ( service + ": Insert successful!" ) ;
205
215
result . closeSync ( ) ;
@@ -272,19 +282,6 @@ function genDB2Timestamp() {
272
282
( "00" + d . getSeconds ( ) ) . slice ( - 2 ) ;
273
283
}
274
284
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
-
288
285
function dashDBQueryNode ( n ) {
289
286
290
287
RED . nodes . createNode ( this , n ) ;
@@ -312,64 +309,71 @@ function dashDBQueryNode(n) {
312
309
}
313
310
}
314
311
315
- jail = connectToDB ( node , db , connString ) ;
316
-
317
312
node . on ( "close" , function ( ) {
318
- console . log ( "dashDB query node: Closing db connection..." ) ;
313
+ console . log ( "DB2 query node: Closing db connection..." ) ;
319
314
db . closeSync ( ) ;
320
- console . log ( "dashDB query node: Connection closed" ) ;
315
+ console . log ( "DB2 query node: Connection closed" ) ;
321
316
} ) ;
322
317
323
318
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 ;
327
332
}
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 ;
333
340
}
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 ] ; }
362
341
else {
363
- queryresult = [ ] ;
364
- for ( var i = 0 ; i < rows . length ; i ++ ) {
365
- queryresult . push ( rows [ i ] ) ;
366
- }
342
+ queryToUse = query ;
367
343
}
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 ) ;
368
350
}
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
+ }
373
377
} ) ;
374
378
}
375
379
RED . nodes . registerType ( "dashDB in" , dashDBQueryNode ) ;
0 commit comments