Browse Source

Added methods to implement sql related interfaces.

Version.Scan -> database/sql.Scanner
Version.Value -> database/sql/driver.Valuer

Closes #4
Closes #5
tike 11 years ago
committed by Benedikt Lang
parent
commit
272ed2e7e4
2 changed files with 69 additions and 0 deletions
  1. +31
    -0
      sql.go
  2. +38
    -0
      sql_test.go

+ 31
- 0
sql.go View File

@ -0,0 +1,31 @@
package semver
import (
"database/sql/driver"
"fmt"
)
// Scan implements the database/sql.Scanner interface.
func (v *Version) Scan(src interface{}) (err error) {
var strVal string
switch src.(type) {
case string:
strVal = src.(string)
case []byte:
strVal = string(src.([]byte))
default:
return fmt.Errorf("Version.Scan: cannot convert %T to string.", src)
}
tmpv, err := Parse(strVal)
if err != nil {
return
}
*v = *tmpv
return
}
// Value implements the database/sql/driver.Valuer interface.
func (s Version) Value() (driver.Value, error) {
return s.String(), nil
}

+ 38
- 0
sql_test.go View File

@ -0,0 +1,38 @@
package semver
import (
"testing"
)
type scanTest struct {
val interface{}
shouldError bool
expected string
}
var scanTests = []scanTest{
scanTest{"1.2.3", false, "1.2.3"},
scanTest{[]byte("1.2.3"), false, "1.2.3"},
scanTest{7, true, ""},
scanTest{7e4, true, ""},
scanTest{true, true, ""},
}
func TestScanString(t *testing.T) {
for _, tc := range scanTests {
s := &Version{}
err := s.Scan(tc.val)
if tc.shouldError {
if err == nil {
t.Fatalf("Scan did not return an error on %v (%T)", tc.val, tc.val)
}
} else {
if err != nil {
t.Fatalf("Scan returned an unexpected error: %s (%T) on %v (%T)", tc.val, tc.val, tc.val, tc.val)
}
if val, _ := s.Value(); val != tc.expected {
t.Errorf("Wrong Value returned, expected %q, got %q", tc.expected, val)
}
}
}
}

Loading…
Cancel
Save