1
2
3
4
5 package driver
6
7 import (
8 "fmt"
9 "reflect"
10 "strconv"
11 "time"
12 "uuid"
13 )
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 type ValueConverter interface {
32
33 ConvertValue(v any) (Value, error)
34 }
35
36
37
38
39
40
41
42
43
44 type Valuer interface {
45
46
47 Value() (Value, error)
48 }
49
50
51
52
53
54
55
56
57
58
59
60 var Bool boolType
61
62 type boolType struct{}
63
64 var _ ValueConverter = boolType{}
65
66 func (boolType) String() string { return "Bool" }
67
68 func (boolType) ConvertValue(src any) (Value, error) {
69 switch s := src.(type) {
70 case bool:
71 return s, nil
72 case string:
73 b, err := strconv.ParseBool(s)
74 if err != nil {
75 return nil, fmt.Errorf("sql/driver: couldn't convert %q into type bool", s)
76 }
77 return b, nil
78 case []byte:
79 b, err := strconv.ParseBool(string(s))
80 if err != nil {
81 return nil, fmt.Errorf("sql/driver: couldn't convert %q into type bool", s)
82 }
83 return b, nil
84 }
85
86 sv := reflect.ValueOf(src)
87 switch sv.Kind() {
88 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
89 iv := sv.Int()
90 if iv == 1 || iv == 0 {
91 return iv == 1, nil
92 }
93 return nil, fmt.Errorf("sql/driver: couldn't convert %d into type bool", iv)
94 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
95 uv := sv.Uint()
96 if uv == 1 || uv == 0 {
97 return uv == 1, nil
98 }
99 return nil, fmt.Errorf("sql/driver: couldn't convert %d into type bool", uv)
100 }
101
102 return nil, fmt.Errorf("sql/driver: couldn't convert %v (%T) into type bool", src, src)
103 }
104
105
106
107 var Int32 int32Type
108
109 type int32Type struct{}
110
111 var _ ValueConverter = int32Type{}
112
113 func (int32Type) ConvertValue(v any) (Value, error) {
114 rv := reflect.ValueOf(v)
115 switch rv.Kind() {
116 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
117 i64 := rv.Int()
118 if i64 > (1<<31)-1 || i64 < -(1<<31) {
119 return nil, fmt.Errorf("sql/driver: value %d overflows int32", v)
120 }
121 return i64, nil
122 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
123 u64 := rv.Uint()
124 if u64 > (1<<31)-1 {
125 return nil, fmt.Errorf("sql/driver: value %d overflows int32", v)
126 }
127 return int64(u64), nil
128 case reflect.String:
129 i, err := strconv.Atoi(rv.String())
130 if err != nil {
131 return nil, fmt.Errorf("sql/driver: value %q can't be converted to int32", v)
132 }
133 return int64(i), nil
134 }
135 return nil, fmt.Errorf("sql/driver: unsupported value %v (type %T) converting to int32", v, v)
136 }
137
138
139
140
141
142 var String stringType
143
144 type stringType struct{}
145
146 func (stringType) ConvertValue(v any) (Value, error) {
147 switch v.(type) {
148 case string, []byte:
149 return v, nil
150 }
151 return fmt.Sprintf("%v", v), nil
152 }
153
154
155
156 type Null struct {
157 Converter ValueConverter
158 }
159
160 func (n Null) ConvertValue(v any) (Value, error) {
161 if v == nil {
162 return nil, nil
163 }
164 return n.Converter.ConvertValue(v)
165 }
166
167
168
169 type NotNull struct {
170 Converter ValueConverter
171 }
172
173 func (n NotNull) ConvertValue(v any) (Value, error) {
174 if v == nil {
175 return nil, fmt.Errorf("nil value not allowed")
176 }
177 return n.Converter.ConvertValue(v)
178 }
179
180
181 func IsValue(v any) bool {
182 if v == nil {
183 return true
184 }
185 switch v.(type) {
186 case []byte, bool, float64, int64, string, time.Time:
187 return true
188 case decimalDecompose:
189 return true
190 }
191 return false
192 }
193
194
195
196 func IsScanValue(v any) bool {
197 return IsValue(v)
198 }
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214 var DefaultParameterConverter defaultConverter
215
216 type defaultConverter struct{}
217
218 var _ ValueConverter = defaultConverter{}
219
220 var valuerReflectType = reflect.TypeFor[Valuer]()
221
222
223
224
225
226
227
228
229
230
231
232
233 func callValuerValue(vr Valuer) (v Value, err error) {
234 if rv := reflect.ValueOf(vr); rv.Kind() == reflect.Pointer &&
235 rv.IsNil() &&
236 rv.Type().Elem().Implements(valuerReflectType) {
237 return nil, nil
238 }
239 return vr.Value()
240 }
241
242 func (defaultConverter) ConvertValue(v any) (Value, error) {
243 if IsValue(v) {
244 return v, nil
245 }
246
247 switch vr := v.(type) {
248 case Valuer:
249 sv, err := callValuerValue(vr)
250 if err != nil {
251 return nil, err
252 }
253 if !IsValue(sv) {
254 return nil, fmt.Errorf("non-Value type %T returned from Value", sv)
255 }
256 return sv, nil
257
258
259 case decimalDecompose:
260 return vr, nil
261
262 case uuid.UUID:
263 return vr.String(), nil
264 }
265
266 rv := reflect.ValueOf(v)
267 switch rv.Kind() {
268 case reflect.Pointer:
269
270 if rv.IsNil() {
271 return nil, nil
272 } else {
273 return defaultConverter{}.ConvertValue(rv.Elem().Interface())
274 }
275 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
276 return rv.Int(), nil
277 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32:
278 return int64(rv.Uint()), nil
279 case reflect.Uint64:
280 u64 := rv.Uint()
281 if u64 >= 1<<63 {
282 return nil, fmt.Errorf("uint64 values with high bit set are not supported")
283 }
284 return int64(u64), nil
285 case reflect.Float32, reflect.Float64:
286 return rv.Float(), nil
287 case reflect.Bool:
288 return rv.Bool(), nil
289 case reflect.Slice:
290 ek := rv.Type().Elem().Kind()
291 if ek == reflect.Uint8 {
292 return rv.Bytes(), nil
293 }
294 return nil, fmt.Errorf("unsupported type %T, a slice of %s", v, ek)
295 case reflect.String:
296 return rv.String(), nil
297 }
298 return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind())
299 }
300
301 type decimalDecompose interface {
302
303
304
305 Decompose(buf []byte) (form byte, negative bool, coefficient []byte, exponent int32)
306 }
307
View as plain text