@sap/xsodata
Version:
Expose data from a HANA database as OData V2 service with help of .xsodata files.
332 lines (301 loc) • 11.2 kB
JavaScript
;
const uriToDb = (exports.uriToDb = {});
const XsODataTypeError = require('./../errors/typeError');
const converterTool = require('./converterTools');
function padZero(string, len) {
if (string.length < len) {
return new Array(len - string.length + 1).join('0') + string;
}
return string;
}
uriToDb['Edm.DateTime'] = function uriToDbEdmDateTime(value, dbDataType) {
//SQL format YYYY-MM-DD HH24:MI:SS.FF7
//if (dbDataType === 'DATE') {
// /* in "datetime'1753-01-01T00:00:00.0000000'" */
// /* out "1753-01-01" */
// /* in "datetime'9999-12-31T00:00:00.0000000'" */
// /* out "9999-12-31" */
//} else if (dbDataType === 'SECONDDATE') {
// /* in "datetime'1753-01-01T00:00:00.0000000'"*/
// /* out "1753-01-01T00:00:00" */
// /* in "datetime'9999-12-31T13:34:56.0000000'" */
// /* out "9999-12-31T13:34:56" */
//} else if (dbDataType === 'TIMESTAMP') {
// /* in "datetime'1753-01-01T00:00:00.0000000'" */
// /* out "1753-01-01T00:00:00" */
// /* in "datetime'9999-12-31T23:59:59.9990000'" */
// /* out "9999-12-31T23:59:59.999" */
//}
//else if (dbDataType === 'LONGDATE') {
/// throw new XsODataTypeError('db type LONGDATE is not supported');
//} else {
// throw new XsODataTypeError('db type must be DATE, SECONDDATE or TIMESTAMP');
//}
const raw = value.substring(9, value.length - 1);
const datetime = raw.split('T');
const dateParts = datetime[0].split('-');
dateParts[0] = padZero(dateParts[0], 4);
dateParts[1] = padZero(dateParts[1], 2);
dateParts[2] = padZero(dateParts[2], 2);
const timeParts = datetime[1].split(':');
timeParts[0] = timeParts[0] ? padZero(timeParts[0], 2) : '00';
timeParts[1] = timeParts[1] ? padZero(timeParts[1], 2) : '00';
if (timeParts.length > 2) {
const x = timeParts[2].split('.');
timeParts[2] = padZero(x[0], 2);
if (x[1]) {
if (x[1].length > 7) {
throw new XsODataTypeError(
'To many fractional seconds in ' + value
);
} else {
timeParts[3] = x[1];
}
}
} else {
timeParts[2] = '00';
}
if (dbDataType === 'DATE' || dbDataType === 'DAYDATE') {
return dateParts.join('-');
} else if (dbDataType === 'SECONDDATE') {
return (
dateParts.join('-') +
' ' +
timeParts[0] +
':' +
timeParts[1] +
':' +
timeParts[2]
);
} else if (dbDataType === 'TIMESTAMP') {
return (
dateParts.join('-') +
' ' +
timeParts[0] +
':' +
timeParts[1] +
':' +
timeParts[2] +
(timeParts[3] ? '.' + timeParts[3] : '')
);
}
throw new XsODataTypeError('db type must be DATE, SECONDDATE or TIMESTAMP');
};
uriToDb['Edm.Time'] = function uriToDbEdmTime(
value,
dbDataType,
yMDmustZero = true
) {
/* in "time'PT0H0M0S'" */
/* out "00:00:00" */
/* in "time'PT23H59M59S'" */
/* out "23:59:59" */
/*--->'Edm.Time' */
if (dbDataType !== 'TIME' && dbDataType !== 'SECONDTIME') {
throw new XsODataTypeError('db type must be TIME');
}
return converterTool.checkEdmTime(
value,
dbDataType,
true,
dbDataType === 'TIME' && yMDmustZero, // YMDmustZero
false, // allow fractions
dbDataType === 'SECONDTIME'
); // get time only
};
uriToDb['Edm.Byte'] = function uriToDbEdmByte(value, dbDataType) {
if (dbDataType !== 'TINYINT') {
throw new XsODataTypeError('db type must be TINYINT');
}
/* in "0" */
/* out 0 */
/* in "255" */
/* out 255 */
return parseInt(value);
};
uriToDb['Edm.Int16'] = function uriToDbEdmInt16(value, dbDataType) {
if (dbDataType !== 'SMALLINT') {
throw new XsODataTypeError('db type must be SMALLINT');
}
/* in "-32767" */
/* out -32767 */
/* in "32767" */
/* out 32767 */
return parseInt(value);
};
uriToDb['Edm.Int32'] = function uriToDbEdmInt32(value, dbDataType) {
if (dbDataType !== 'INTEGER') {
throw new XsODataTypeError('db type must be INTEGER');
}
/* in "-2147483648" */
/* out -2147483648 */
/* in "2147483647" */
/* out 2147483647 */
return parseInt(value);
};
uriToDb['Edm.Int64'] = function uriToDbEdmInt64(value, dbDataType) {
/* in "-9223372036854775808L" */
/* out "-9223372036854775808L" */
/* in "9223372036854775807" */
/* out "9223372036854775807" */
if (dbDataType !== 'BIGINT') {
throw new XsODataTypeError('db type must be BIGINT');
}
const last = value.substr(value.length - 1).toUpperCase();
if (last !== 'L') {
throw new XsODataTypeError('uri type indicator must be (l|L)');
}
return value.substring(0, value.length - 1);
};
uriToDb['Edm.Decimal'] = function uriToDbEdmDecimal(value, dbDataType) {
let last;
if (dbDataType === 'SMALLDECIMAL' || dbDataType === 'DECIMAL') {
last = value.substr(value.length - 1).toUpperCase();
if (last !== 'M') {
throw new XsODataTypeError('uri type indicator must be (m|M)');
}
return value.substring(0, value.length - 1);
} else {
throw new XsODataTypeError('db type must be SMALLDECIMAL or DECIMAL');
}
};
uriToDb['Edm.Single'] = function uriToDbEdmSingle(value, dbDataType) {
let last;
if (dbDataType === 'REAL' || dbDataType === 'FLOAT') {
last = value.substr(value.length - 1).toUpperCase();
if (last !== 'F') {
throw new XsODataTypeError('uri type indicator must be (f|F)');
}
return value.substring(0, value.length - 1);
} else {
throw new XsODataTypeError('db type must be REAL or DECIMAL');
}
};
uriToDb['Edm.Double'] = function uriToDbEdmDouble(value, dbDataType) {
if (dbDataType === 'DOUBLE') {
/* in "-1.7976931348623158e+308d" */
/* out -1.7976931348623157e+308 */
/* in "1.7976931348623158e+308d" */
/* out 1.7976931348623157e+308 */
const last = value.substr(value.length - 1).toUpperCase();
if (last !== 'F') {
throw new XsODataTypeError('uri type indicator must be (d|D)');
}
return value.substring(0, value.length - 1);
} else {
throw new XsODataTypeError('db type must be DOUBLE');
}
};
uriToDb['_Generic.Number'] = function uriToDbEdmString(number) {
let type = number.substr(number.length - 1).toUpperCase();
if (
type === 'F' ||
type === 'f' ||
type === 'D' ||
type === 'd' ||
type === 'M' ||
type === 'm' ||
type === 'L' ||
type === 'l'
) {
number = number.substring(0, number.length - 1);
} else {
type = '';
}
let sign = number.substring(0, 1);
if (sign === '+' || sign === '-') {
number = number.substring(1);
} else {
sign = '';
}
let exponent;
if (number.indexOf('E') !== -1) {
exponent = number.split('E');
} else if (number.indexOf('e') !== -1) {
exponent = number.split('e');
} else {
exponent = [number];
}
const intFloat = exponent[0].split('.');
const i = intFloat[0] || null;
const f = intFloat[1] || null;
const e = exponent[1] || null;
let ret = '';
ret += sign;
if (i) {
ret += i;
} else {
ret += 0;
}
if (f) {
ret += '.' + f;
}
if (e) {
ret += 'e' + e;
}
if (type === '') {
//simple TINYINT(Edm.Byte),SMALLINT(edm.Int16),INTEGER(Edm.Int32) all over Edm.Int32
return parseInt(ret);
} else if (type === 'F') {
return parseFloat(ret);
} else if (type === 'D') {
return parseFloat(ret);
} else if (type === 'M') {
return ret;
} else if (type === 'L') {
return ret;
} else {
throw new XsODataTypeError('edm type Edm.Guid is not supported');
}
};
function deDoubleQuote(valueString) {
const s1 = valueString
.substr(1, valueString.length - 2)
.replace(/''/g, "'");
return s1;
}
uriToDb['Edm.String'] = function uriToDbEdmString(jsonValue, dbDataType) {
if (dbDataType === 'VARCHAR') {
/* in "'VARCHAR'" */
/* out "VARCHAR" */
return deDoubleQuote(jsonValue);
} else if (dbDataType === 'NVARCHAR') {
return deDoubleQuote(jsonValue);
} else if (dbDataType === 'ALPHANUM') {
return deDoubleQuote(jsonValue);
} else if (dbDataType === 'SHORTTEXT') {
return deDoubleQuote(jsonValue);
} else if (dbDataType === 'CHAR') {
return deDoubleQuote(jsonValue);
} else if (dbDataType === 'NCHAR') {
return deDoubleQuote(jsonValue);
} else if (dbDataType === 'CLOB') {
/* in */
/* out buffer */
return Buffer.from(jsonValue, 'utf8');
} else if (dbDataType === 'NCLOB') {
/* in */
/* out buffer */
return Buffer.from(jsonValue, 'utf8');
} else {
throw new XsODataTypeError(
'db type must be VARCHAR, NVARCHAR, ALPHANUM, SHORTTEXT, CHAR, NCHAR, CLOB, NCLOB'
);
}
};
uriToDb['Edm.Binary'] = function uriToDbEdmBinary(value, dbDataType) {
let tmp;
if (dbDataType === 'BLOB' || dbDataType === 'VARBINARY') {
if (value[0] === 'X') {
tmp = value.substring(2, value.length - 1);
} else {
tmp = value.substring(7, value.length - 1);
}
return Buffer.from(tmp, 'hex');
} else if (dbDataType === 'BINARY') {
throw new XsODataTypeError('db type BINARY is not supported');
}
};
uriToDb['Edm.Guid'] = function uriToDbEdmGuiD(/*jsonValue, dbDataType*/) {
throw new XsODataTypeError('edm type Edm.Guid is not supported');
};