mssql2
Version:
Microsoft SQL Server client for Node.js (fork)
245 lines (179 loc) • 4.58 kB
text/coffeescript
FIGURE =
INTERIOR_RING: 0x00
STROKE: 0x01
EXTERIOR_RING: 0x02
FIGURE_V2 =
POINT: 0x00
LINE: 0x01
ARC: 0x02
COMPOSITE_CURVE: 0x03
SHAPE =
POINT: 0x01
LINESTRING: 0x02
POLYGON: 0x03
MULTIPOINT: 0x04
MULTILINESTRING: 0x05
MULTIPOLYGON: 0x06
GEOMETRY_COLLECTION: 0x07
SHAPE_V2 =
POINT: 0x01
LINESTRING: 0x02
POLYGON: 0x03
MULTIPOINT: 0x04
MULTILINESTRING: 0x05
MULTIPOLYGON: 0x06
GEOMETRY_COLLECTION: 0x07
CIRCULAR_STRING: 0x08
COMPOUND_CURVE: 0x09
CURVE_POLYGON: 0x0A
FULL_GLOBE: 0x0B
SEGMENT =
LINE: 0x00
ARC: 0x01
FIRST_LINE: 0x02
FIRST_ARC: 0x03
class Point
x: 0
y: 0
z: null
m: null
parseGeography = (buffer, geometry = false) ->
# s2.1.1 + s.2.1.2
srid = buffer.readInt32LE 0
if srid is -1 then return null
value =
srid: srid
version: buffer.readUInt8 4
flags = buffer.readUInt8 5
buffer.position = 6
#console.log "srid", srid
#console.log "version", version
properties =
Z: if flags & (1 << 0) then true else false
M: if flags & (1 << 1) then true else false
V: if flags & (1 << 2) then true else false
P: if flags & (1 << 3) then true else false
L: if flags & (1 << 4) then true else false
if value.version is 2
properties.H = if flags & (1 << 3) then true else false
#console.log "properties", properties
if properties.P
numberOfPoints = 1
else if properties.L
numberOfPoints = 2
else
numberOfPoints = buffer.readUInt32LE buffer.position
buffer.position += 4
#console.log "numberOfPoints", numberOfPoints
value.points = parsePoints buffer, numberOfPoints
if properties.Z
parseZ buffer, value.points
if properties.M
parseM buffer, value.points
#console.log "points", points
if properties.P
numberOfFigures = 1
else if properties.L
numberOfFigures = 1
else
numberOfFigures = buffer.readUInt32LE buffer.position
buffer.position += 4
#console.log "numberOfFigures", numberOfFigures
value.figures = parseFigures buffer, numberOfFigures, properties
#console.log "figures", figures
if properties.P
numberOfShapes = 1
else if properties.L
numberOfShapes = 1
else
numberOfShapes = buffer.readUInt32LE buffer.position
buffer.position += 4
#console.log "numberOfShapes", numberOfShapes
value.shapes = parseShapes buffer, numberOfShapes, properties
#console.log "shapes", shapes
if value.version is 2
numberOfSegments = buffer.readUInt32LE buffer.position
buffer.position += 4
#console.log "numberOfSegments", numberOfSegments
value.segments = parseSegments buffer, numberOfSegments
#console.log "segments", segments
else
value.segments = []
value
parsePoints = (buffer, count) ->
# s2.1.5 + s2.1.6
points = []
if count < 1 then return points
for i in [1..count]
points.push (point = new Point)
point.x = buffer.readDoubleLE buffer.position
point.y = buffer.readDoubleLE buffer.position + 8
buffer.position += 16
points
parseZ = (buffer, points) ->
# s2.1.1 + s.2.1.2
if points < 1 then return
for point in points
point.z = buffer.readDoubleLE buffer.position
buffer.position += 8
parseM = (buffer, points) ->
# s2.1.1 + s.2.1.2
if points < 1 then return
for point in points
point.m = buffer.readDoubleLE buffer.position
buffer.position += 8
parseFigures = (buffer, count, properties) ->
# s2.1.3
figures = []
if count < 1 then return figures
if properties.P
figures.push
attribute: 0x01
pointOffset: 0
else if properties.L
figures.push
attribute: 0x01
pointOffset: 0
else
for i in [1..count]
figures.push
attribute: buffer.readUInt8 buffer.position
pointOffset: buffer.readInt32LE buffer.position + 1
buffer.position += 5
figures
parseShapes = (buffer, count, properties) ->
# s2.1.4
shapes = []
if count < 1 then return shapes
if properties.P
shapes.push
parentOffset: -1
figureOffset: 0
type: 0x01
else if properties.L
shapes.push
parentOffset: -1
figureOffset: 0
type: 0x02
else
for i in [1..count]
shapes.push
parentOffset: buffer.readInt32LE buffer.position
figureOffset: buffer.readInt32LE buffer.position + 4
type: buffer.readUInt8 buffer.position + 8
buffer.position += 9
shapes
parseSegments = (buffer, count) ->
# s2.1.7
segments = []
if count < 1 then return segments
for i in [1..count]
segments.push
type: buffer.readUInt8 buffer.position
buffer.position++
segments
exports.PARSERS =
geography: (buffer) ->
parseGeography buffer
geometry: (buffer) ->
parseGeography buffer, true