@sap/hdbext
Version:
Hana-client extension library and utility functions for using SAP HANA in node.js
97 lines (73 loc) • 2.47 kB
JavaScript
;
var debug = require('debug')('hdbext:sp');
var isInput = require('./utils').isInput;
var isInputTable = require('./utils').isInputTable;
module.exports = function wrapProcedureParams(metadata, arrArgs) {
debug('Input length: %s', arrArgs.length);
if (usingNamedParams(arrArgs)) {
debug('Creating named parameters');
return new NamedParams(arrArgs[0]);
}
if (usingArrayWithParams(metadata, arrArgs)) {
debug('Creating positioned parameters from an array with input arguments');
return new PositionedParams(metadata, arrArgs[0]);
}
debug('Creating positioned parameters from comma-separated input arguments');
return new PositionedParams(metadata, arrArgs);
};
function usingNamedParams(arrArgs) {
if (arrArgs.length !== 1) {
return false;
}
var arg = arrArgs[0];
return typeof arg === 'object' && arg !== null &&
!Array.isArray(arg) && !Buffer.isBuffer(arg) && !Object.prototype.hasOwnProperty.call(arg, 'table');
}
function usingArrayWithParams(metadata, arrArgs) {
if (arrArgs.length !== 1 || !Array.isArray(arrArgs[0])) {
return false;
}
var inputParams = metadata.filter(isInput);
if (inputParams.length === 1 && isInputTable(inputParams[0])) {
debug('Procedure has only one input parameter which is an input table parameter');
return false;
}
return true;
}
function NamedParams(nameToValue) {
this._params = nameToValue;
}
NamedParams.prototype.getAll = function () {
return this._params;
};
NamedParams.prototype.has = function (name) {
return name in this._params;
};
NamedParams.prototype.get = function (name) {
return this._params[name];
};
NamedParams.prototype.empty = function () {
return Object.keys(this._params).length === 0;
};
function PositionedParams(metadata, arr) {
this._params = arr;
this._nameToPosition = {};
var paramPosition = 0;
metadata.filter(isInput).forEach(function (paramMeta) {
this._nameToPosition[paramMeta.PARAMETER_NAME] = paramPosition++;
}, this);
}
PositionedParams.prototype.getAll = function () {
return this._params;
};
PositionedParams.prototype.has = function (name) {
var paramPosition = this._nameToPosition[name];
return this._params.length > paramPosition;
};
PositionedParams.prototype.get = function (name) {
var position = this._nameToPosition[name];
return this._params[position];
};
PositionedParams.prototype.empty = function () {
return this._params.length === 0;
};