Skip to content

Commit

Permalink
[CONJS-39] support geometry type
Browse files Browse the repository at this point in the history
  • Loading branch information
rusher committed Aug 24, 2018
1 parent 852ca61 commit 944a93b
Show file tree
Hide file tree
Showing 4 changed files with 433 additions and 3 deletions.
3 changes: 1 addition & 2 deletions lib/cmd/query.js
Expand Up @@ -375,8 +375,7 @@ class Query extends ResultSet {
case FieldType.TIME:
return packet.readAsciiStringLengthEncoded();
case FieldType.GEOMETRY:
//TODO parse Geometry
return null;
return packet.readGeometry();
case FieldType.JSON:
//for mysql only => parse string as JSON object
return JSON.parse(packet.readStringLengthEncoded("utf8"));
Expand Down
89 changes: 89 additions & 0 deletions lib/io/packet.js
Expand Up @@ -19,6 +19,86 @@ class Packet {
this.pos += n;
}

readGeometry() {
const geoBuf = this.readBufferLengthEncoded();
let geoPos = 4;
return readGeometryObject();

function readGeometryObject() {
const byteOrder = geoBuf[geoPos++];
const wkbType = byteOrder ? geoBuf.readInt32LE(geoPos) : geoBuf.readInt32BE(geoPos);
geoPos += 4;
switch (wkbType) {
case 1: //wkbPoint
geoPos += 16;
if (byteOrder) {
return { x: geoBuf.readDoubleLE(geoPos - 16), y: geoBuf.readDoubleLE(geoPos - 8) };
} else {
return { x: geoBuf.readDoubleBE(geoPos - 16), y: geoBuf.readDoubleBE(geoPos - 8) };
}

case 2: //wkbLineString
const pointNumber = byteOrder ? geoBuf.readInt32LE(geoPos) : geoBuf.readInt32BE(geoPos);
geoPos += 4;
let points = [];
for (let i = 0; i < pointNumber; i++) {
geoPos += 16;
if (byteOrder) {
points.push({
x: geoBuf.readDoubleLE(geoPos - 16),
y: geoBuf.readDoubleLE(geoPos - 8)
});
} else {
points.push({
x: geoBuf.readDoubleBE(geoPos - 16),
y: geoBuf.readDoubleBE(geoPos - 8)
});
}
}
return points;

case 3: //wkbPolygon
let polygon = [];
const numRings = byteOrder ? geoBuf.readInt32LE(geoPos) : geoBuf.readInt32BE(geoPos);
geoPos += 4;
for (let ring = 0; ring < numRings; ring++) {
const pointNumber = byteOrder ? geoBuf.readInt32LE(geoPos) : geoBuf.readInt32BE(geoPos);
geoPos += 4;
let arr = [];
for (let i = 0; i < pointNumber; i++) {
geoPos += 16;
if (byteOrder) {
arr.push({
x: geoBuf.readDoubleLE(geoPos - 16),
y: geoBuf.readDoubleLE(geoPos - 8)
});
} else {
arr.push({
x: geoBuf.readDoubleBE(geoPos - 16),
y: geoBuf.readDoubleBE(geoPos - 8)
});
}
}
polygon.push(arr);
}
return polygon;

case 4: //wkbMultiPoint
case 5: //wkbMultiLineString
case 6: //wkbMultiPolygon
case 7: //wkbGeometryCollection
let arr = [];
const number = byteOrder ? geoBuf.readInt32LE(geoPos) : geoBuf.readInt32BE(geoPos);
geoPos += 4;
for (let i = 0; i < number; i++) {
arr.push(readGeometryObject());
}
return arr;
}
return null;
}
}

peek() {
return this.buf[this.pos];
}
Expand Down Expand Up @@ -57,6 +137,15 @@ class Packet {
);
}

readInt32LE() {
return (
(this.buf[this.pos++] << 24) +
(this.buf[this.pos++] << 16) +
(this.buf[this.pos++] << 8) +
this.buf[this.pos++]
);
}

readInt64() {
const first = this.readInt32();
const second = this.readInt32();
Expand Down

0 comments on commit 944a93b

Please sign in to comment.