Skip to content

Commit

Permalink
Fixed deserialization of Date type
Browse files Browse the repository at this point in the history
  • Loading branch information
wolf4ood committed Jun 29, 2018
1 parent 1461f57 commit f096fd9
Showing 1 changed file with 38 additions and 48 deletions.
86 changes: 38 additions & 48 deletions lib/client/network/protocol37/deserializer-binary.js
@@ -1,26 +1,25 @@
/*jshint esversion: 6 */
"use strict";

const varint = require('signed-varint');
const varint = require("signed-varint");

const RecordID = require('../../../recordid');
const ORidBag = require('../../../client/database/bag').ORidBag;
const OEmbeddedRidBag = require('../../../client/database/bag').OEmbeddedRidBag;
const OSBTreeRidBag = require('../../../client/database/bag').OSBTreeRidBag;
const RecordID = require("../../../recordid");
const ORidBag = require("../../../client/database/bag").ORidBag;
const OEmbeddedRidBag = require("../../../client/database/bag").OEmbeddedRidBag;
const OSBTreeRidBag = require("../../../client/database/bag").OSBTreeRidBag;

const BigInteger = require("node-biginteger");
const Long = require('../../../long').Long;
const Long = require("../../../long").Long;

function decimalRead(buffer, scale) {
var num;
var bigi;
if ((buffer[0] & 0x80) === 0) {
bigi = BigInteger.fromBuffer(1, buffer);
num = bigi.longValue().toNumber();
}
else {
} else {
for (var cur = 0; cur < buffer.length; cur++) {
buffer[cur] = (buffer[cur] ^ 0xff);
buffer[cur] = buffer[cur] ^ 0xff;
}
bigi = BigInteger.fromBuffer(-1, buffer);
num = bigi.longValue().toNumber();
Expand All @@ -35,10 +34,7 @@ function decimalRead(buffer, scale) {
return num / realScale;
}


function deserialize(type, input, classes) {


if (!input) {
return null;
}
Expand All @@ -54,25 +50,22 @@ function deserialize(type, input, classes) {
return deserializeDocument(input);
}


let offset = 0;
let parsed = parseElement(input, offset);
let record = parsed.value;

if (classes && record['@class'] && classes[record['@class']]) {
return classes[record['@class']](record);
if (classes && record["@class"] && classes[record["@class"]]) {
return classes[record["@class"]](record);
}
return record;
}
function deserializeProjection(input) {

let offset = 0;
let parsed = parseElement(input, offset);
let record = parsed.value;
return record;
}
function deserializeDocument(input) {

let offset = 0;
let parsed = parseDocument(input, offset);
let record = parsed.value;
Expand All @@ -92,7 +85,7 @@ function parseDocument(input, offset) {
let parsed = parseFields(record, input, offset);
offset += parsed.read;

return {read: (offset - baseOffset), value: record};
return { read: offset - baseOffset, value: record };
}

function parseFields(record, input, offset, reader) {
Expand All @@ -110,7 +103,7 @@ function parseFields(record, input, offset, reader) {
offset += parsed.read;
record[fieldName] = parsed.value;
}
return {read: (offset - baseOffset)};
return { read: offset - baseOffset };
}
function parseElement(input, offset) {
let record = {};
Expand All @@ -119,7 +112,7 @@ function parseElement(input, offset) {
offset += parsed.read;
parsed = parseString(input, offset);
offset += parsed.read;
return {read: (offset - baseOffset), value: record};
return { read: offset - baseOffset, value: record };
}
/**
* Parse single field value
Expand All @@ -132,7 +125,7 @@ function parseValue(input, type, offset, fieldName, reader) {
let parsed;
switch (type) {
case -1:
parsed = {read: 0, value: null};
parsed = { read: 0, value: null };
break;
case 0:
parsed = parseBoolean(input, offset);
Expand All @@ -149,7 +142,7 @@ function parseValue(input, type, offset, fieldName, reader) {
parsed = parseDoubleNumber(input, offset);
break;
case 6:
parsed = parseDate(input, offset);
parsed = parseDateTime(input, offset);
break;
case 7:
parsed = parseString(input, offset);
Expand All @@ -174,6 +167,9 @@ function parseValue(input, type, offset, fieldName, reader) {
case 17:
parsed = parseByte(input, offset);
break;
case 19:
parsed = parseDate(input, offset);
break;
case 22:
parsed = parseRidBag(input, offset);
break;
Expand All @@ -184,20 +180,25 @@ function parseValue(input, type, offset, fieldName, reader) {
return parsed;
}

function parseDateTime(input, offset) {
let parsed = parseNumber(input, offset);
parsed.value = new Date(parsed.value);
return parsed;
}

function parseDate(input, offset) {
let parsed = parseNumber(input, offset);
parsed.value = new Date(parsed.value);
parsed.value = new Date(parsed.value * 86400000);
return parsed;
}
function parseBoolean(input, offset) {
let value = input.readInt8(offset);
return {read: 1, value: (value == 1)};
return { read: 1, value: value == 1 };
}

function parseByte(input, offset) {
let value = input.readInt8(offset);
return {read: 1, value: value};
return { read: 1, value: value };
}
/**
* Parse LinkList/LinkSet
Expand All @@ -207,7 +208,6 @@ function parseByte(input, offset) {
*/

function parseLinkCollection(input, offset) {

let baseOffset = offset;
let collection = [];
let size = parseNumber(input, offset);
Expand All @@ -218,7 +218,7 @@ function parseLinkCollection(input, offset) {
offset += ridParsed.read;
collection.push(ridParsed.value);
}
return {read: offset - baseOffset, value: collection};
return { read: offset - baseOffset, value: collection };
}

function parseLink(input, offset) {
Expand All @@ -231,30 +231,29 @@ function parseLink(input, offset) {
cluster: clusterId.value,
position: clusterPosition.value
});
return {read: offset - baseOffset, value: rid};
return { read: offset - baseOffset, value: rid };
}

function parseNumber(input, offset) {
let value = varint.decode(input, offset);
let read = varint.decode.bytes;
return {read: read, value: value};
return { read: read, value: value };
}

function parseFloatNumber(input, offset) {
let value = input.readFloatBE(offset);
return {read: 4, value: value};
return { read: 4, value: value };
}
function parseDoubleNumber(input, offset) {
let value = input.readDoubleBE(offset);
return {read: 8, value: value};
return { read: 8, value: value };
}

function parseString(input, offset) {

let parsed = parseNumber(input, offset);
offset = offset + parsed.read;
let value = input.toString("utf8", offset, offset + parsed.value);
return {read: parsed.read + parsed.value, value: value};
return { read: parsed.read + parsed.value, value: value };
}

function parseEmbeddedCollection(input, offset, fieldName, reader) {
Expand All @@ -263,25 +262,22 @@ function parseEmbeddedCollection(input, offset, fieldName, reader) {
offset += parsed.read;
let embedded = new Array(parsed.value);


for (let i = 0; i < parsed.value; i++) {
let type = input.readInt8(offset);
offset += 1;
let tmp;
if (type === -1) {
tmp = {read: 0, value: null};
tmp = { read: 0, value: null };
} else {
tmp = parseValue(input, type, offset, `${fieldName}[${i}]`, reader);
}
offset += tmp.read;
embedded[i] = tmp.value;
}
return {read: offset - baseOffset, value: embedded};
return { read: offset - baseOffset, value: embedded };
}


function parseEmbedded(input, offset, reader) {

let parsed;
if (reader) {
parsed = reader(input, offset);
Expand All @@ -291,7 +287,6 @@ function parseEmbedded(input, offset, reader) {
return parsed;
}
function parseEmbeddedMap(input, offset) {

let parsed = parseNumber(input, offset);
let baseOffset = offset;
offset += parsed.read;
Expand All @@ -303,18 +298,17 @@ function parseEmbeddedMap(input, offset) {
offset += 1;
let tmp;
if (type === -1) {
tmp = {read: 0, value: null};
tmp = { read: 0, value: null };
} else {
tmp = parseValue(input, type, offset);
}
offset += tmp.read;
map[key.value] = tmp.value;
}
return {read: offset - baseOffset, value: map};
return { read: offset - baseOffset, value: map };
}

function parseRidBag(input, offset) {

let baseOffset = offset;
let v1 = parseLong(input, offset);
offset += v1.read;
Expand All @@ -340,14 +334,12 @@ function parseRidBag(input, offset) {
bag = new ORidBag(new OSBTreeRidBag());
}


return {read: offset - baseOffset, value: bag};
return { read: offset - baseOffset, value: bag };
}

exports.enableRIDBags = true;
exports.deserialize = deserialize;


/**
* Read a Long from the given buffer.
*
Expand All @@ -356,12 +348,10 @@ exports.deserialize = deserialize;
* @return {Object} The Long number.
*/


function parseLong(buffer, offset) {

let long = Long.fromBits(
buffer.readUInt32BE(offset + 4),
buffer.readInt32BE(offset)
);
return {read: 8, value: long};
return { read: 8, value: long };
}

0 comments on commit f096fd9

Please sign in to comment.