1 package pgtype
2
3 import (
4 "database/sql"
5 "database/sql/driver"
6 "errors"
7 "fmt"
8 "net"
9 "net/netip"
10 "reflect"
11 "time"
12 )
13
14
15 const (
16 BoolOID = 16
17 ByteaOID = 17
18 QCharOID = 18
19 NameOID = 19
20 Int8OID = 20
21 Int2OID = 21
22 Int4OID = 23
23 TextOID = 25
24 OIDOID = 26
25 TIDOID = 27
26 XIDOID = 28
27 CIDOID = 29
28 JSONOID = 114
29 JSONArrayOID = 199
30 PointOID = 600
31 LsegOID = 601
32 PathOID = 602
33 BoxOID = 603
34 PolygonOID = 604
35 LineOID = 628
36 LineArrayOID = 629
37 CIDROID = 650
38 CIDRArrayOID = 651
39 Float4OID = 700
40 Float8OID = 701
41 CircleOID = 718
42 CircleArrayOID = 719
43 UnknownOID = 705
44 MacaddrOID = 829
45 InetOID = 869
46 BoolArrayOID = 1000
47 QCharArrayOID = 1002
48 NameArrayOID = 1003
49 Int2ArrayOID = 1005
50 Int4ArrayOID = 1007
51 TextArrayOID = 1009
52 TIDArrayOID = 1010
53 ByteaArrayOID = 1001
54 XIDArrayOID = 1011
55 CIDArrayOID = 1012
56 BPCharArrayOID = 1014
57 VarcharArrayOID = 1015
58 Int8ArrayOID = 1016
59 PointArrayOID = 1017
60 LsegArrayOID = 1018
61 PathArrayOID = 1019
62 BoxArrayOID = 1020
63 Float4ArrayOID = 1021
64 Float8ArrayOID = 1022
65 PolygonArrayOID = 1027
66 OIDArrayOID = 1028
67 ACLItemOID = 1033
68 ACLItemArrayOID = 1034
69 MacaddrArrayOID = 1040
70 InetArrayOID = 1041
71 BPCharOID = 1042
72 VarcharOID = 1043
73 DateOID = 1082
74 TimeOID = 1083
75 TimestampOID = 1114
76 TimestampArrayOID = 1115
77 DateArrayOID = 1182
78 TimeArrayOID = 1183
79 TimestamptzOID = 1184
80 TimestamptzArrayOID = 1185
81 IntervalOID = 1186
82 IntervalArrayOID = 1187
83 NumericArrayOID = 1231
84 TimetzOID = 1266
85 TimetzArrayOID = 1270
86 BitOID = 1560
87 BitArrayOID = 1561
88 VarbitOID = 1562
89 VarbitArrayOID = 1563
90 NumericOID = 1700
91 RecordOID = 2249
92 RecordArrayOID = 2287
93 UUIDOID = 2950
94 UUIDArrayOID = 2951
95 JSONBOID = 3802
96 JSONBArrayOID = 3807
97 DaterangeOID = 3912
98 DaterangeArrayOID = 3913
99 Int4rangeOID = 3904
100 Int4rangeArrayOID = 3905
101 NumrangeOID = 3906
102 NumrangeArrayOID = 3907
103 TsrangeOID = 3908
104 TsrangeArrayOID = 3909
105 TstzrangeOID = 3910
106 TstzrangeArrayOID = 3911
107 Int8rangeOID = 3926
108 Int8rangeArrayOID = 3927
109 JSONPathOID = 4072
110 JSONPathArrayOID = 4073
111 Int4multirangeOID = 4451
112 NummultirangeOID = 4532
113 TsmultirangeOID = 4533
114 TstzmultirangeOID = 4534
115 DatemultirangeOID = 4535
116 Int8multirangeOID = 4536
117 Int4multirangeArrayOID = 6150
118 NummultirangeArrayOID = 6151
119 TsmultirangeArrayOID = 6152
120 TstzmultirangeArrayOID = 6153
121 DatemultirangeArrayOID = 6155
122 Int8multirangeArrayOID = 6157
123 )
124
125 type InfinityModifier int8
126
127 const (
128 Infinity InfinityModifier = 1
129 Finite InfinityModifier = 0
130 NegativeInfinity InfinityModifier = -Infinity
131 )
132
133 func (im InfinityModifier) String() string {
134 switch im {
135 case Finite:
136 return "finite"
137 case Infinity:
138 return "infinity"
139 case NegativeInfinity:
140 return "-infinity"
141 default:
142 return "invalid"
143 }
144 }
145
146
147 const (
148 TextFormatCode = 0
149 BinaryFormatCode = 1
150 )
151
152
153 type Codec interface {
154
155 FormatSupported(int16) bool
156
157
158 PreferredFormat() int16
159
160
161
162 PlanEncode(m *Map, oid uint32, format int16, value any) EncodePlan
163
164
165
166 PlanScan(m *Map, oid uint32, format int16, target any) ScanPlan
167
168
169 DecodeDatabaseSQLValue(m *Map, oid uint32, format int16, src []byte) (driver.Value, error)
170
171
172 DecodeValue(m *Map, oid uint32, format int16, src []byte) (any, error)
173 }
174
175 type nullAssignmentError struct {
176 dst any
177 }
178
179 func (e *nullAssignmentError) Error() string {
180 return fmt.Sprintf("cannot assign NULL to %T", e.dst)
181 }
182
183
184 type Type struct {
185 Codec Codec
186 Name string
187 OID uint32
188 }
189
190
191
192 type Map struct {
193 oidToType map[uint32]*Type
194 nameToType map[string]*Type
195 reflectTypeToName map[reflect.Type]string
196 oidToFormatCode map[uint32]int16
197
198 reflectTypeToType map[reflect.Type]*Type
199
200 memoizedScanPlans map[uint32]map[reflect.Type][2]ScanPlan
201 memoizedEncodePlans map[uint32]map[reflect.Type][2]EncodePlan
202
203
204
205
206
207 TryWrapEncodePlanFuncs []TryWrapEncodePlanFunc
208
209
210
211
212
213 TryWrapScanPlanFuncs []TryWrapScanPlanFunc
214 }
215
216 func NewMap() *Map {
217 defaultMapInitOnce.Do(initDefaultMap)
218
219 return &Map{
220 oidToType: make(map[uint32]*Type),
221 nameToType: make(map[string]*Type),
222 reflectTypeToName: make(map[reflect.Type]string),
223 oidToFormatCode: make(map[uint32]int16),
224
225 memoizedScanPlans: make(map[uint32]map[reflect.Type][2]ScanPlan),
226 memoizedEncodePlans: make(map[uint32]map[reflect.Type][2]EncodePlan),
227
228 TryWrapEncodePlanFuncs: []TryWrapEncodePlanFunc{
229 TryWrapDerefPointerEncodePlan,
230 TryWrapBuiltinTypeEncodePlan,
231 TryWrapFindUnderlyingTypeEncodePlan,
232 TryWrapStructEncodePlan,
233 TryWrapSliceEncodePlan,
234 TryWrapMultiDimSliceEncodePlan,
235 TryWrapArrayEncodePlan,
236 },
237
238 TryWrapScanPlanFuncs: []TryWrapScanPlanFunc{
239 TryPointerPointerScanPlan,
240 TryWrapBuiltinTypeScanPlan,
241 TryFindUnderlyingTypeScanPlan,
242 TryWrapStructScanPlan,
243 TryWrapPtrSliceScanPlan,
244 TryWrapPtrMultiDimSliceScanPlan,
245 TryWrapPtrArrayScanPlan,
246 },
247 }
248 }
249
250
251 func (m *Map) RegisterType(t *Type) {
252 m.oidToType[t.OID] = t
253 m.nameToType[t.Name] = t
254 m.oidToFormatCode[t.OID] = t.Codec.PreferredFormat()
255
256
257 m.reflectTypeToType = nil
258 for k := range m.memoizedScanPlans {
259 delete(m.memoizedScanPlans, k)
260 }
261 for k := range m.memoizedEncodePlans {
262 delete(m.memoizedEncodePlans, k)
263 }
264 }
265
266
267
268
269 func (m *Map) RegisterDefaultPgType(value any, name string) {
270 m.reflectTypeToName[reflect.TypeOf(value)] = name
271
272
273 m.reflectTypeToType = nil
274 for k := range m.memoizedScanPlans {
275 delete(m.memoizedScanPlans, k)
276 }
277 for k := range m.memoizedEncodePlans {
278 delete(m.memoizedEncodePlans, k)
279 }
280 }
281
282
283 func (m *Map) TypeForOID(oid uint32) (*Type, bool) {
284 if dt, ok := m.oidToType[oid]; ok {
285 return dt, true
286 }
287
288 dt, ok := defaultMap.oidToType[oid]
289 return dt, ok
290 }
291
292
293 func (m *Map) TypeForName(name string) (*Type, bool) {
294 if dt, ok := m.nameToType[name]; ok {
295 return dt, true
296 }
297 dt, ok := defaultMap.nameToType[name]
298 return dt, ok
299 }
300
301 func (m *Map) buildReflectTypeToType() {
302 m.reflectTypeToType = make(map[reflect.Type]*Type)
303
304 for reflectType, name := range m.reflectTypeToName {
305 if dt, ok := m.TypeForName(name); ok {
306 m.reflectTypeToType[reflectType] = dt
307 }
308 }
309 }
310
311
312
313
314 func (m *Map) TypeForValue(v any) (*Type, bool) {
315 if m.reflectTypeToType == nil {
316 m.buildReflectTypeToType()
317 }
318
319 if dt, ok := m.reflectTypeToType[reflect.TypeOf(v)]; ok {
320 return dt, true
321 }
322
323 dt, ok := defaultMap.reflectTypeToType[reflect.TypeOf(v)]
324 return dt, ok
325 }
326
327
328
329 func (m *Map) FormatCodeForOID(oid uint32) int16 {
330 if fc, ok := m.oidToFormatCode[oid]; ok {
331 return fc
332 }
333
334 if fc, ok := defaultMap.oidToFormatCode[oid]; ok {
335 return fc
336 }
337
338 return TextFormatCode
339 }
340
341
342 type EncodePlan interface {
343
344
345
346 Encode(value any, buf []byte) (newBuf []byte, err error)
347 }
348
349
350 type ScanPlan interface {
351
352
353 Scan(src []byte, target any) error
354 }
355
356 type scanPlanCodecSQLScanner struct {
357 c Codec
358 m *Map
359 oid uint32
360 formatCode int16
361 }
362
363 func (plan *scanPlanCodecSQLScanner) Scan(src []byte, dst any) error {
364 value, err := plan.c.DecodeDatabaseSQLValue(plan.m, plan.oid, plan.formatCode, src)
365 if err != nil {
366 return err
367 }
368
369 scanner := dst.(sql.Scanner)
370 return scanner.Scan(value)
371 }
372
373 type scanPlanSQLScanner struct {
374 formatCode int16
375 }
376
377 func (plan *scanPlanSQLScanner) Scan(src []byte, dst any) error {
378 scanner := dst.(sql.Scanner)
379 if src == nil {
380
381
382 return scanner.Scan(nil)
383 } else if plan.formatCode == BinaryFormatCode {
384 return scanner.Scan(src)
385 } else {
386 return scanner.Scan(string(src))
387 }
388 }
389
390 type scanPlanString struct{}
391
392 func (scanPlanString) Scan(src []byte, dst any) error {
393 if src == nil {
394 return fmt.Errorf("cannot scan NULL into %T", dst)
395 }
396
397 p := (dst).(*string)
398 *p = string(src)
399 return nil
400 }
401
402 type scanPlanAnyTextToBytes struct{}
403
404 func (scanPlanAnyTextToBytes) Scan(src []byte, dst any) error {
405 dstBuf := dst.(*[]byte)
406 if src == nil {
407 *dstBuf = nil
408 return nil
409 }
410
411 *dstBuf = make([]byte, len(src))
412 copy(*dstBuf, src)
413 return nil
414 }
415
416 type scanPlanFail struct {
417 m *Map
418 oid uint32
419 formatCode int16
420 }
421
422 func (plan *scanPlanFail) Scan(src []byte, dst any) error {
423
424
425
426
427
428
429 if src == nil {
430
431 for oid := range plan.m.oidToType {
432
433 plan := plan.m.planScan(oid, plan.formatCode, dst)
434 if _, ok := plan.(*scanPlanFail); !ok {
435 return plan.Scan(src, dst)
436 }
437 }
438 for oid := range defaultMap.oidToType {
439 if _, ok := plan.m.oidToType[oid]; !ok {
440 plan := plan.m.planScan(oid, plan.formatCode, dst)
441 if _, ok := plan.(*scanPlanFail); !ok {
442 return plan.Scan(src, dst)
443 }
444 }
445 }
446 }
447
448 var format string
449 switch plan.formatCode {
450 case TextFormatCode:
451 format = "text"
452 case BinaryFormatCode:
453 format = "binary"
454 default:
455 format = fmt.Sprintf("unknown %d", plan.formatCode)
456 }
457
458 var dataTypeName string
459 if t, ok := plan.m.TypeForOID(plan.oid); ok {
460 dataTypeName = t.Name
461 } else {
462 dataTypeName = "unknown type"
463 }
464
465 return fmt.Errorf("cannot scan %s (OID %d) in %v format into %T", dataTypeName, plan.oid, format, dst)
466 }
467
468
469
470
471
472 type TryWrapScanPlanFunc func(target any) (plan WrappedScanPlanNextSetter, nextTarget any, ok bool)
473
474 type pointerPointerScanPlan struct {
475 dstType reflect.Type
476 next ScanPlan
477 }
478
479 func (plan *pointerPointerScanPlan) SetNext(next ScanPlan) { plan.next = next }
480
481 func (plan *pointerPointerScanPlan) Scan(src []byte, dst any) error {
482 el := reflect.ValueOf(dst).Elem()
483 if src == nil {
484 el.Set(reflect.Zero(el.Type()))
485 return nil
486 }
487
488 el.Set(reflect.New(el.Type().Elem()))
489 return plan.next.Scan(src, el.Interface())
490 }
491
492
493
494 func TryPointerPointerScanPlan(target any) (plan WrappedScanPlanNextSetter, nextTarget any, ok bool) {
495 if dstValue := reflect.ValueOf(target); dstValue.Kind() == reflect.Ptr {
496 elemValue := dstValue.Elem()
497 if elemValue.Kind() == reflect.Ptr {
498 plan = &pointerPointerScanPlan{dstType: dstValue.Type()}
499 return plan, reflect.Zero(elemValue.Type()).Interface(), true
500 }
501 }
502
503 return nil, nil, false
504 }
505
506
507 type SkipUnderlyingTypePlanner interface {
508 SkipUnderlyingTypePlan()
509 }
510
511 var elemKindToPointerTypes map[reflect.Kind]reflect.Type = map[reflect.Kind]reflect.Type{
512 reflect.Int: reflect.TypeOf(new(int)),
513 reflect.Int8: reflect.TypeOf(new(int8)),
514 reflect.Int16: reflect.TypeOf(new(int16)),
515 reflect.Int32: reflect.TypeOf(new(int32)),
516 reflect.Int64: reflect.TypeOf(new(int64)),
517 reflect.Uint: reflect.TypeOf(new(uint)),
518 reflect.Uint8: reflect.TypeOf(new(uint8)),
519 reflect.Uint16: reflect.TypeOf(new(uint16)),
520 reflect.Uint32: reflect.TypeOf(new(uint32)),
521 reflect.Uint64: reflect.TypeOf(new(uint64)),
522 reflect.Float32: reflect.TypeOf(new(float32)),
523 reflect.Float64: reflect.TypeOf(new(float64)),
524 reflect.String: reflect.TypeOf(new(string)),
525 reflect.Bool: reflect.TypeOf(new(bool)),
526 }
527
528 type underlyingTypeScanPlan struct {
529 dstType reflect.Type
530 nextDstType reflect.Type
531 next ScanPlan
532 }
533
534 func (plan *underlyingTypeScanPlan) SetNext(next ScanPlan) { plan.next = next }
535
536 func (plan *underlyingTypeScanPlan) Scan(src []byte, dst any) error {
537 return plan.next.Scan(src, reflect.ValueOf(dst).Convert(plan.nextDstType).Interface())
538 }
539
540
541
542 func TryFindUnderlyingTypeScanPlan(dst any) (plan WrappedScanPlanNextSetter, nextDst any, ok bool) {
543 if _, ok := dst.(SkipUnderlyingTypePlanner); ok {
544 return nil, nil, false
545 }
546
547 dstValue := reflect.ValueOf(dst)
548
549 if dstValue.Kind() == reflect.Ptr {
550 var elemValue reflect.Value
551 if dstValue.IsNil() {
552 elemValue = reflect.New(dstValue.Type().Elem()).Elem()
553 } else {
554 elemValue = dstValue.Elem()
555 }
556 nextDstType := elemKindToPointerTypes[elemValue.Kind()]
557 if nextDstType == nil && elemValue.Kind() == reflect.Slice {
558 if elemValue.Type().Elem().Kind() == reflect.Uint8 {
559 var v *[]byte
560 nextDstType = reflect.TypeOf(v)
561 }
562 }
563
564 if nextDstType != nil && dstValue.Type() != nextDstType && dstValue.CanConvert(nextDstType) {
565 return &underlyingTypeScanPlan{dstType: dstValue.Type(), nextDstType: nextDstType}, dstValue.Convert(nextDstType).Interface(), true
566 }
567
568 }
569
570 return nil, nil, false
571 }
572
573 type WrappedScanPlanNextSetter interface {
574 SetNext(ScanPlan)
575 ScanPlan
576 }
577
578
579
580
581 func TryWrapBuiltinTypeScanPlan(target any) (plan WrappedScanPlanNextSetter, nextDst any, ok bool) {
582 switch target := target.(type) {
583 case *int8:
584 return &wrapInt8ScanPlan{}, (*int8Wrapper)(target), true
585 case *int16:
586 return &wrapInt16ScanPlan{}, (*int16Wrapper)(target), true
587 case *int32:
588 return &wrapInt32ScanPlan{}, (*int32Wrapper)(target), true
589 case *int64:
590 return &wrapInt64ScanPlan{}, (*int64Wrapper)(target), true
591 case *int:
592 return &wrapIntScanPlan{}, (*intWrapper)(target), true
593 case *uint8:
594 return &wrapUint8ScanPlan{}, (*uint8Wrapper)(target), true
595 case *uint16:
596 return &wrapUint16ScanPlan{}, (*uint16Wrapper)(target), true
597 case *uint32:
598 return &wrapUint32ScanPlan{}, (*uint32Wrapper)(target), true
599 case *uint64:
600 return &wrapUint64ScanPlan{}, (*uint64Wrapper)(target), true
601 case *uint:
602 return &wrapUintScanPlan{}, (*uintWrapper)(target), true
603 case *float32:
604 return &wrapFloat32ScanPlan{}, (*float32Wrapper)(target), true
605 case *float64:
606 return &wrapFloat64ScanPlan{}, (*float64Wrapper)(target), true
607 case *string:
608 return &wrapStringScanPlan{}, (*stringWrapper)(target), true
609 case *time.Time:
610 return &wrapTimeScanPlan{}, (*timeWrapper)(target), true
611 case *time.Duration:
612 return &wrapDurationScanPlan{}, (*durationWrapper)(target), true
613 case *net.IPNet:
614 return &wrapNetIPNetScanPlan{}, (*netIPNetWrapper)(target), true
615 case *net.IP:
616 return &wrapNetIPScanPlan{}, (*netIPWrapper)(target), true
617 case *netip.Prefix:
618 return &wrapNetipPrefixScanPlan{}, (*netipPrefixWrapper)(target), true
619 case *netip.Addr:
620 return &wrapNetipAddrScanPlan{}, (*netipAddrWrapper)(target), true
621 case *map[string]*string:
622 return &wrapMapStringToPointerStringScanPlan{}, (*mapStringToPointerStringWrapper)(target), true
623 case *map[string]string:
624 return &wrapMapStringToStringScanPlan{}, (*mapStringToStringWrapper)(target), true
625 case *[16]byte:
626 return &wrapByte16ScanPlan{}, (*byte16Wrapper)(target), true
627 case *[]byte:
628 return &wrapByteSliceScanPlan{}, (*byteSliceWrapper)(target), true
629 }
630
631 return nil, nil, false
632 }
633
634 type wrapInt8ScanPlan struct {
635 next ScanPlan
636 }
637
638 func (plan *wrapInt8ScanPlan) SetNext(next ScanPlan) { plan.next = next }
639
640 func (plan *wrapInt8ScanPlan) Scan(src []byte, dst any) error {
641 return plan.next.Scan(src, (*int8Wrapper)(dst.(*int8)))
642 }
643
644 type wrapInt16ScanPlan struct {
645 next ScanPlan
646 }
647
648 func (plan *wrapInt16ScanPlan) SetNext(next ScanPlan) { plan.next = next }
649
650 func (plan *wrapInt16ScanPlan) Scan(src []byte, dst any) error {
651 return plan.next.Scan(src, (*int16Wrapper)(dst.(*int16)))
652 }
653
654 type wrapInt32ScanPlan struct {
655 next ScanPlan
656 }
657
658 func (plan *wrapInt32ScanPlan) SetNext(next ScanPlan) { plan.next = next }
659
660 func (plan *wrapInt32ScanPlan) Scan(src []byte, dst any) error {
661 return plan.next.Scan(src, (*int32Wrapper)(dst.(*int32)))
662 }
663
664 type wrapInt64ScanPlan struct {
665 next ScanPlan
666 }
667
668 func (plan *wrapInt64ScanPlan) SetNext(next ScanPlan) { plan.next = next }
669
670 func (plan *wrapInt64ScanPlan) Scan(src []byte, dst any) error {
671 return plan.next.Scan(src, (*int64Wrapper)(dst.(*int64)))
672 }
673
674 type wrapIntScanPlan struct {
675 next ScanPlan
676 }
677
678 func (plan *wrapIntScanPlan) SetNext(next ScanPlan) { plan.next = next }
679
680 func (plan *wrapIntScanPlan) Scan(src []byte, dst any) error {
681 return plan.next.Scan(src, (*intWrapper)(dst.(*int)))
682 }
683
684 type wrapUint8ScanPlan struct {
685 next ScanPlan
686 }
687
688 func (plan *wrapUint8ScanPlan) SetNext(next ScanPlan) { plan.next = next }
689
690 func (plan *wrapUint8ScanPlan) Scan(src []byte, dst any) error {
691 return plan.next.Scan(src, (*uint8Wrapper)(dst.(*uint8)))
692 }
693
694 type wrapUint16ScanPlan struct {
695 next ScanPlan
696 }
697
698 func (plan *wrapUint16ScanPlan) SetNext(next ScanPlan) { plan.next = next }
699
700 func (plan *wrapUint16ScanPlan) Scan(src []byte, dst any) error {
701 return plan.next.Scan(src, (*uint16Wrapper)(dst.(*uint16)))
702 }
703
704 type wrapUint32ScanPlan struct {
705 next ScanPlan
706 }
707
708 func (plan *wrapUint32ScanPlan) SetNext(next ScanPlan) { plan.next = next }
709
710 func (plan *wrapUint32ScanPlan) Scan(src []byte, dst any) error {
711 return plan.next.Scan(src, (*uint32Wrapper)(dst.(*uint32)))
712 }
713
714 type wrapUint64ScanPlan struct {
715 next ScanPlan
716 }
717
718 func (plan *wrapUint64ScanPlan) SetNext(next ScanPlan) { plan.next = next }
719
720 func (plan *wrapUint64ScanPlan) Scan(src []byte, dst any) error {
721 return plan.next.Scan(src, (*uint64Wrapper)(dst.(*uint64)))
722 }
723
724 type wrapUintScanPlan struct {
725 next ScanPlan
726 }
727
728 func (plan *wrapUintScanPlan) SetNext(next ScanPlan) { plan.next = next }
729
730 func (plan *wrapUintScanPlan) Scan(src []byte, dst any) error {
731 return plan.next.Scan(src, (*uintWrapper)(dst.(*uint)))
732 }
733
734 type wrapFloat32ScanPlan struct {
735 next ScanPlan
736 }
737
738 func (plan *wrapFloat32ScanPlan) SetNext(next ScanPlan) { plan.next = next }
739
740 func (plan *wrapFloat32ScanPlan) Scan(src []byte, dst any) error {
741 return plan.next.Scan(src, (*float32Wrapper)(dst.(*float32)))
742 }
743
744 type wrapFloat64ScanPlan struct {
745 next ScanPlan
746 }
747
748 func (plan *wrapFloat64ScanPlan) SetNext(next ScanPlan) { plan.next = next }
749
750 func (plan *wrapFloat64ScanPlan) Scan(src []byte, dst any) error {
751 return plan.next.Scan(src, (*float64Wrapper)(dst.(*float64)))
752 }
753
754 type wrapStringScanPlan struct {
755 next ScanPlan
756 }
757
758 func (plan *wrapStringScanPlan) SetNext(next ScanPlan) { plan.next = next }
759
760 func (plan *wrapStringScanPlan) Scan(src []byte, dst any) error {
761 return plan.next.Scan(src, (*stringWrapper)(dst.(*string)))
762 }
763
764 type wrapTimeScanPlan struct {
765 next ScanPlan
766 }
767
768 func (plan *wrapTimeScanPlan) SetNext(next ScanPlan) { plan.next = next }
769
770 func (plan *wrapTimeScanPlan) Scan(src []byte, dst any) error {
771 return plan.next.Scan(src, (*timeWrapper)(dst.(*time.Time)))
772 }
773
774 type wrapDurationScanPlan struct {
775 next ScanPlan
776 }
777
778 func (plan *wrapDurationScanPlan) SetNext(next ScanPlan) { plan.next = next }
779
780 func (plan *wrapDurationScanPlan) Scan(src []byte, dst any) error {
781 return plan.next.Scan(src, (*durationWrapper)(dst.(*time.Duration)))
782 }
783
784 type wrapNetIPNetScanPlan struct {
785 next ScanPlan
786 }
787
788 func (plan *wrapNetIPNetScanPlan) SetNext(next ScanPlan) { plan.next = next }
789
790 func (plan *wrapNetIPNetScanPlan) Scan(src []byte, dst any) error {
791 return plan.next.Scan(src, (*netIPNetWrapper)(dst.(*net.IPNet)))
792 }
793
794 type wrapNetIPScanPlan struct {
795 next ScanPlan
796 }
797
798 func (plan *wrapNetIPScanPlan) SetNext(next ScanPlan) { plan.next = next }
799
800 func (plan *wrapNetIPScanPlan) Scan(src []byte, dst any) error {
801 return plan.next.Scan(src, (*netIPWrapper)(dst.(*net.IP)))
802 }
803
804 type wrapNetipPrefixScanPlan struct {
805 next ScanPlan
806 }
807
808 func (plan *wrapNetipPrefixScanPlan) SetNext(next ScanPlan) { plan.next = next }
809
810 func (plan *wrapNetipPrefixScanPlan) Scan(src []byte, dst any) error {
811 return plan.next.Scan(src, (*netipPrefixWrapper)(dst.(*netip.Prefix)))
812 }
813
814 type wrapNetipAddrScanPlan struct {
815 next ScanPlan
816 }
817
818 func (plan *wrapNetipAddrScanPlan) SetNext(next ScanPlan) { plan.next = next }
819
820 func (plan *wrapNetipAddrScanPlan) Scan(src []byte, dst any) error {
821 return plan.next.Scan(src, (*netipAddrWrapper)(dst.(*netip.Addr)))
822 }
823
824 type wrapMapStringToPointerStringScanPlan struct {
825 next ScanPlan
826 }
827
828 func (plan *wrapMapStringToPointerStringScanPlan) SetNext(next ScanPlan) { plan.next = next }
829
830 func (plan *wrapMapStringToPointerStringScanPlan) Scan(src []byte, dst any) error {
831 return plan.next.Scan(src, (*mapStringToPointerStringWrapper)(dst.(*map[string]*string)))
832 }
833
834 type wrapMapStringToStringScanPlan struct {
835 next ScanPlan
836 }
837
838 func (plan *wrapMapStringToStringScanPlan) SetNext(next ScanPlan) { plan.next = next }
839
840 func (plan *wrapMapStringToStringScanPlan) Scan(src []byte, dst any) error {
841 return plan.next.Scan(src, (*mapStringToStringWrapper)(dst.(*map[string]string)))
842 }
843
844 type wrapByte16ScanPlan struct {
845 next ScanPlan
846 }
847
848 func (plan *wrapByte16ScanPlan) SetNext(next ScanPlan) { plan.next = next }
849
850 func (plan *wrapByte16ScanPlan) Scan(src []byte, dst any) error {
851 return plan.next.Scan(src, (*byte16Wrapper)(dst.(*[16]byte)))
852 }
853
854 type wrapByteSliceScanPlan struct {
855 next ScanPlan
856 }
857
858 func (plan *wrapByteSliceScanPlan) SetNext(next ScanPlan) { plan.next = next }
859
860 func (plan *wrapByteSliceScanPlan) Scan(src []byte, dst any) error {
861 return plan.next.Scan(src, (*byteSliceWrapper)(dst.(*[]byte)))
862 }
863
864 type pointerEmptyInterfaceScanPlan struct {
865 codec Codec
866 m *Map
867 oid uint32
868 formatCode int16
869 }
870
871 func (plan *pointerEmptyInterfaceScanPlan) Scan(src []byte, dst any) error {
872 value, err := plan.codec.DecodeValue(plan.m, plan.oid, plan.formatCode, src)
873 if err != nil {
874 return err
875 }
876
877 ptrAny := dst.(*any)
878 *ptrAny = value
879
880 return nil
881 }
882
883
884 func TryWrapStructScanPlan(target any) (plan WrappedScanPlanNextSetter, nextValue any, ok bool) {
885 targetValue := reflect.ValueOf(target)
886 if targetValue.Kind() != reflect.Ptr {
887 return nil, nil, false
888 }
889
890 var targetElemValue reflect.Value
891 if targetValue.IsNil() {
892 targetElemValue = reflect.Zero(targetValue.Type().Elem())
893 } else {
894 targetElemValue = targetValue.Elem()
895 }
896 targetElemType := targetElemValue.Type()
897
898 if targetElemType.Kind() == reflect.Struct {
899 exportedFields := getExportedFieldValues(targetElemValue)
900 if len(exportedFields) == 0 {
901 return nil, nil, false
902 }
903
904 w := ptrStructWrapper{
905 s: target,
906 exportedFields: exportedFields,
907 }
908 return &wrapAnyPtrStructScanPlan{}, &w, true
909 }
910
911 return nil, nil, false
912 }
913
914 type wrapAnyPtrStructScanPlan struct {
915 next ScanPlan
916 }
917
918 func (plan *wrapAnyPtrStructScanPlan) SetNext(next ScanPlan) { plan.next = next }
919
920 func (plan *wrapAnyPtrStructScanPlan) Scan(src []byte, target any) error {
921 w := ptrStructWrapper{
922 s: target,
923 exportedFields: getExportedFieldValues(reflect.ValueOf(target).Elem()),
924 }
925
926 return plan.next.Scan(src, &w)
927 }
928
929
930 func TryWrapPtrSliceScanPlan(target any) (plan WrappedScanPlanNextSetter, nextValue any, ok bool) {
931
932 switch target := target.(type) {
933 case *[]int16:
934 return &wrapPtrSliceScanPlan[int16]{}, (*FlatArray[int16])(target), true
935 case *[]int32:
936 return &wrapPtrSliceScanPlan[int32]{}, (*FlatArray[int32])(target), true
937 case *[]int64:
938 return &wrapPtrSliceScanPlan[int64]{}, (*FlatArray[int64])(target), true
939 case *[]float32:
940 return &wrapPtrSliceScanPlan[float32]{}, (*FlatArray[float32])(target), true
941 case *[]float64:
942 return &wrapPtrSliceScanPlan[float64]{}, (*FlatArray[float64])(target), true
943 case *[]string:
944 return &wrapPtrSliceScanPlan[string]{}, (*FlatArray[string])(target), true
945 case *[]time.Time:
946 return &wrapPtrSliceScanPlan[time.Time]{}, (*FlatArray[time.Time])(target), true
947 }
948
949 targetType := reflect.TypeOf(target)
950 if targetType.Kind() != reflect.Ptr {
951 return nil, nil, false
952 }
953
954 targetElemType := targetType.Elem()
955
956 if targetElemType.Kind() == reflect.Slice {
957 slice := reflect.New(targetElemType).Elem()
958 return &wrapPtrSliceReflectScanPlan{}, &anySliceArrayReflect{slice: slice}, true
959 }
960 return nil, nil, false
961 }
962
963 type wrapPtrSliceScanPlan[T any] struct {
964 next ScanPlan
965 }
966
967 func (plan *wrapPtrSliceScanPlan[T]) SetNext(next ScanPlan) { plan.next = next }
968
969 func (plan *wrapPtrSliceScanPlan[T]) Scan(src []byte, target any) error {
970 return plan.next.Scan(src, (*FlatArray[T])(target.(*[]T)))
971 }
972
973 type wrapPtrSliceReflectScanPlan struct {
974 next ScanPlan
975 }
976
977 func (plan *wrapPtrSliceReflectScanPlan) SetNext(next ScanPlan) { plan.next = next }
978
979 func (plan *wrapPtrSliceReflectScanPlan) Scan(src []byte, target any) error {
980 return plan.next.Scan(src, &anySliceArrayReflect{slice: reflect.ValueOf(target).Elem()})
981 }
982
983
984 func TryWrapPtrMultiDimSliceScanPlan(target any) (plan WrappedScanPlanNextSetter, nextValue any, ok bool) {
985 targetValue := reflect.ValueOf(target)
986 if targetValue.Kind() != reflect.Ptr {
987 return nil, nil, false
988 }
989
990 targetElemValue := targetValue.Elem()
991
992 if targetElemValue.Kind() == reflect.Slice {
993 elemElemKind := targetElemValue.Type().Elem().Kind()
994 if elemElemKind == reflect.Slice {
995 if !isRagged(targetElemValue) {
996 return &wrapPtrMultiDimSliceScanPlan{}, &anyMultiDimSliceArray{slice: targetValue.Elem()}, true
997 }
998 }
999 }
1000
1001 return nil, nil, false
1002 }
1003
1004 type wrapPtrMultiDimSliceScanPlan struct {
1005 next ScanPlan
1006 }
1007
1008 func (plan *wrapPtrMultiDimSliceScanPlan) SetNext(next ScanPlan) { plan.next = next }
1009
1010 func (plan *wrapPtrMultiDimSliceScanPlan) Scan(src []byte, target any) error {
1011 return plan.next.Scan(src, &anyMultiDimSliceArray{slice: reflect.ValueOf(target).Elem()})
1012 }
1013
1014
1015 func TryWrapPtrArrayScanPlan(target any) (plan WrappedScanPlanNextSetter, nextValue any, ok bool) {
1016 targetValue := reflect.ValueOf(target)
1017 if targetValue.Kind() != reflect.Ptr {
1018 return nil, nil, false
1019 }
1020
1021 targetElemValue := targetValue.Elem()
1022
1023 if targetElemValue.Kind() == reflect.Array {
1024 return &wrapPtrArrayReflectScanPlan{}, &anyArrayArrayReflect{array: targetElemValue}, true
1025 }
1026 return nil, nil, false
1027 }
1028
1029 type wrapPtrArrayReflectScanPlan struct {
1030 next ScanPlan
1031 }
1032
1033 func (plan *wrapPtrArrayReflectScanPlan) SetNext(next ScanPlan) { plan.next = next }
1034
1035 func (plan *wrapPtrArrayReflectScanPlan) Scan(src []byte, target any) error {
1036 return plan.next.Scan(src, &anyArrayArrayReflect{array: reflect.ValueOf(target).Elem()})
1037 }
1038
1039
1040 func (m *Map) PlanScan(oid uint32, formatCode int16, target any) ScanPlan {
1041 oidMemo := m.memoizedScanPlans[oid]
1042 if oidMemo == nil {
1043 oidMemo = make(map[reflect.Type][2]ScanPlan)
1044 m.memoizedScanPlans[oid] = oidMemo
1045 }
1046 targetReflectType := reflect.TypeOf(target)
1047 typeMemo := oidMemo[targetReflectType]
1048 plan := typeMemo[formatCode]
1049 if plan == nil {
1050 plan = m.planScan(oid, formatCode, target)
1051 typeMemo[formatCode] = plan
1052 oidMemo[targetReflectType] = typeMemo
1053 }
1054
1055 return plan
1056 }
1057
1058 func (m *Map) planScan(oid uint32, formatCode int16, target any) ScanPlan {
1059 if target == nil {
1060 return &scanPlanFail{m: m, oid: oid, formatCode: formatCode}
1061 }
1062
1063 if _, ok := target.(*UndecodedBytes); ok {
1064 return scanPlanAnyToUndecodedBytes{}
1065 }
1066
1067 switch formatCode {
1068 case BinaryFormatCode:
1069 switch target.(type) {
1070 case *string:
1071 switch oid {
1072 case TextOID, VarcharOID:
1073 return scanPlanString{}
1074 }
1075 }
1076 case TextFormatCode:
1077 switch target.(type) {
1078 case *string:
1079 return scanPlanString{}
1080 case *[]byte:
1081 if oid != ByteaOID {
1082 return scanPlanAnyTextToBytes{}
1083 }
1084 case TextScanner:
1085 return scanPlanTextAnyToTextScanner{}
1086 }
1087 }
1088
1089 var dt *Type
1090
1091 if dataType, ok := m.TypeForOID(oid); ok {
1092 dt = dataType
1093 } else if dataType, ok := m.TypeForValue(target); ok {
1094 dt = dataType
1095 oid = dt.OID
1096 }
1097
1098 if dt != nil {
1099 if plan := dt.Codec.PlanScan(m, oid, formatCode, target); plan != nil {
1100 return plan
1101 }
1102 }
1103
1104
1105
1106
1107
1108 if _, ok := target.(sql.Scanner); ok {
1109 if dt == nil {
1110 return &scanPlanSQLScanner{formatCode: formatCode}
1111 } else {
1112 return &scanPlanCodecSQLScanner{c: dt.Codec, m: m, oid: oid, formatCode: formatCode}
1113 }
1114 }
1115
1116 for _, f := range m.TryWrapScanPlanFuncs {
1117 if wrapperPlan, nextDst, ok := f(target); ok {
1118 if nextPlan := m.planScan(oid, formatCode, nextDst); nextPlan != nil {
1119 if _, failed := nextPlan.(*scanPlanFail); !failed {
1120 wrapperPlan.SetNext(nextPlan)
1121 return wrapperPlan
1122 }
1123 }
1124 }
1125 }
1126
1127 if dt != nil {
1128 if _, ok := target.(*any); ok {
1129 return &pointerEmptyInterfaceScanPlan{codec: dt.Codec, m: m, oid: oid, formatCode: formatCode}
1130 }
1131 }
1132
1133 return &scanPlanFail{m: m, oid: oid, formatCode: formatCode}
1134 }
1135
1136 func (m *Map) Scan(oid uint32, formatCode int16, src []byte, dst any) error {
1137 if dst == nil {
1138 return nil
1139 }
1140
1141 plan := m.PlanScan(oid, formatCode, dst)
1142 return plan.Scan(src, dst)
1143 }
1144
1145 var ErrScanTargetTypeChanged = errors.New("scan target type changed")
1146
1147 func codecScan(codec Codec, m *Map, oid uint32, format int16, src []byte, dst any) error {
1148 scanPlan := codec.PlanScan(m, oid, format, dst)
1149 if scanPlan == nil {
1150 return fmt.Errorf("PlanScan did not find a plan")
1151 }
1152 return scanPlan.Scan(src, dst)
1153 }
1154
1155 func codecDecodeToTextFormat(codec Codec, m *Map, oid uint32, format int16, src []byte) (driver.Value, error) {
1156 if src == nil {
1157 return nil, nil
1158 }
1159
1160 if format == TextFormatCode {
1161 return string(src), nil
1162 } else {
1163 value, err := codec.DecodeValue(m, oid, format, src)
1164 if err != nil {
1165 return nil, err
1166 }
1167 buf, err := m.Encode(oid, TextFormatCode, value, nil)
1168 if err != nil {
1169 return nil, err
1170 }
1171 return string(buf), nil
1172 }
1173 }
1174
1175
1176
1177 func (m *Map) PlanEncode(oid uint32, format int16, value any) EncodePlan {
1178 oidMemo := m.memoizedEncodePlans[oid]
1179 if oidMemo == nil {
1180 oidMemo = make(map[reflect.Type][2]EncodePlan)
1181 m.memoizedEncodePlans[oid] = oidMemo
1182 }
1183 targetReflectType := reflect.TypeOf(value)
1184 typeMemo := oidMemo[targetReflectType]
1185 plan := typeMemo[format]
1186 if plan == nil {
1187 plan = m.planEncode(oid, format, value)
1188 typeMemo[format] = plan
1189 oidMemo[targetReflectType] = typeMemo
1190 }
1191
1192 return plan
1193 }
1194
1195 func (m *Map) planEncode(oid uint32, format int16, value any) EncodePlan {
1196 if format == TextFormatCode {
1197 switch value.(type) {
1198 case string:
1199 return encodePlanStringToAnyTextFormat{}
1200 case TextValuer:
1201 return encodePlanTextValuerToAnyTextFormat{}
1202 }
1203 }
1204
1205 var dt *Type
1206 if dataType, ok := m.TypeForOID(oid); ok {
1207 dt = dataType
1208 } else {
1209
1210
1211
1212 if dataType, ok := m.TypeForValue(value); ok {
1213 dt = dataType
1214 oid = dt.OID
1215 }
1216 }
1217
1218 if dt != nil {
1219 if plan := dt.Codec.PlanEncode(m, oid, format, value); plan != nil {
1220 return plan
1221 }
1222 }
1223
1224 for _, f := range m.TryWrapEncodePlanFuncs {
1225 if wrapperPlan, nextValue, ok := f(value); ok {
1226 if nextPlan := m.PlanEncode(oid, format, nextValue); nextPlan != nil {
1227 wrapperPlan.SetNext(nextPlan)
1228 return wrapperPlan
1229 }
1230 }
1231 }
1232
1233 if _, ok := value.(driver.Valuer); ok {
1234 return &encodePlanDriverValuer{m: m, oid: oid, formatCode: format}
1235 }
1236
1237 return nil
1238 }
1239
1240 type encodePlanStringToAnyTextFormat struct{}
1241
1242 func (encodePlanStringToAnyTextFormat) Encode(value any, buf []byte) (newBuf []byte, err error) {
1243 s := value.(string)
1244 return append(buf, s...), nil
1245 }
1246
1247 type encodePlanTextValuerToAnyTextFormat struct{}
1248
1249 func (encodePlanTextValuerToAnyTextFormat) Encode(value any, buf []byte) (newBuf []byte, err error) {
1250 t, err := value.(TextValuer).TextValue()
1251 if err != nil {
1252 return nil, err
1253 }
1254 if !t.Valid {
1255 return nil, nil
1256 }
1257
1258 return append(buf, t.String...), nil
1259 }
1260
1261 type encodePlanDriverValuer struct {
1262 m *Map
1263 oid uint32
1264 formatCode int16
1265 }
1266
1267 func (plan *encodePlanDriverValuer) Encode(value any, buf []byte) (newBuf []byte, err error) {
1268 dv := value.(driver.Valuer)
1269 if dv == nil {
1270 return nil, nil
1271 }
1272 v, err := dv.Value()
1273 if err != nil {
1274 return nil, err
1275 }
1276 if v == nil {
1277 return nil, nil
1278 }
1279
1280 newBuf, err = plan.m.Encode(plan.oid, plan.formatCode, v, buf)
1281 if err == nil {
1282 return newBuf, nil
1283 }
1284
1285 s, ok := v.(string)
1286 if !ok {
1287 return nil, err
1288 }
1289
1290 var scannedValue any
1291 scanErr := plan.m.Scan(plan.oid, TextFormatCode, []byte(s), &scannedValue)
1292 if scanErr != nil {
1293 return nil, err
1294 }
1295
1296
1297 if reflect.TypeOf(value) == reflect.TypeOf(scannedValue) {
1298 return nil, fmt.Errorf("tried to encode %v via encoding to text and scanning but failed due to receiving same type back", value)
1299 }
1300
1301 var err2 error
1302 newBuf, err2 = plan.m.Encode(plan.oid, BinaryFormatCode, scannedValue, buf)
1303 if err2 != nil {
1304 return nil, err
1305 }
1306
1307 return newBuf, nil
1308 }
1309
1310
1311
1312
1313
1314 type TryWrapEncodePlanFunc func(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool)
1315
1316 type derefPointerEncodePlan struct {
1317 next EncodePlan
1318 }
1319
1320 func (plan *derefPointerEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1321
1322 func (plan *derefPointerEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1323 ptr := reflect.ValueOf(value)
1324
1325 if ptr.IsNil() {
1326 return nil, nil
1327 }
1328
1329 return plan.next.Encode(ptr.Elem().Interface(), buf)
1330 }
1331
1332
1333
1334 func TryWrapDerefPointerEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) {
1335 if _, ok := value.(driver.Valuer); ok {
1336 return nil, nil, false
1337 }
1338
1339 if valueType := reflect.TypeOf(value); valueType != nil && valueType.Kind() == reflect.Ptr {
1340 return &derefPointerEncodePlan{}, reflect.New(valueType.Elem()).Elem().Interface(), true
1341 }
1342
1343 return nil, nil, false
1344 }
1345
1346 var kindToTypes map[reflect.Kind]reflect.Type = map[reflect.Kind]reflect.Type{
1347 reflect.Int: reflect.TypeOf(int(0)),
1348 reflect.Int8: reflect.TypeOf(int8(0)),
1349 reflect.Int16: reflect.TypeOf(int16(0)),
1350 reflect.Int32: reflect.TypeOf(int32(0)),
1351 reflect.Int64: reflect.TypeOf(int64(0)),
1352 reflect.Uint: reflect.TypeOf(uint(0)),
1353 reflect.Uint8: reflect.TypeOf(uint8(0)),
1354 reflect.Uint16: reflect.TypeOf(uint16(0)),
1355 reflect.Uint32: reflect.TypeOf(uint32(0)),
1356 reflect.Uint64: reflect.TypeOf(uint64(0)),
1357 reflect.Float32: reflect.TypeOf(float32(0)),
1358 reflect.Float64: reflect.TypeOf(float64(0)),
1359 reflect.String: reflect.TypeOf(""),
1360 reflect.Bool: reflect.TypeOf(false),
1361 }
1362
1363 var byteSliceType = reflect.TypeOf([]byte{})
1364
1365 type underlyingTypeEncodePlan struct {
1366 nextValueType reflect.Type
1367 next EncodePlan
1368 }
1369
1370 func (plan *underlyingTypeEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1371
1372 func (plan *underlyingTypeEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1373 return plan.next.Encode(reflect.ValueOf(value).Convert(plan.nextValueType).Interface(), buf)
1374 }
1375
1376
1377
1378 func TryWrapFindUnderlyingTypeEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) {
1379 if value == nil {
1380 return nil, nil, false
1381 }
1382
1383 if _, ok := value.(driver.Valuer); ok {
1384 return nil, nil, false
1385 }
1386
1387 if _, ok := value.(SkipUnderlyingTypePlanner); ok {
1388 return nil, nil, false
1389 }
1390
1391 refValue := reflect.ValueOf(value)
1392
1393 nextValueType := kindToTypes[refValue.Kind()]
1394 if nextValueType != nil && refValue.Type() != nextValueType {
1395 return &underlyingTypeEncodePlan{nextValueType: nextValueType}, refValue.Convert(nextValueType).Interface(), true
1396 }
1397
1398
1399
1400
1401
1402
1403 if refValue.Type() != byteSliceType && refValue.Type().AssignableTo(byteSliceType) {
1404 return &underlyingTypeEncodePlan{nextValueType: byteSliceType}, refValue.Convert(byteSliceType).Interface(), true
1405 }
1406
1407 return nil, nil, false
1408 }
1409
1410 type WrappedEncodePlanNextSetter interface {
1411 SetNext(EncodePlan)
1412 EncodePlan
1413 }
1414
1415
1416
1417
1418 func TryWrapBuiltinTypeEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) {
1419 if _, ok := value.(driver.Valuer); ok {
1420 return nil, nil, false
1421 }
1422
1423 switch value := value.(type) {
1424 case int8:
1425 return &wrapInt8EncodePlan{}, int8Wrapper(value), true
1426 case int16:
1427 return &wrapInt16EncodePlan{}, int16Wrapper(value), true
1428 case int32:
1429 return &wrapInt32EncodePlan{}, int32Wrapper(value), true
1430 case int64:
1431 return &wrapInt64EncodePlan{}, int64Wrapper(value), true
1432 case int:
1433 return &wrapIntEncodePlan{}, intWrapper(value), true
1434 case uint8:
1435 return &wrapUint8EncodePlan{}, uint8Wrapper(value), true
1436 case uint16:
1437 return &wrapUint16EncodePlan{}, uint16Wrapper(value), true
1438 case uint32:
1439 return &wrapUint32EncodePlan{}, uint32Wrapper(value), true
1440 case uint64:
1441 return &wrapUint64EncodePlan{}, uint64Wrapper(value), true
1442 case uint:
1443 return &wrapUintEncodePlan{}, uintWrapper(value), true
1444 case float32:
1445 return &wrapFloat32EncodePlan{}, float32Wrapper(value), true
1446 case float64:
1447 return &wrapFloat64EncodePlan{}, float64Wrapper(value), true
1448 case string:
1449 return &wrapStringEncodePlan{}, stringWrapper(value), true
1450 case time.Time:
1451 return &wrapTimeEncodePlan{}, timeWrapper(value), true
1452 case time.Duration:
1453 return &wrapDurationEncodePlan{}, durationWrapper(value), true
1454 case net.IPNet:
1455 return &wrapNetIPNetEncodePlan{}, netIPNetWrapper(value), true
1456 case net.IP:
1457 return &wrapNetIPEncodePlan{}, netIPWrapper(value), true
1458 case netip.Prefix:
1459 return &wrapNetipPrefixEncodePlan{}, netipPrefixWrapper(value), true
1460 case netip.Addr:
1461 return &wrapNetipAddrEncodePlan{}, netipAddrWrapper(value), true
1462 case map[string]*string:
1463 return &wrapMapStringToPointerStringEncodePlan{}, mapStringToPointerStringWrapper(value), true
1464 case map[string]string:
1465 return &wrapMapStringToStringEncodePlan{}, mapStringToStringWrapper(value), true
1466 case [16]byte:
1467 return &wrapByte16EncodePlan{}, byte16Wrapper(value), true
1468 case []byte:
1469 return &wrapByteSliceEncodePlan{}, byteSliceWrapper(value), true
1470 case fmt.Stringer:
1471 return &wrapFmtStringerEncodePlan{}, fmtStringerWrapper{value}, true
1472 }
1473
1474 return nil, nil, false
1475 }
1476
1477 type wrapInt8EncodePlan struct {
1478 next EncodePlan
1479 }
1480
1481 func (plan *wrapInt8EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1482
1483 func (plan *wrapInt8EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1484 return plan.next.Encode(int8Wrapper(value.(int8)), buf)
1485 }
1486
1487 type wrapInt16EncodePlan struct {
1488 next EncodePlan
1489 }
1490
1491 func (plan *wrapInt16EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1492
1493 func (plan *wrapInt16EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1494 return plan.next.Encode(int16Wrapper(value.(int16)), buf)
1495 }
1496
1497 type wrapInt32EncodePlan struct {
1498 next EncodePlan
1499 }
1500
1501 func (plan *wrapInt32EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1502
1503 func (plan *wrapInt32EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1504 return plan.next.Encode(int32Wrapper(value.(int32)), buf)
1505 }
1506
1507 type wrapInt64EncodePlan struct {
1508 next EncodePlan
1509 }
1510
1511 func (plan *wrapInt64EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1512
1513 func (plan *wrapInt64EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1514 return plan.next.Encode(int64Wrapper(value.(int64)), buf)
1515 }
1516
1517 type wrapIntEncodePlan struct {
1518 next EncodePlan
1519 }
1520
1521 func (plan *wrapIntEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1522
1523 func (plan *wrapIntEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1524 return plan.next.Encode(intWrapper(value.(int)), buf)
1525 }
1526
1527 type wrapUint8EncodePlan struct {
1528 next EncodePlan
1529 }
1530
1531 func (plan *wrapUint8EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1532
1533 func (plan *wrapUint8EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1534 return plan.next.Encode(uint8Wrapper(value.(uint8)), buf)
1535 }
1536
1537 type wrapUint16EncodePlan struct {
1538 next EncodePlan
1539 }
1540
1541 func (plan *wrapUint16EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1542
1543 func (plan *wrapUint16EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1544 return plan.next.Encode(uint16Wrapper(value.(uint16)), buf)
1545 }
1546
1547 type wrapUint32EncodePlan struct {
1548 next EncodePlan
1549 }
1550
1551 func (plan *wrapUint32EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1552
1553 func (plan *wrapUint32EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1554 return plan.next.Encode(uint32Wrapper(value.(uint32)), buf)
1555 }
1556
1557 type wrapUint64EncodePlan struct {
1558 next EncodePlan
1559 }
1560
1561 func (plan *wrapUint64EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1562
1563 func (plan *wrapUint64EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1564 return plan.next.Encode(uint64Wrapper(value.(uint64)), buf)
1565 }
1566
1567 type wrapUintEncodePlan struct {
1568 next EncodePlan
1569 }
1570
1571 func (plan *wrapUintEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1572
1573 func (plan *wrapUintEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1574 return plan.next.Encode(uintWrapper(value.(uint)), buf)
1575 }
1576
1577 type wrapFloat32EncodePlan struct {
1578 next EncodePlan
1579 }
1580
1581 func (plan *wrapFloat32EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1582
1583 func (plan *wrapFloat32EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1584 return plan.next.Encode(float32Wrapper(value.(float32)), buf)
1585 }
1586
1587 type wrapFloat64EncodePlan struct {
1588 next EncodePlan
1589 }
1590
1591 func (plan *wrapFloat64EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1592
1593 func (plan *wrapFloat64EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1594 return plan.next.Encode(float64Wrapper(value.(float64)), buf)
1595 }
1596
1597 type wrapStringEncodePlan struct {
1598 next EncodePlan
1599 }
1600
1601 func (plan *wrapStringEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1602
1603 func (plan *wrapStringEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1604 return plan.next.Encode(stringWrapper(value.(string)), buf)
1605 }
1606
1607 type wrapTimeEncodePlan struct {
1608 next EncodePlan
1609 }
1610
1611 func (plan *wrapTimeEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1612
1613 func (plan *wrapTimeEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1614 return plan.next.Encode(timeWrapper(value.(time.Time)), buf)
1615 }
1616
1617 type wrapDurationEncodePlan struct {
1618 next EncodePlan
1619 }
1620
1621 func (plan *wrapDurationEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1622
1623 func (plan *wrapDurationEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1624 return plan.next.Encode(durationWrapper(value.(time.Duration)), buf)
1625 }
1626
1627 type wrapNetIPNetEncodePlan struct {
1628 next EncodePlan
1629 }
1630
1631 func (plan *wrapNetIPNetEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1632
1633 func (plan *wrapNetIPNetEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1634 return plan.next.Encode(netIPNetWrapper(value.(net.IPNet)), buf)
1635 }
1636
1637 type wrapNetIPEncodePlan struct {
1638 next EncodePlan
1639 }
1640
1641 func (plan *wrapNetIPEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1642
1643 func (plan *wrapNetIPEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1644 return plan.next.Encode(netIPWrapper(value.(net.IP)), buf)
1645 }
1646
1647 type wrapNetipPrefixEncodePlan struct {
1648 next EncodePlan
1649 }
1650
1651 func (plan *wrapNetipPrefixEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1652
1653 func (plan *wrapNetipPrefixEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1654 return plan.next.Encode(netipPrefixWrapper(value.(netip.Prefix)), buf)
1655 }
1656
1657 type wrapNetipAddrEncodePlan struct {
1658 next EncodePlan
1659 }
1660
1661 func (plan *wrapNetipAddrEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1662
1663 func (plan *wrapNetipAddrEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1664 return plan.next.Encode(netipAddrWrapper(value.(netip.Addr)), buf)
1665 }
1666
1667 type wrapMapStringToPointerStringEncodePlan struct {
1668 next EncodePlan
1669 }
1670
1671 func (plan *wrapMapStringToPointerStringEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1672
1673 func (plan *wrapMapStringToPointerStringEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1674 return plan.next.Encode(mapStringToPointerStringWrapper(value.(map[string]*string)), buf)
1675 }
1676
1677 type wrapMapStringToStringEncodePlan struct {
1678 next EncodePlan
1679 }
1680
1681 func (plan *wrapMapStringToStringEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1682
1683 func (plan *wrapMapStringToStringEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1684 return plan.next.Encode(mapStringToStringWrapper(value.(map[string]string)), buf)
1685 }
1686
1687 type wrapByte16EncodePlan struct {
1688 next EncodePlan
1689 }
1690
1691 func (plan *wrapByte16EncodePlan) SetNext(next EncodePlan) { plan.next = next }
1692
1693 func (plan *wrapByte16EncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1694 return plan.next.Encode(byte16Wrapper(value.([16]byte)), buf)
1695 }
1696
1697 type wrapByteSliceEncodePlan struct {
1698 next EncodePlan
1699 }
1700
1701 func (plan *wrapByteSliceEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1702
1703 func (plan *wrapByteSliceEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1704 return plan.next.Encode(byteSliceWrapper(value.([]byte)), buf)
1705 }
1706
1707 type wrapFmtStringerEncodePlan struct {
1708 next EncodePlan
1709 }
1710
1711 func (plan *wrapFmtStringerEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1712
1713 func (plan *wrapFmtStringerEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1714 return plan.next.Encode(fmtStringerWrapper{value.(fmt.Stringer)}, buf)
1715 }
1716
1717
1718 func TryWrapStructEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) {
1719 if _, ok := value.(driver.Valuer); ok {
1720 return nil, nil, false
1721 }
1722
1723 if valueType := reflect.TypeOf(value); valueType != nil && valueType.Kind() == reflect.Struct {
1724 exportedFields := getExportedFieldValues(reflect.ValueOf(value))
1725 if len(exportedFields) == 0 {
1726 return nil, nil, false
1727 }
1728
1729 w := structWrapper{
1730 s: value,
1731 exportedFields: exportedFields,
1732 }
1733 return &wrapAnyStructEncodePlan{}, w, true
1734 }
1735
1736 return nil, nil, false
1737 }
1738
1739 type wrapAnyStructEncodePlan struct {
1740 next EncodePlan
1741 }
1742
1743 func (plan *wrapAnyStructEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1744
1745 func (plan *wrapAnyStructEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1746 w := structWrapper{
1747 s: value,
1748 exportedFields: getExportedFieldValues(reflect.ValueOf(value)),
1749 }
1750
1751 return plan.next.Encode(w, buf)
1752 }
1753
1754 func getExportedFieldValues(structValue reflect.Value) []reflect.Value {
1755 structType := structValue.Type()
1756 exportedFields := make([]reflect.Value, 0, structValue.NumField())
1757 for i := 0; i < structType.NumField(); i++ {
1758 sf := structType.Field(i)
1759 if sf.IsExported() {
1760 exportedFields = append(exportedFields, structValue.Field(i))
1761 }
1762 }
1763
1764 return exportedFields
1765 }
1766
1767 func TryWrapSliceEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) {
1768 if _, ok := value.(driver.Valuer); ok {
1769 return nil, nil, false
1770 }
1771
1772
1773 switch value := value.(type) {
1774 case []int16:
1775 return &wrapSliceEncodePlan[int16]{}, (FlatArray[int16])(value), true
1776 case []int32:
1777 return &wrapSliceEncodePlan[int32]{}, (FlatArray[int32])(value), true
1778 case []int64:
1779 return &wrapSliceEncodePlan[int64]{}, (FlatArray[int64])(value), true
1780 case []float32:
1781 return &wrapSliceEncodePlan[float32]{}, (FlatArray[float32])(value), true
1782 case []float64:
1783 return &wrapSliceEncodePlan[float64]{}, (FlatArray[float64])(value), true
1784 case []string:
1785 return &wrapSliceEncodePlan[string]{}, (FlatArray[string])(value), true
1786 case []time.Time:
1787 return &wrapSliceEncodePlan[time.Time]{}, (FlatArray[time.Time])(value), true
1788 }
1789
1790 if valueType := reflect.TypeOf(value); valueType != nil && valueType.Kind() == reflect.Slice {
1791 w := anySliceArrayReflect{
1792 slice: reflect.ValueOf(value),
1793 }
1794 return &wrapSliceEncodeReflectPlan{}, w, true
1795 }
1796
1797 return nil, nil, false
1798 }
1799
1800 type wrapSliceEncodePlan[T any] struct {
1801 next EncodePlan
1802 }
1803
1804 func (plan *wrapSliceEncodePlan[T]) SetNext(next EncodePlan) { plan.next = next }
1805
1806 func (plan *wrapSliceEncodePlan[T]) Encode(value any, buf []byte) (newBuf []byte, err error) {
1807 return plan.next.Encode((FlatArray[T])(value.([]T)), buf)
1808 }
1809
1810 type wrapSliceEncodeReflectPlan struct {
1811 next EncodePlan
1812 }
1813
1814 func (plan *wrapSliceEncodeReflectPlan) SetNext(next EncodePlan) { plan.next = next }
1815
1816 func (plan *wrapSliceEncodeReflectPlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1817 w := anySliceArrayReflect{
1818 slice: reflect.ValueOf(value),
1819 }
1820
1821 return plan.next.Encode(w, buf)
1822 }
1823
1824 func TryWrapMultiDimSliceEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) {
1825 if _, ok := value.(driver.Valuer); ok {
1826 return nil, nil, false
1827 }
1828
1829 sliceValue := reflect.ValueOf(value)
1830 if sliceValue.Kind() == reflect.Slice {
1831 valueElemType := sliceValue.Type().Elem()
1832
1833 if valueElemType.Kind() == reflect.Slice {
1834 if !isRagged(sliceValue) {
1835 w := anyMultiDimSliceArray{
1836 slice: reflect.ValueOf(value),
1837 }
1838 return &wrapMultiDimSliceEncodePlan{}, &w, true
1839 }
1840 }
1841 }
1842
1843 return nil, nil, false
1844 }
1845
1846 type wrapMultiDimSliceEncodePlan struct {
1847 next EncodePlan
1848 }
1849
1850 func (plan *wrapMultiDimSliceEncodePlan) SetNext(next EncodePlan) { plan.next = next }
1851
1852 func (plan *wrapMultiDimSliceEncodePlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1853 w := anyMultiDimSliceArray{
1854 slice: reflect.ValueOf(value),
1855 }
1856
1857 return plan.next.Encode(&w, buf)
1858 }
1859
1860 func TryWrapArrayEncodePlan(value any) (plan WrappedEncodePlanNextSetter, nextValue any, ok bool) {
1861 if _, ok := value.(driver.Valuer); ok {
1862 return nil, nil, false
1863 }
1864
1865 if valueType := reflect.TypeOf(value); valueType != nil && valueType.Kind() == reflect.Array {
1866 w := anyArrayArrayReflect{
1867 array: reflect.ValueOf(value),
1868 }
1869 return &wrapArrayEncodeReflectPlan{}, w, true
1870 }
1871
1872 return nil, nil, false
1873 }
1874
1875 type wrapArrayEncodeReflectPlan struct {
1876 next EncodePlan
1877 }
1878
1879 func (plan *wrapArrayEncodeReflectPlan) SetNext(next EncodePlan) { plan.next = next }
1880
1881 func (plan *wrapArrayEncodeReflectPlan) Encode(value any, buf []byte) (newBuf []byte, err error) {
1882 w := anyArrayArrayReflect{
1883 array: reflect.ValueOf(value),
1884 }
1885
1886 return plan.next.Encode(w, buf)
1887 }
1888
1889 func newEncodeError(value any, m *Map, oid uint32, formatCode int16, err error) error {
1890 var format string
1891 switch formatCode {
1892 case TextFormatCode:
1893 format = "text"
1894 case BinaryFormatCode:
1895 format = "binary"
1896 default:
1897 format = fmt.Sprintf("unknown (%d)", formatCode)
1898 }
1899
1900 var dataTypeName string
1901 if t, ok := m.TypeForOID(oid); ok {
1902 dataTypeName = t.Name
1903 } else {
1904 dataTypeName = "unknown type"
1905 }
1906
1907 return fmt.Errorf("unable to encode %#v into %s format for %s (OID %d): %w", value, format, dataTypeName, oid, err)
1908 }
1909
1910
1911
1912
1913 func (m *Map) Encode(oid uint32, formatCode int16, value any, buf []byte) (newBuf []byte, err error) {
1914 if value == nil {
1915 return nil, nil
1916 }
1917
1918 plan := m.PlanEncode(oid, formatCode, value)
1919 if plan == nil {
1920 return nil, newEncodeError(value, m, oid, formatCode, errors.New("cannot find encode plan"))
1921 }
1922
1923 newBuf, err = plan.Encode(value, buf)
1924 if err != nil {
1925 return nil, newEncodeError(value, m, oid, formatCode, err)
1926 }
1927
1928 return newBuf, nil
1929 }
1930
1931
1932
1933
1934
1935
1936
1937 func (m *Map) SQLScanner(v any) sql.Scanner {
1938 if s, ok := v.(sql.Scanner); ok {
1939 return s
1940 }
1941
1942 return &sqlScannerWrapper{m: m, v: v}
1943 }
1944
1945 type sqlScannerWrapper struct {
1946 m *Map
1947 v any
1948 }
1949
1950 func (w *sqlScannerWrapper) Scan(src any) error {
1951 t, ok := w.m.TypeForValue(w.v)
1952 if !ok {
1953 return fmt.Errorf("cannot convert to sql.Scanner: cannot find registered type for %T", w.v)
1954 }
1955
1956 var bufSrc []byte
1957 if src != nil {
1958 switch src := src.(type) {
1959 case string:
1960 bufSrc = []byte(src)
1961 case []byte:
1962 bufSrc = src
1963 default:
1964 bufSrc = []byte(fmt.Sprint(bufSrc))
1965 }
1966 }
1967
1968 return w.m.Scan(t.OID, TextFormatCode, bufSrc, w.v)
1969 }
1970
View as plain text