123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- var Types = require('../constants/types');
- var Charsets = require('../constants/charsets');
- var Field = require('./Field');
- var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53);
- module.exports = RowDataPacket;
- function RowDataPacket() {
- }
- Object.defineProperty(RowDataPacket.prototype, 'parse', {
- configurable : true,
- enumerable : false,
- value : parse
- });
- Object.defineProperty(RowDataPacket.prototype, '_typeCast', {
- configurable : true,
- enumerable : false,
- value : typeCast
- });
- function parse(parser, fieldPackets, typeCast, nestTables, connection) {
- var self = this;
- var next = function () {
- return self._typeCast(fieldPacket, parser, connection.config.timezone, connection.config.supportBigNumbers, connection.config.bigNumberStrings, connection.config.dateStrings);
- };
- for (var i = 0; i < fieldPackets.length; i++) {
- var fieldPacket = fieldPackets[i];
- var value;
- if (typeof typeCast === 'function') {
- value = typeCast.apply(connection, [ new Field({ packet: fieldPacket, parser: parser }), next ]);
- } else {
- value = (typeCast)
- ? this._typeCast(fieldPacket, parser, connection.config.timezone, connection.config.supportBigNumbers, connection.config.bigNumberStrings, connection.config.dateStrings)
- : ( (fieldPacket.charsetNr === Charsets.BINARY)
- ? parser.parseLengthCodedBuffer()
- : parser.parseLengthCodedString() );
- }
- if (typeof nestTables === 'string' && nestTables.length) {
- this[fieldPacket.table + nestTables + fieldPacket.name] = value;
- } else if (nestTables) {
- this[fieldPacket.table] = this[fieldPacket.table] || {};
- this[fieldPacket.table][fieldPacket.name] = value;
- } else {
- this[fieldPacket.name] = value;
- }
- }
- }
- function typeCast(field, parser, timeZone, supportBigNumbers, bigNumberStrings, dateStrings) {
- var numberString;
- switch (field.type) {
- case Types.TIMESTAMP:
- case Types.TIMESTAMP2:
- case Types.DATE:
- case Types.DATETIME:
- case Types.DATETIME2:
- case Types.NEWDATE:
- var dateString = parser.parseLengthCodedString();
- if (typeMatch(field.type, dateStrings)) {
- return dateString;
- }
- if (dateString === null) {
- return null;
- }
- var originalString = dateString;
- if (field.type === Types.DATE) {
- dateString += ' 00:00:00';
- }
- if (timeZone !== 'local') {
- dateString += ' ' + timeZone;
- }
- var dt = new Date(dateString);
- if (isNaN(dt.getTime())) {
- return originalString;
- }
- return dt;
- case Types.TINY:
- case Types.SHORT:
- case Types.LONG:
- case Types.INT24:
- case Types.YEAR:
- case Types.FLOAT:
- case Types.DOUBLE:
- numberString = parser.parseLengthCodedString();
- return (numberString === null || (field.zeroFill && numberString[0] === '0'))
- ? numberString : Number(numberString);
- case Types.NEWDECIMAL:
- case Types.LONGLONG:
- numberString = parser.parseLengthCodedString();
- return (numberString === null || (field.zeroFill && numberString[0] === '0'))
- ? numberString
- : ((supportBigNumbers && (bigNumberStrings || (Number(numberString) >= IEEE_754_BINARY_64_PRECISION) || Number(numberString) <= -IEEE_754_BINARY_64_PRECISION))
- ? numberString
- : Number(numberString));
- case Types.BIT:
- return parser.parseLengthCodedBuffer();
- case Types.STRING:
- case Types.VAR_STRING:
- case Types.TINY_BLOB:
- case Types.MEDIUM_BLOB:
- case Types.LONG_BLOB:
- case Types.BLOB:
- return (field.charsetNr === Charsets.BINARY)
- ? parser.parseLengthCodedBuffer()
- : parser.parseLengthCodedString();
- case Types.GEOMETRY:
- return parser.parseGeometryValue();
- default:
- return parser.parseLengthCodedString();
- }
- }
- function typeMatch(type, list) {
- if (Array.isArray(list)) {
- return list.indexOf(Types[type]) !== -1;
- } else {
- return Boolean(list);
- }
- }
|