Skip to content

Commit

Permalink
Use WKB instead of WKT for Value method on each geometry
Browse files Browse the repository at this point in the history
  • Loading branch information
peterstace committed Aug 20, 2019
1 parent cd48678 commit 432d8c6
Show file tree
Hide file tree
Showing 13 changed files with 26 additions and 14 deletions.
4 changes: 2 additions & 2 deletions fuzztests/postgis.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,15 @@ func (p PostGIS) GeoJSONIsValidWithReason(t *testing.T, geojson string) (bool, s

func (p PostGIS) AsText(t *testing.T, g geom.Geometry) string {
var asText string
if err := p.db.QueryRow(`SELECT ST_AsText($1)`, g).Scan(&asText); err != nil {
if err := p.db.QueryRow(`SELECT ST_AsText(ST_GeomFromWKB($1))`, g).Scan(&asText); err != nil {
t.Fatalf("pg error: %v", err)
}
return asText
}

func (p PostGIS) AsBinary(t *testing.T, g geom.Geometry) []byte {
var asBinary []byte
if err := p.db.QueryRow(`SELECT ST_AsBinary($1::geometry)`, g).Scan(&asBinary); err != nil {
if err := p.db.QueryRow(`SELECT ST_AsBinary(ST_GeomFromWKB($1))`, g).Scan(&asBinary); err != nil {
t.Fatalf("pg error: %v", err)
}
return asBinary
Expand Down
8 changes: 6 additions & 2 deletions geom/sql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,9 @@ func TestValuerConcrete(t *testing.T) {
geom := geomFromWKT(t, wkt).(driver.Valuer)
val, err := geom.Value()
expectNoErr(t, err)
expectDeepEqual(t, geom, geomFromWKT(t, val.(string)))
g, err := UnmarshalWKB(bytes.NewReader(val.([]byte)))
expectNoErr(t, err)
expectDeepEqual(t, geom, g)
})
}
}
Expand All @@ -77,5 +79,7 @@ func TestValuerLinearRing(t *testing.T) {
geom := geomFromWKT(t, "LINEARRING(0 0,1 0,0 1,0 0)").(driver.Valuer)
val, err := geom.Value()
expectNoErr(t, err)
expectDeepEqual(t, geomFromWKT(t, "LINESTRING(0 0,1 0,0 1,0 0)"), geomFromWKT(t, val.(string)))
g, err := UnmarshalWKB(bytes.NewReader(val.([]byte)))
expectNoErr(t, err)
expectDeepEqual(t, geomFromWKT(t, "LINESTRING(0 0,1 0,0 1,0 0)"), g)
}
2 changes: 1 addition & 1 deletion geom/type_empty.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func (e EmptySet) Boundary() Geometry {
}

func (e EmptySet) Value() (driver.Value, error) {
return e.AsText(), nil
return wkbAsBytes(e)
}

func (e EmptySet) AsBinary(w io.Writer) error {
Expand Down
2 changes: 1 addition & 1 deletion geom/type_geometry_collection.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ func (c GeometryCollection) Boundary() Geometry {
}

func (c GeometryCollection) Value() (driver.Value, error) {
return c.AsText(), nil
return wkbAsBytes(c)
}

func (c GeometryCollection) AsBinary(w io.Writer) error {
Expand Down
2 changes: 1 addition & 1 deletion geom/type_line.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ func (n Line) Boundary() Geometry {
}

func (n Line) Value() (driver.Value, error) {
return n.AsText(), nil
return wkbAsBytes(n)
}

func (n Line) AsBinary(w io.Writer) error {
Expand Down
2 changes: 1 addition & 1 deletion geom/type_line_string.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ func (s LineString) Boundary() Geometry {
}

func (s LineString) Value() (driver.Value, error) {
return s.AsText(), nil
return wkbAsBytes(s)
}

func (s LineString) AsBinary(w io.Writer) error {
Expand Down
2 changes: 1 addition & 1 deletion geom/type_linear_ring.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ func (r LinearRing) Boundary() Geometry {
}

func (r LinearRing) Value() (driver.Value, error) {
return r.AsText(), nil
return wkbAsBytes(r)
}

func (r LinearRing) AsBinary(w io.Writer) error {
Expand Down
2 changes: 1 addition & 1 deletion geom/type_multi_line_string.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ func (m MultiLineString) Boundary() Geometry {
}

func (m MultiLineString) Value() (driver.Value, error) {
return m.AsText(), nil
return wkbAsBytes(m)
}

func (m MultiLineString) AsBinary(w io.Writer) error {
Expand Down
2 changes: 1 addition & 1 deletion geom/type_multi_point.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ func (m MultiPoint) Boundary() Geometry {
}

func (m MultiPoint) Value() (driver.Value, error) {
return m.AsText(), nil
return wkbAsBytes(m)
}

func (m MultiPoint) AsBinary(w io.Writer) error {
Expand Down
2 changes: 1 addition & 1 deletion geom/type_multi_polygon.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ func (m MultiPolygon) Boundary() Geometry {
}

func (m MultiPolygon) Value() (driver.Value, error) {
return m.AsText(), nil
return wkbAsBytes(m)
}

func (m MultiPolygon) AsBinary(w io.Writer) error {
Expand Down
2 changes: 1 addition & 1 deletion geom/type_point.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func (p Point) Boundary() Geometry {
}

func (p Point) Value() (driver.Value, error) {
return p.AsText(), nil
return wkbAsBytes(p)
}

func (p Point) AsBinary(w io.Writer) error {
Expand Down
2 changes: 1 addition & 1 deletion geom/type_polygon.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ func (p Polygon) Boundary() Geometry {
}

func (p Polygon) Value() (driver.Value, error) {
return p.AsText(), nil
return wkbAsBytes(p)
}

func (p Polygon) AsBinary(w io.Writer) error {
Expand Down
8 changes: 8 additions & 0 deletions geom/wkb_marshal.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
package geom

import (
"bytes"
"database/sql/driver"
"encoding/binary"
"io"
)

func wkbAsBytes(g Geometry) (driver.Value, error) {
var buf bytes.Buffer
err := g.AsBinary(&buf)
return buf.Bytes(), err
}

type wkbMarshaller struct {
w io.Writer
err error
Expand Down

0 comments on commit 432d8c6

Please sign in to comment.