Skip to content

Commit 059371c

Browse files
committed
Move geometry parsing code to the Parser class
1 parent 3ba2fb6 commit 059371c

File tree

2 files changed

+53
-49
lines changed

2 files changed

+53
-49
lines changed

lib/protocol/Parser.js

+52
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,58 @@ Parser.prototype.parseString = function(length) {
235235
return value;
236236
};
237237

238+
Parser.prototype.parseGeometryValue = function() {
239+
var buffer = this.parseLengthCodedBuffer();
240+
var offset = 4;
241+
function parseGeometry() {
242+
var result = null;
243+
var byteOrder = buffer.readUInt8(offset); offset += 1;
244+
var wkbType = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
245+
switch(wkbType) {
246+
case 1: // WKBPoint
247+
var x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
248+
var y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
249+
result = {x: x, y: y};
250+
break;
251+
case 2: // WKBLineString
252+
var numPoints = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
253+
result = [];
254+
for(var i=numPoints;i>0;i--) {
255+
var x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
256+
var y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
257+
result.push({x: x, y: y});
258+
}
259+
break;
260+
case 3: // WKBPolygon
261+
var numRings = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
262+
result = [];
263+
for(var i=numRings;i>0;i--) {
264+
var numPoints = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
265+
var line = [];
266+
for(var j=numPoints;j>0;j--) {
267+
var x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
268+
var y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
269+
line.push({x: x, y: y});
270+
}
271+
result.push(line);
272+
}
273+
break;
274+
case 4: // WKBMultiPoint
275+
case 5: // WKBMultiLineString
276+
case 6: // WKBMultiPolygon
277+
case 7: // WKBGeometryCollection
278+
var num = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
279+
var result = [];
280+
for(var i=num;i>0;i--) {
281+
result.push(parseGeometry());
282+
}
283+
break;
284+
}
285+
return result;
286+
}
287+
return parseGeometry();
288+
}
289+
238290
Parser.prototype.reachedPacketEnd = function() {
239291
return this._offset === this._packetEnd;
240292
};

lib/protocol/packets/RowDataPacket.js

+1-49
Original file line numberDiff line numberDiff line change
@@ -66,55 +66,7 @@ RowDataPacket.prototype._typeCast = function(field, parser) {
6666
? parser.parseLengthCodedBuffer()
6767
: parser.parseLengthCodedString();
6868
case Types.GEOMETRY:
69-
var buffer = parser.parseLengthCodedBuffer();
70-
var offset = 4;
71-
function parseGeometry() {
72-
var result = null;
73-
var byteOrder = buffer.readUInt8(offset); offset += 1;
74-
var wkbType = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
75-
switch(wkbType) {
76-
case 1: // WKBPoint
77-
var x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
78-
var y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
79-
result = {x: x, y: y};
80-
break;
81-
case 2: // WKBLineString
82-
var numPoints = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
83-
result = [];
84-
for(var i=numPoints;i>0;i--) {
85-
var x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
86-
var y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
87-
result.push({x: x, y: y});
88-
}
89-
break;
90-
case 3: // WKBPolygon
91-
var numRings = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
92-
result = [];
93-
for(var i=numRings;i>0;i--) {
94-
var numPoints = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
95-
var line = [];
96-
for(var j=numPoints;j>0;j--) {
97-
var x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
98-
var y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
99-
line.push({x: x, y: y});
100-
}
101-
result.push(line);
102-
}
103-
break;
104-
case 4: // WKBMultiPoint
105-
case 5: // WKBMultiLineString
106-
case 6: // WKBMultiPolygon
107-
case 7: // WKBGeometryCollection
108-
var num = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
109-
var result = [];
110-
for(var i=num;i>0;i--) {
111-
result.push(parseGeometry());
112-
}
113-
break;
114-
}
115-
return result;
116-
}
117-
return parseGeometry();
69+
return parser.parseGeometryValue();
11870
default:
11971
return parser.parseLengthCodedString();
12072
}

0 commit comments

Comments
 (0)