@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
JavaScript
;
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');
};