Skip to content

Commit

Permalink
encoding/wkb.Value: nil geom should return nil driver.Value
Browse files Browse the repository at this point in the history
  • Loading branch information
paulmach committed Feb 15, 2019
1 parent c7ee0fc commit edbcee2
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 10 deletions.
6 changes: 5 additions & 1 deletion encoding/wkb/scanner.go
Original file line number Diff line number Diff line change
Expand Up @@ -331,5 +331,9 @@ func Value(g orb.Geometry) driver.Valuer {
}

func (v value) Value() (driver.Value, error) {
return Marshal(v.v)
val, err := Marshal(v.v)
if val == nil {
return nil, err
}
return val, err
}
86 changes: 79 additions & 7 deletions encoding/wkb/scanner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -869,14 +869,86 @@ func TestScanBound_Errors(t *testing.T) {
}

func TestValue(t *testing.T) {
val, err := Value(testPoint).Value()
if err != nil {
t.Errorf("value error: %v", err)
t.Run("marshalls geometry", func(t *testing.T) {
val, err := Value(testPoint).Value()
if err != nil {
t.Errorf("value error: %v", err)
}

if !bytes.Equal(val.([]byte), testPointData) {
t.Errorf("incorrect marshal")
t.Log(val)
t.Log(testPointData)
}
})

t.Run("nil value in should set nil value", func(t *testing.T) {
val, err := Value(nil).Value()
if err != nil {
t.Errorf("value error: %v", err)
}

if val != nil {
t.Errorf("should be nil value: %[1]T, %[1]v", val)
}
})
}

func TestValue_nil(t *testing.T) {
var (
mp orb.MultiPoint
ls orb.LineString
mls orb.MultiLineString
r orb.Ring
poly orb.Polygon
mpoly orb.MultiPolygon
c orb.Collection
)

cases := []struct {
name string
geom orb.Geometry
}{
{
name: "nil multi point",
geom: mp,
},
{
name: "nil line string",
geom: ls,
},
{
name: "nil multi line string",
geom: mls,
},
{
name: "nil ring",
geom: r,
},
{
name: "nil polygon",
geom: poly,
},
{
name: "nil multi polygon",
geom: mpoly,
},
{
name: "nil collection",
geom: c,
},
}

if !bytes.Equal(val.([]byte), testPointData) {
t.Errorf("incorrect marshal")
t.Log(val)
t.Log(testPointData)
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
val, err := Value(tc.geom).Value()
if err != nil {
t.Errorf("value error: %v", err)
}

if val != nil {
t.Errorf("should be nil value: %[1]T, %[1]v", val)
}
})
}
}
37 changes: 35 additions & 2 deletions encoding/wkb/wkb.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ func Marshal(geom orb.Geometry, byteOrder ...binary.ByteOrder) ([]byte, error) {
return nil, err
}

if buf.Len() == 0 {
return nil, nil
}

return buf.Bytes(), nil
}

Expand All @@ -89,9 +93,38 @@ func (e *Encoder) Encode(geom orb.Geometry) error {
return nil
}

// deal with types that are not supported by wkb
switch g := geom.(type) {
// nil values should not write any data. Empty sizes will still
// write and empty version of that type.
case orb.MultiPoint:
if g == nil {
return nil
}
case orb.LineString:
if g == nil {
return nil
}
case orb.MultiLineString:
if g == nil {
return nil
}
case orb.Polygon:
if g == nil {
return nil
}
case orb.MultiPolygon:
if g == nil {
return nil
}
case orb.Collection:
if g == nil {
return nil
}
// deal with types that are not supported by wkb
case orb.Ring:
if g == nil {
return nil
}
geom = orb.Polygon{g}
case orb.Bound:
geom = g.ToPolygon()
Expand Down Expand Up @@ -248,6 +281,6 @@ func geomLength(geom orb.Geometry) int {

return 9 + sum
}
return 0

return 0
}

0 comments on commit edbcee2

Please sign in to comment.