You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.6 KiB
89 lines
2.6 KiB
var Types = require('../constants/types');
|
|
var Charsets = require('../constants/charsets');
|
|
var Field = require('./Field');
|
|
|
|
module.exports = RowDataPacket;
|
|
function RowDataPacket() {
|
|
}
|
|
|
|
RowDataPacket.prototype.parse = function(parser, fieldPackets, typeCast, nestTables, connection) {
|
|
var self = this;
|
|
var next = function () {
|
|
return self._typeCast(fieldPacket, parser, connection.config.timezone);
|
|
};
|
|
|
|
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)
|
|
: ( (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;
|
|
}
|
|
}
|
|
};
|
|
|
|
RowDataPacket.prototype._typeCast = function(field, parser, timeZone) {
|
|
switch (field.type) {
|
|
case Types.TIMESTAMP:
|
|
case Types.DATE:
|
|
case Types.DATETIME:
|
|
case Types.NEWDATE:
|
|
var dateString = parser.parseLengthCodedString();
|
|
if (dateString === null) {
|
|
return null;
|
|
}
|
|
|
|
if (timeZone != 'local') {
|
|
if (field.type === Types.DATE) {
|
|
dateString += ' 00:00:00 ' + timeZone;
|
|
} else {
|
|
dateString += timeZone;
|
|
}
|
|
}
|
|
|
|
return new Date(dateString);
|
|
case Types.TINY:
|
|
case Types.SHORT:
|
|
case Types.LONG:
|
|
case Types.INT24:
|
|
case Types.YEAR:
|
|
case Types.FLOAT:
|
|
case Types.DOUBLE:
|
|
case Types.LONGLONG:
|
|
case Types.NEWDECIMAL:
|
|
var numberString = parser.parseLengthCodedString();
|
|
return (numberString === null || (field.zeroFill && numberString[0] == "0"))
|
|
? 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();
|
|
}
|
|
};
|