Skip to content

Commit 69b6245

Browse files
committed
Add indbstream option to enable record-by-record data processing
1 parent a6b8980 commit 69b6245

File tree

5 files changed

+61
-6
lines changed

5 files changed

+61
-6
lines changed

data/completion.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ complete:
3232
desc: The JDBC access timeout
3333
- name: indblib=
3434
desc: Use a JDBC driver oPack generated by ojob.io/db/getDriver
35+
- name: indbstream=
36+
desc: If true will stream the data instead of loading it all in memory
3537
- name: indbexec=
3638
desc: If true the input SQL is not a query but a DML statement
3739
- name: in=gb64json

data/usage.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,11 @@
694694
"Type": "String",
695695
"Description": "Use a JDBC driver oPack generated by ojob.io/db/getDriver"
696696
},
697+
{
698+
"Option": "indbstream",
699+
"Type": "Boolean",
700+
"Description": "If true the output will be processed record by record"
701+
},
697702
{
698703
"Option": "indbexec",
699704
"Type": "Boolean",

src/docs/USAGE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ List of options to use when _in=db_ (SQL query):
240240
| indbpass | String | The JDBC access password |
241241
| indbtimeout | String | The JDBC access timeout |
242242
| indblib | String | Use a JDBC driver oPack generated by ojob.io/db/getDriver |
243+
| indbstream | Boolean | If true the output will be processed record by record |
243244
| indbexec | Boolean | If true the input SQL is not a query but a DML statement |
244245

245246
> JDBC oracle: jdbc:oracle:thin:@[host]:[port]:[database]

src/include/inputFns.js

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -411,11 +411,58 @@ var _inputFns = new Map([
411411
_$o({ affectedRows: _r }, options)
412412
_db.commit()
413413
} else {
414-
var _r = _db.q(r)
415-
if (isMap(_r) && isArray(_r.results)) {
416-
_$o(_r.results, options)
417-
} else {
418-
_exit(-1, "Invalid DB result: " + stringify(_r))
414+
if (toBoolean(params.indbstream)) {
415+
var _rs = _db.qsRS(r)
416+
try {
417+
while(_rs.next()) {
418+
var _r = {}
419+
for (var i = 1; i <= _rs.getMetaData().getColumnCount(); i++) {
420+
var _v = _rs.getObject(i)
421+
switch(_rs.getMetaData().getColumnType(i)) {
422+
case java.sql.Types.BIGINT:
423+
case java.sql.Types.INTEGER:
424+
case java.sql.Types.TINYINT:
425+
case java.sql.Types.SMALLINT:
426+
case java.sql.Types.NUMERIC:
427+
_v = Number(_v)
428+
break
429+
case java.sql.Types.DOUBLE:
430+
case java.sql.Types.FLOAT:
431+
case java.sql.Types.REAL:
432+
case java.sql.Types.DECIMAL:
433+
_v = Number(_v)
434+
break
435+
case java.sql.Types.BOOLEAN:
436+
_v = Boolean(_v)
437+
break
438+
case java.sql.Types.TIME:
439+
case java.sql.Types.DATE:
440+
case java.sql.Types.TIMESTAMP:
441+
_v = new Date(_v.getTime())
442+
break
443+
case java.sql.Types.NULL:
444+
_v = null
445+
break
446+
default:
447+
_v = String(_v)
448+
}
449+
_r[_rs.getMetaData().getColumnName(i)] = _v
450+
}
451+
_$o(_r, options)
452+
}
453+
} catch(e) {
454+
_exit(-1, "Error streaming SQL: " + e.message)
455+
} finally {
456+
_db.closeStatement(r)
457+
_rs.close()
458+
}
459+
} else {
460+
var _r = _db.q(r)
461+
if (isMap(_r) && isArray(_r.results)) {
462+
_$o(_r.results, options)
463+
} else {
464+
_exit(-1, "Invalid DB result: " + stringify(_r))
465+
}
419466
}
420467
}
421468
} catch(edb) {

src/include/transformFns.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ var _transformFns = {
562562
let _lst = params.field2date.split(",").map(r => r.trim())
563563
traverse(_r, (aK, aV, aP, aO) => {
564564
if (_lst.indexOf(aP.length > 0 && !aP.startsWith("[") ? aP.substring(1) + "." + aK : aK) >= 0 && isNumber(aV) && aV > 0) {
565-
try { aO[aK] = ow.format.fromISODate(aV) } catch(e) {}
565+
try { aO[aK] = isString(aV) ? ow.format.fromISODate(aV) : new Date(aV) } catch(e) { printErr(e) }
566566
}
567567
})
568568
return _r

0 commit comments

Comments
 (0)