Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 206 additions & 0 deletions lib/Deprecated.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ const iWorkDeprecate = deprecate('iWork');
const iCmdDeprecate = deprecate('iCmd');
const iQshDeprecate = deprecate('iQsh');
const iShDeprecate = deprecate('iSh');
const xmlToJsonDeprecate = deprecate('xmlToJson');

const { ProgramCall } = require('./ProgramCall');
const { CommandCall } = require('./CommandCall');
Expand Down Expand Up @@ -625,6 +626,210 @@ const iSh = (sh, options) => {
return command.toXML();
};

const xmlToJson = (xml) => {
xmlToJsonDeprecate('As of v1.0, \'xmlToJson\' is deprecated. Use xml2js npm package instead.');

const cmdRegG = /<cmd.*?>[\s\S]+?<\/cmd>/g;
const shRegG = /<sh.*?>[\s\S]+?<\/sh>/g;
const qshRegG = /<qsh.*?>[\s\S]+?<\/qsh>/g;
const pgmRegG = /<pgm.*?>[\s\S]+?<\/pgm>/g;
const sqlRegG = /<sql.*?>[\s\S]+?<\/sql>/g;

const shReg = /<sh.*?>([\s\S]+?)<\/sh>/;
const qshReg = /<qsh.*?>([\s\S]+?)<\/qsh>/;
const pgmReg = /<pgm name='(.*?)' lib='(.*?)'.*?>/;

const successReg = /<success>.*?\+\+\+ success (.*?)<\/success>/;
const errorReg = /<error>.*?\*\*\* error (.*?)<\/error>.*?<error>(.*?)<\/error>/;
const rtDataRegG = /<data desc='.*?'>[\s\S]*?<\/data>/g;
const rtDataReg = /<data desc='(.*?)'>([\s\S]*?)<\/data>/;

// const dsRegG = /<ds.*?>[\s\S]+?<\/ds>/g; // TODO: Not used
// const dsReg = /<ds.*?>([\s\S]+?)<\/ds>/; // TODO: Not used
const dataRegG = /<data[\s\S]*?<\/data>/g;
const dataReg = /<data.*?type='(.*?)'.*?>([\s\S]*?)<\/data>/;
const sqlResultG = /<row>[\s\S]+?<\/row>/g;
const sqlRowG = /<data desc='[\s\S]+?'>[\s\S]*?<\/data>/g;
const sqlRow = /<data desc='([\s\S]+?)'>([\s\S]*?)<\/data>/;

const cmdData = xml.match(cmdRegG);
const shData = xml.match(shRegG);
const qshData = xml.match(qshRegG);
const pgmData = xml.match(pgmRegG);
const sqlData = xml.match(sqlRegG);

const ResultArr = [];

// parse cmd matches
if (cmdData && cmdData.length > 0) {
cmdData.forEach((cmd) => {
const rs = { type: 'cmd' };
const sucFlag = cmd.match(successReg);

if (sucFlag && sucFlag.length > 0) {
rs.success = true;
if (sucFlag.length > 1) {
[, rs.cmd] = sucFlag;
}
} else {
rs.success = false;
const errFlag = cmd.match(errorReg);
if (errFlag && errFlag.length > 1) {
[, rs.cmd] = errFlag;
}
if (errFlag && errFlag.length > 2) {
[, , rs.error] = errFlag;
}
}
const rowArray = cmd.match(rtDataRegG);

if (rowArray && rowArray.length > 0) {
const arr = [];

rowArray.forEach((row) => {
const eachRow = row.match(rtDataReg);
if (eachRow && eachRow.length > 1) {
arr.push({ name: eachRow[1], value: eachRow[2] ? eachRow[2] : '' });
}
});

rs.data = arr;
}
ResultArr.push(rs);
});
}

// parse sh matches
if (shData && shData.length > 0) {
shData.forEach((sh) => {
const rs = { type: 'sh' };
const shOutput = sh.match(shReg);

if (shOutput && shOutput.length > 0) {
[, rs.data] = shOutput;
}
ResultArr.push(rs);
});
}

// parse qsh matches
if (qshData && qshData.length > 0) {
qshData.forEach((qsh) => {
const rs = { type: 'qsh' };
const qshOutput = qsh.match(qshReg);
if (qshOutput && qshOutput.length > 0) {
[, rs.data] = qshOutput;
}
ResultArr.push(rs);
});
}

// parse pgm matches
if (pgmData && pgmData.length > 0) {
pgmData.forEach((pgm) => {
const rs = { type: 'pgm' };
const sucFlag = pgm.match(successReg);

if (sucFlag && sucFlag.length > 0) {
rs.success = true;
} else {
rs.success = false;
}

const pgmLib = pgm.match(pgmReg);

if (pgmLib && pgmLib.length > 2) {
[, rs.pgm, rs.lib] = pgmLib;
}

const paramData = pgm.match(dataRegG);

if (paramData && paramData.length > 0) {
const arr = [];
paramData.forEach((param) => {
const obj = {};
const rx = / \b(.*?)\s*=\s*'([^']*)'/g;
const eachRow = param.match(dataReg);
let attr;

if (eachRow && eachRow.length > 1) {
obj.value = (eachRow[2] ? eachRow[2] : '');
}

// eslint-disable-next-line no-cond-assign
while (attr = rx.exec(param)) {
// eslint-disable-next-line prefer-destructuring
obj[attr[1]] = attr[2];
}

arr.push(obj);
});

rs.data = arr;
}
ResultArr.push(rs);
});
}

// parse sql matches
if (sqlData && sqlData.length > 0) {
sqlData.forEach((sql) => {
const rs = { type: 'sql' };
const sucFlag = sql.match(successReg);

if (sucFlag && sucFlag.length > 0) {
rs.success = true;
if (sucFlag.length > 1) {
if (sucFlag[0].includes('![CDATA')) {
const fixed = sucFlag[1].replace(/]]>/, '');
rs.stmt = fixed;
} else {
[, rs.stmt] = sucFlag;
}
}
} else {
rs.success = false;
const errFlag = sql.match(errorReg);

if (errFlag && errFlag.length > 1) {
[, rs.stmt] = errFlag;
}
if (errFlag && errFlag.length > 2) {
[, , rs.error] = errFlag;
}
}

const sqlResult = sql.match(sqlResultG);

if (sqlResult && sqlResult.length > 0) {
const arr = [];

sqlResult.forEach((result) => {
const eachRow = result.match(sqlRowG);

if (eachRow) {
const theRow = [];

eachRow.forEach((row) => {
const perField = row.match(sqlRow);

if (perField && perField.length > 2) {
theRow.push({ desc: perField[1], value: perField[2] });
}
});

arr.push(theRow);
}
});

rs.result = arr;
}
ResultArr.push(rs);
});
}
return ResultArr;
};

module.exports.iPgm = iPgm;
module.exports.iSql = iSql;
module.exports.iConn = iConn;
Expand All @@ -637,3 +842,4 @@ module.exports.iWork = iWork;
module.exports.iCmd = iCmd;
module.exports.iQsh = iQsh;
module.exports.iSh = iSh;
module.exports.xmlToJson = xmlToJson;
1 change: 0 additions & 1 deletion lib/Toolkit.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

const { parseString } = require('xml2js');
const { ProgramCall } = require('./ProgramCall');
const { xmlToJson } = require('./utils');
const { Connection } = require('./Connection');

const sysvalArray = [
Expand Down
2 changes: 1 addition & 1 deletion lib/itoolkit.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ const { ProgramCall } = require('./ProgramCall');
const { CommandCall } = require('./CommandCall');
const { Connection } = require('./Connection');
const { Toolkit } = require('./Toolkit');
const { xmlToJson } = require('./utils');

const {
iPgm,
Expand All @@ -38,6 +37,7 @@ const {
iCmd,
iQsh,
iSh,
xmlToJson,
} = require('./Deprecated');

module.exports = {
Expand Down
Loading