MCPcopy
hub / github.com/gocraft/dbr / Load

Function Load

load.go:31–126  ·  view source on GitHub ↗

Load loads any value from sql.Rows. value can be: 1. simple type like int64, string, etc. 2. sql.Scanner, which allows loading with custom types. 3. map; the first column from SQL result loaded to the key, and the rest of columns will be loaded into the value. This is useful to dedup SQL result

(rows *sql.Rows, value interface{})

Source from the content-addressed store, hash-verified

29// 4. map of slice; like map, values with the same key are
30// collected with a slice.
31func Load(rows *sql.Rows, value interface{}) (int, error) {
32 defer rows.Close()
33
34 column, err := rows.Columns()
35 if err != nil {
36 return 0, err
37 }
38 ptr := make([]interface{}, len(column))
39
40 var v reflect.Value
41 var elemType reflect.Type
42
43 if il, ok := value.(interfaceLoader); ok {
44 v = reflect.ValueOf(il.v)
45 elemType = il.typ
46 } else {
47 v = reflect.ValueOf(value)
48 }
49
50 if v.Kind() != reflect.Ptr || v.IsNil() {
51 return 0, ErrInvalidPointer
52 }
53 v = v.Elem()
54 isScanner := v.Addr().Type().Implements(typeScanner)
55 isSlice := v.Kind() == reflect.Slice && v.Type().Elem().Kind() != reflect.Uint8 && !isScanner
56 isMap := v.Kind() == reflect.Map && !isScanner
57 isMapOfSlices := isMap && v.Type().Elem().Kind() == reflect.Slice && v.Type().Elem().Elem().Kind() != reflect.Uint8
58 if isMap {
59 v.Set(reflect.MakeMap(v.Type()))
60 }
61
62 s := newTagStore()
63 count := 0
64 for rows.Next() {
65 var elem, keyElem reflect.Value
66
67 if elemType != nil {
68 elem = reflectAlloc(elemType)
69 } else if isMapOfSlices {
70 elem = reflectAlloc(v.Type().Elem().Elem())
71 } else if isSlice || isMap {
72 elem = reflectAlloc(v.Type().Elem())
73 } else {
74 elem = v
75 }
76
77 if isMap {
78 err := s.findPtr(elem, column[1:], ptr[1:])
79 if err != nil {
80 return 0, err
81 }
82 keyElem = reflectAlloc(v.Type().Key())
83 err = s.findPtr(keyElem, column[:1], ptr[:1])
84 if err != nil {
85 return 0, err
86 }
87 } else {
88 err := s.findPtr(elem, column, ptr)

Callers 1

queryFunction · 0.85

Calls 10

newTagStoreFunction · 0.85
reflectAllocFunction · 0.85
ColumnsMethod · 0.80
SetMethod · 0.80
findPtrMethod · 0.80
AppendMethod · 0.80
CloseMethod · 0.65
NextMethod · 0.65
ScanMethod · 0.65
ErrMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…