aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/exp/sql/driver
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2012-01-19 09:27:45 -0800
committerBrad Fitzpatrick <bradfitz@golang.org>2012-01-19 09:27:45 -0800
commitbc0139b4b3d642b7ffbb55d7fbc88b4dcb1db4ec (patch)
treedb9cf9b77070a8292ab7fb5ace6ecaf4155f0c5f /src/pkg/exp/sql/driver
parent9e5f62ac0c7259988fb616d6a91625befa1db62f (diff)
downloadgo-bc0139b4b3d642b7ffbb55d7fbc88b4dcb1db4ec.tar.xz
exp/sql: rename NullableString to NullString and allow its use as a parameter
Prep for Issue 2699 R=rsc CC=golang-dev https://golang.org/cl/5536045
Diffstat (limited to 'src/pkg/exp/sql/driver')
-rw-r--r--src/pkg/exp/sql/driver/types.go48
1 files changed, 47 insertions, 1 deletions
diff --git a/src/pkg/exp/sql/driver/types.go b/src/pkg/exp/sql/driver/types.go
index d6ba641cb2..f383885231 100644
--- a/src/pkg/exp/sql/driver/types.go
+++ b/src/pkg/exp/sql/driver/types.go
@@ -32,6 +32,15 @@ type ValueConverter interface {
ConvertValue(v interface{}) (interface{}, error)
}
+// SubsetValuer is the interface providing the SubsetValue method.
+//
+// Types implementing SubsetValuer interface are able to convert
+// themselves to one of the driver's allowed subset values.
+type SubsetValuer interface {
+ // SubsetValue returns a driver parameter subset value.
+ SubsetValue() (interface{}, error)
+}
+
// Bool is a ValueConverter that converts input values to bools.
//
// The conversion rules are:
@@ -136,6 +145,32 @@ func (stringType) ConvertValue(v interface{}) (interface{}, error) {
return fmt.Sprintf("%v", v), nil
}
+// Null is a type that implements ValueConverter by allowing nil
+// values but otherwise delegating to another ValueConverter.
+type Null struct {
+ Converter ValueConverter
+}
+
+func (n Null) ConvertValue(v interface{}) (interface{}, error) {
+ if v == nil {
+ return nil, nil
+ }
+ return n.Converter.ConvertValue(v)
+}
+
+// NotNull is a type that implements ValueConverter by disallowing nil
+// values but otherwise delegating to another ValueConverter.
+type NotNull struct {
+ Converter ValueConverter
+}
+
+func (n NotNull) ConvertValue(v interface{}) (interface{}, error) {
+ if v == nil {
+ return nil, fmt.Errorf("nil value not allowed")
+ }
+ return n.Converter.ConvertValue(v)
+}
+
// IsParameterSubsetType reports whether v is of a valid type for a
// parameter. These types are:
//
@@ -200,6 +235,17 @@ func (defaultConverter) ConvertValue(v interface{}) (interface{}, error) {
return v, nil
}
+ if svi, ok := v.(SubsetValuer); ok {
+ sv, err := svi.SubsetValue()
+ if err != nil {
+ return nil, err
+ }
+ if !IsParameterSubsetType(sv) {
+ return nil, fmt.Errorf("non-subset type %T returned from SubsetValue", sv)
+ }
+ return sv, nil
+ }
+
rv := reflect.ValueOf(v)
switch rv.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
@@ -215,5 +261,5 @@ func (defaultConverter) ConvertValue(v interface{}) (interface{}, error) {
case reflect.Float32, reflect.Float64:
return rv.Float(), nil
}
- return nil, fmt.Errorf("unsupported type %s", rv.Kind())
+ return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind())
}