UNPKG

@sap/xsodata

Version:

Expose data from a HANA database as OData V2 service with help of .xsodata files.

355 lines (313 loc) 12.8 kB
'use strict'; var uriToDb = exports.uriToDb = {}; var Type_Error = require('./../errors/typeError'); var 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 Type_Error('db type LONGDATE is not supported'); //} else { // throw new Type_Error('db type must be DATE, SECONDDATE or TIMESTAMP'); //} var raw = value.substring(9, value.length - 1); var datetime = raw.split('T'); var dateParts = datetime[0].split('-'); dateParts[0] = padZero(dateParts[0], 4); dateParts[1] = padZero(dateParts[1], 2); dateParts[2] = padZero(dateParts[2], 2); var 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) { var x = timeParts[2].split('.'); timeParts[2] = padZero(x[0], 2); if (x[1]) { if (x[1].length > 7) { throw new Type_Error('To many fractional seconds in ' + value); //timeParts[3] = x[1].substr(0, 7); } 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 Type_Error('db type must be DATE, SECONDDATE or TIMESTAMP'); }; // old // var timeRegexObj = /^time'PT(?:(\d{1,2})H)?(?:(\d{1,2})M)?(?:(\d{1,2})(?:\.(\d*))?S)?'$/; 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 Type_Error('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 Type_Error('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 Type_Error('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 Type_Error('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 Type_Error('db type must be BIGINT'); } var last = value.substr(value.length - 1).toUpperCase(); if (last !== 'L') { throw new Type_Error('uri type indicator must be (l|L)'); } return value.substring(0, value.length - 1); }; uriToDb['Edm.Decimal'] = function uriToDbEdmDecimal(value, dbDataType) { var last; if (dbDataType === 'SMALLDECIMAL') { /* in "-1.4e-45m" */ /* out "-1.4e-45" */ /* in "1.4e-45m" */ /* out "1.4e-45" */ last = value.substr(value.length - 1).toUpperCase(); if (last !== 'M') { throw new Type_Error('uri type indicator must be (m|M)'); } return value.substring(0, value.length - 1); } else if (dbDataType === 'DECIMAL') { /* in "1234567890.012345678901234567890123m" */ /* out "1234567890.012345678901234567890123" */ /* in "1234567890.012345678901234567890123m" */ /* out "1234567890.012345678901234567890123" */ last = value.substr(value.length - 1).toUpperCase(); if (last !== 'M') { throw new Type_Error('uri type indicator must be (m|M)'); } return value.substring(0, value.length - 1); } else { throw new Type_Error("db type must be SMALLDECIMAL or DECIMAL"); } }; uriToDb['Edm.Single'] = function uriToDbEdmSingle(value, dbDataType) { var last; if (dbDataType === 'REAL') { /* in "-3.40282346e+38f" */ /* out -3.4028234663852886e+38 */ /* in "3.40282346e+38f" */ /* out 3.3028234797236365e+38 */ last = value.substr(value.length - 1).toUpperCase(); if (last !== 'F') { throw new Type_Error('uri type indicator must be (f|F)'); } return value.substring(0, value.length - 1); } else if (dbDataType === 'FLOAT') { /* in "-3.4028234e+38d" */ /* out -3.4028234e+38 */ /* in "3.402823466e+38d" */ /* out 3.402823466e+38 */ last = value.substr(value.length - 1).toUpperCase(); if (last !== 'F') { throw new Type_Error('uri type indicator must be (f|F)'); } return value.substring(0, value.length - 1); } else { throw new Type_Error("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 */ var last = value.substr(value.length - 1).toUpperCase(); if (last !== 'F') { throw new Type_Error('uri type indicator must be (d|D)'); } return value.substring(0, value.length - 1); } else { throw new Type_Error("db type must be DOUBLE"); } }; uriToDb['_Generic.Number'] = function uriToDbEdmString(number) { var 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 = ''; } var sign = number.substring(0, 1); if ((sign === '+') || (sign === '-')) { number = number.substring(1); } else { sign = ''; } var exponent; if (number.indexOf('E') !== -1) { exponent = number.split('E'); } else if (number.indexOf('e') !== -1) { exponent = number.split('e'); } else { exponent = [number]; } var intFloat = exponent[0].split('.'); var i = intFloat[0] || null; var f = intFloat[1] || null; var e = exponent[1] || null; var 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 Type_Error('edm type Edm.Guid is not supported'); } }; function deDoubleQuote(valueString) { var 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 Type_Error('db type must be VARCHAR, NVARCHAR, ALPHANUM, SHORTTEXT, CHAR, NCHAR, CLOB, NCLOB'); } }; uriToDb['Edm.Binary'] = function uriToDbEdmBinary(value, dbDataType) { var tmp; if (dbDataType === 'BLOB') { /* in "x'1234ABCD'" */ /* out buffer */ if (value[0] === 'X') { tmp = value.substring(2, value.length - 1); } else { tmp = value.substring(7, value.length - 1); } //return 'x\'' + tmp + '\''; return Buffer.from(tmp, 'hex'); } else if (dbDataType === 'BINARY') { throw new Type_Error("db type BINARY is not supported"); } else if (dbDataType === 'VARBINARY') { /* in "x'1234ABCD'" */ /* out buffer */ if (value[0] === 'X') { tmp = value.substring(2, value.length - 1); } else { tmp = value.substring(7, value.length - 1); } //return 'x\'' + tmp + '\''; return Buffer.from(tmp, 'hex'); } }; uriToDb['Edm.Guid'] = function uriToDbEdmGuiD(/*jsonValue, dbDataType*/) { throw new Type_Error('edm type Edm.Guid is not supported'); };