Skip to content

Commit 2652fbd

Browse files
committed
encoding/ewkb: move special mysql prefix srid stuff out of common.
1 parent 5a50f16 commit 2652fbd

File tree

6 files changed

+82
-107
lines changed

6 files changed

+82
-107
lines changed

encoding/ewkb/wkb.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ var (
3030
var commonErrorMap = map[error]error{
3131
wkbcommon.ErrUnsupportedDataType: ErrUnsupportedDataType,
3232
wkbcommon.ErrNotWKB: ErrNotEWKB,
33+
wkbcommon.ErrNotWKBHeader: ErrNotEWKB,
3334
wkbcommon.ErrIncorrectGeometry: ErrIncorrectGeometry,
3435
wkbcommon.ErrUnsupportedGeometry: ErrUnsupportedGeometry,
3536
}

encoding/internal/wkbcommon/scan.go

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ var (
1717
// ErrNotWKB is returned when unmarshalling WKB and the data is not valid.
1818
ErrNotWKB = errors.New("wkbcommon: invalid data")
1919

20+
// ErrNotWKBHeader is returned when unmarshalling first few bytes and there
21+
// is an issue.
22+
ErrNotWKBHeader = errors.New("wkbcommon: invalid header data")
23+
2024
// ErrIncorrectGeometry is returned when unmarshalling WKB data into the wrong type.
2125
// For example, unmarshaling linestring data into a point.
2226
ErrIncorrectGeometry = errors.New("wkbcommon: incorrect geometry")
@@ -32,18 +36,6 @@ func ScanPoint(data []byte) (orb.Point, int, error) {
3236
return orb.Point{}, 0, err
3337
}
3438

35-
// Checking for MySQL's SRID+WKB format where the SRID is 0.
36-
// Common SRIDs would be handled in the unmarshalByteOrderType above.
37-
if len(data) == 25 &&
38-
data[0] == 0 && data[1] == 0 && data[2] == 0 && data[3] == 0 {
39-
40-
data = data[4:]
41-
order, typ, srid, geomData, err = unmarshalByteOrderType(data)
42-
if err != nil {
43-
return orb.Point{}, 0, err
44-
}
45-
}
46-
4739
switch typ {
4840
case pointType:
4941
p, err := unmarshalPoint(order, geomData)

encoding/internal/wkbcommon/scan_test.go

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,11 @@ func TestScanPoint(t *testing.T) {
2020
data: testPointData,
2121
expected: testPoint,
2222
},
23-
{
24-
name: "point with MySQL SRID",
25-
data: append(SRID, testPointData...),
26-
expected: testPoint,
27-
},
28-
{
29-
name: "point with 0 SRID",
30-
data: append([]byte{0, 0, 0, 0}, testPointData...),
31-
expected: testPoint,
32-
},
3323
{
3424
name: "single multi-point",
3525
data: testMultiPointSingleData,
3626
expected: testMultiPointSingle[0],
3727
},
38-
{
39-
name: "single multi-point with MySQL SRID",
40-
data: append(SRID, testMultiPointSingleData...),
41-
expected: testMultiPointSingle[0],
42-
},
4328
{
4429
name: "ewkb",
4530
srid: 4326,
@@ -83,18 +68,13 @@ func TestScanPoint_errors(t *testing.T) {
8368
{
8469
name: "invalid first byte",
8570
data: []byte{3, 1, 0, 0, 0, 15, 152, 60, 227, 24, 157, 94, 192, 205, 11, 17, 39, 128, 222, 66, 64},
86-
err: ErrNotWKB,
71+
err: ErrNotWKBHeader,
8772
},
8873
{
8974
name: "incorrect geometry",
9075
data: testLineStringData,
9176
err: ErrIncorrectGeometry,
9277
},
93-
{
94-
name: "incorrect geometry with MySQL SRID",
95-
data: append(SRID, testLineStringData...),
96-
err: ErrIncorrectGeometry,
97-
},
9878
}
9979

10080
for _, tc := range cases {
@@ -119,11 +99,6 @@ func TestScanMultiPoint(t *testing.T) {
11999
data: testMultiPointData,
120100
expected: testMultiPoint,
121101
},
122-
{
123-
name: "multi point with MySQL SRID",
124-
data: append(SRID, testMultiPointData...),
125-
expected: testMultiPoint,
126-
},
127102
{
128103
name: "multi point as ewkb",
129104
srid: 4326,
@@ -197,11 +172,6 @@ func TestScanLineString(t *testing.T) {
197172
data: testLineStringData,
198173
expected: testLineString,
199174
},
200-
{
201-
name: "line string with MySQL SRID",
202-
data: append(SRID, testLineStringData...),
203-
expected: testLineString,
204-
},
205175
{
206176
name: "line string as ewkb",
207177
srid: 4326,
@@ -280,11 +250,6 @@ func TestScanMultiLineString(t *testing.T) {
280250
data: testMultiLineStringData,
281251
expected: testMultiLineString,
282252
},
283-
{
284-
name: "multi line string with MySQL SRID",
285-
data: append(SRID, testMultiLineStringData...),
286-
expected: testMultiLineString,
287-
},
288253
{
289254
name: "multi line string as ewkb",
290255
srid: 4326,
@@ -358,11 +323,6 @@ func TestScanPolygon(t *testing.T) {
358323
data: testPolygonData,
359324
expected: testPolygon,
360325
},
361-
{
362-
name: "polygon with MySQL SRID",
363-
data: append(SRID, testPolygonData...),
364-
expected: testPolygon,
365-
},
366326
{
367327
name: "polygon as ewkb",
368328
data: MustMarshal(testPolygon, 4326),
@@ -435,11 +395,6 @@ func TestScanMultiPolygon(t *testing.T) {
435395
data: testMultiPolygonData,
436396
expected: testMultiPolygon,
437397
},
438-
{
439-
name: "multi polygon with MySQL SRID",
440-
data: append(SRID, testMultiPolygonData...),
441-
expected: testMultiPolygon,
442-
},
443398
{
444399
name: "multi polygon as ewkb",
445400
srid: 4326,

encoding/internal/wkbcommon/wkb.go

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -318,43 +318,22 @@ func readUint32(r io.Reader, order byteOrder, buf []byte) (uint32, error) {
318318
}
319319

320320
func unmarshalByteOrderType(buf []byte) (byteOrder, uint32, int, []byte, error) {
321-
order, typ, srid, data, err := unmarshalByteOrderTypeDirect(buf)
322-
if err == nil {
323-
// regular (e)wkb
324-
return order, typ & 0x0FF, srid, data, nil
325-
}
326-
327-
if len(buf) < 10 {
328-
return 0, 0, 0, nil, ErrNotWKB
329-
}
330-
331-
// The prefix is incorrect, let's see if this is data in
332-
// MySQL's SRID+WKB format. So truncate the SRID prefix.
333-
order, typ, srid, data, err = unmarshalByteOrderTypeDirect(buf[4:])
334-
if err != nil || typ&0x00FFFFFF > 7 {
335-
return 0, 0, 0, nil, ErrNotWKB
336-
}
337-
338-
return order, typ & 0x0FF, srid, data, nil
339-
}
340-
341-
func unmarshalByteOrderTypeDirect(buf []byte) (byteOrder, uint32, int, []byte, error) {
342321
order, typ, err := byteOrderType(buf)
343322
if err != nil {
344323
return 0, 0, 0, nil, err
345324
}
346325

347326
if typ&ewkbType == 0 {
348327
// regular wkb, no srid
349-
return order, typ, 0, buf[5:], nil
328+
return order, typ & 0x0F, 0, buf[5:], nil
350329
}
351330

352331
if len(buf) < 10 {
353332
return 0, 0, 0, nil, ErrNotWKB
354333
}
355334

356335
srid := unmarshalUint32(order, buf[5:])
357-
return order, typ, int(srid), buf[9:], nil
336+
return order, typ & 0x0F, int(srid), buf[9:], nil
358337
}
359338

360339
func byteOrderType(buf []byte) (byteOrder, uint32, error) {
@@ -363,12 +342,13 @@ func byteOrderType(buf []byte) (byteOrder, uint32, error) {
363342
}
364343

365344
var order byteOrder
366-
if buf[0] == 0 {
345+
switch buf[0] {
346+
case 0:
367347
order = bigEndian
368-
} else if buf[0] == 1 {
348+
case 1:
369349
order = littleEndian
370-
} else {
371-
return 0, 0, ErrNotWKB
350+
default:
351+
return 0, 0, ErrNotWKBHeader
372352
}
373353

374354
// the type which is 4 bytes

encoding/wkb/scanner.go

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ var (
3636
var commonErrorMap = map[error]error{
3737
wkbcommon.ErrUnsupportedDataType: ErrUnsupportedDataType,
3838
wkbcommon.ErrNotWKB: ErrNotWKB,
39+
wkbcommon.ErrNotWKBHeader: ErrNotWKB,
3940
wkbcommon.ErrIncorrectGeometry: ErrIncorrectGeometry,
4041
wkbcommon.ErrUnsupportedGeometry: ErrUnsupportedGeometry,
4142
}
@@ -128,6 +129,8 @@ func (s *GeometryScanner) Scan(d interface{}) error {
128129
data = data[:n]
129130
}
130131

132+
var e error
133+
131134
switch g := s.g.(type) {
132135
case nil:
133136
m, err := Unmarshal(data)
@@ -140,6 +143,13 @@ func (s *GeometryScanner) Scan(d interface{}) error {
140143
return nil
141144
case *orb.Point:
142145
p, _, err := wkbcommon.ScanPoint(data)
146+
if err == wkbcommon.ErrNotWKBHeader {
147+
p, _, e = wkbcommon.ScanPoint(data[4:])
148+
if e != wkbcommon.ErrNotWKBHeader {
149+
err = e // nil or incorrect type, e.g. decoding line string
150+
}
151+
}
152+
143153
if err != nil {
144154
return mapCommonError(err)
145155
}
@@ -149,33 +159,54 @@ func (s *GeometryScanner) Scan(d interface{}) error {
149159
s.Valid = true
150160
return nil
151161
case *orb.MultiPoint:
152-
p, _, err := wkbcommon.ScanMultiPoint(data)
162+
m, _, err := wkbcommon.ScanMultiPoint(data)
163+
if err == wkbcommon.ErrNotWKBHeader {
164+
m, _, e = wkbcommon.ScanMultiPoint(data[4:])
165+
if e != wkbcommon.ErrNotWKBHeader {
166+
err = e
167+
}
168+
}
169+
153170
if err != nil {
154171
return mapCommonError(err)
155172
}
156173

157-
*g = p
158-
s.Geometry = p
174+
*g = m
175+
s.Geometry = m
159176
s.Valid = true
160177
return nil
161178
case *orb.LineString:
162-
p, _, err := wkbcommon.ScanLineString(data)
179+
l, _, err := wkbcommon.ScanLineString(data)
180+
if err == wkbcommon.ErrNotWKBHeader {
181+
l, _, e = wkbcommon.ScanLineString(data[4:])
182+
if e != wkbcommon.ErrNotWKBHeader {
183+
err = e
184+
}
185+
}
186+
163187
if err != nil {
164188
return mapCommonError(err)
165189
}
166190

167-
*g = p
168-
s.Geometry = p
191+
*g = l
192+
s.Geometry = l
169193
s.Valid = true
170194
return nil
171195
case *orb.MultiLineString:
172-
p, _, err := wkbcommon.ScanMultiLineString(data)
196+
m, _, err := wkbcommon.ScanMultiLineString(data)
197+
if err == wkbcommon.ErrNotWKBHeader {
198+
m, _, e = wkbcommon.ScanMultiLineString(data[4:])
199+
if e != wkbcommon.ErrNotWKBHeader {
200+
err = e
201+
}
202+
}
203+
173204
if err != nil {
174205
return mapCommonError(err)
175206
}
176207

177-
*g = p
178-
s.Geometry = p
208+
*g = m
209+
s.Geometry = m
179210
s.Valid = true
180211
return nil
181212
case *orb.Ring:
@@ -193,17 +224,31 @@ func (s *GeometryScanner) Scan(d interface{}) error {
193224

194225
return ErrIncorrectGeometry
195226
case *orb.Polygon:
196-
m, _, err := wkbcommon.ScanPolygon(data)
227+
p, _, err := wkbcommon.ScanPolygon(data)
228+
if err == wkbcommon.ErrNotWKBHeader {
229+
p, _, e = wkbcommon.ScanPolygon(data[4:])
230+
if e != wkbcommon.ErrNotWKBHeader {
231+
err = e
232+
}
233+
}
234+
197235
if err != nil {
198236
return mapCommonError(err)
199237
}
200238

201-
*g = m
202-
s.Geometry = m
239+
*g = p
240+
s.Geometry = p
203241
s.Valid = true
204242
return nil
205243
case *orb.MultiPolygon:
206244
m, _, err := wkbcommon.ScanMultiPolygon(data)
245+
if err == wkbcommon.ErrNotWKBHeader {
246+
m, _, e = wkbcommon.ScanMultiPolygon(data[4:])
247+
if e != wkbcommon.ErrNotWKBHeader {
248+
err = e
249+
}
250+
}
251+
207252
if err != nil {
208253
return mapCommonError(err)
209254
}
@@ -213,13 +258,20 @@ func (s *GeometryScanner) Scan(d interface{}) error {
213258
s.Valid = true
214259
return nil
215260
case *orb.Collection:
216-
m, _, err := wkbcommon.ScanCollection(data)
261+
c, _, err := wkbcommon.ScanCollection(data)
262+
if err == wkbcommon.ErrNotWKBHeader {
263+
c, _, e = wkbcommon.ScanCollection(data[4:])
264+
if e != wkbcommon.ErrNotWKBHeader {
265+
err = e
266+
}
267+
}
268+
217269
if err != nil {
218270
return mapCommonError(err)
219271
}
220272

221-
*g = m
222-
s.Geometry = m
273+
*g = c
274+
s.Geometry = c
223275
s.Valid = true
224276
return nil
225277
case *orb.Bound:

encoding/wkb/scanner_test.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,6 @@ func TestScanPoint(t *testing.T) {
149149
data: append(SRID, testPointData...),
150150
expected: testPoint,
151151
},
152-
{
153-
name: "point with 0 SRID",
154-
data: append([]byte{0, 0, 0, 0}, testPointData...),
155-
expected: testPoint,
156-
},
157152
{
158153
name: "single multi-point",
159154
data: testMultiPointSingleData,
@@ -205,14 +200,14 @@ func TestScanPoint_errors(t *testing.T) {
205200
err: ErrUnsupportedDataType,
206201
},
207202
{
208-
name: "not wkb",
203+
name: "not wkb, too short",
209204
data: []byte{0, 0, 0, 0, 1, 192, 94, 157, 24, 227, 60, 152, 15, 64, 66, 222, 128, 39},
210205
err: ErrNotWKB,
211206
},
212207
{
213208
name: "invalid first byte",
214209
data: []byte{3, 1, 0, 0, 0, 15, 152, 60, 227, 24, 157, 94, 192, 205, 11, 17, 39, 128, 222, 66, 64},
215-
err: ErrNotWKB,
210+
err: ErrIncorrectGeometry,
216211
},
217212
{
218213
name: "incorrect geometry",

0 commit comments

Comments
 (0)