MCPcopy Index your code
hub / github.com/upper/db / fetchResult

Function fetchResult

internal/sqlbuilder/fetch.go:142–238  ·  view source on GitHub ↗
(iter *iterator, itemT reflect.Type, columns []string)

Source from the content-addressed store, hash-verified

140}
141
142func fetchResult(iter *iterator, itemT reflect.Type, columns []string) (reflect.Value, error) {
143
144 var item reflect.Value
145 var err error
146 rows := iter.cursor
147
148 objT := itemT
149
150 switch objT.Kind() {
151 case reflect.Map:
152 item = reflect.MakeMap(objT)
153 case reflect.Struct:
154 item = reflect.New(objT)
155 case reflect.Ptr:
156 objT = itemT.Elem()
157 if objT.Kind() != reflect.Struct {
158 return item, ErrExpectingMapOrStruct
159 }
160 item = reflect.New(objT)
161 default:
162 return item, ErrExpectingMapOrStruct
163 }
164
165 switch objT.Kind() {
166 case reflect.Struct:
167
168 values := make([]interface{}, len(columns))
169 typeMap := Mapper.TypeMap(itemT)
170 fieldMap := typeMap.Names
171
172 for i, k := range columns {
173 fi, ok := fieldMap[k]
174 if !ok {
175 values[i] = new(interface{})
176 continue
177 }
178
179 // Check for deprecated jsonb tag.
180 if _, hasJSONBTag := fi.Options["jsonb"]; hasJSONBTag {
181 return item, errDeprecatedJSONBTag
182 }
183
184 f := reflectx.FieldByIndexes(item, fi.Index)
185
186 // TODO: type switch + scanner
187
188 if w, ok := f.Interface().(valueConverter); ok {
189 wrapper := w.ConvertValue(f.Addr().Interface())
190 z := reflect.ValueOf(wrapper)
191 values[i] = z.Interface()
192 continue
193 } else {
194 values[i] = f.Addr().Interface()
195 }
196
197 if unmarshaler, ok := values[i].(db.Unmarshaler); ok {
198 values[i] = scanner{unmarshaler}
199 continue

Callers 2

fetchRowFunction · 0.85
fetchRowsFunction · 0.85

Calls 7

FieldByIndexesFunction · 0.92
KindMethod · 0.80
TypeMapMethod · 0.80
NewMethod · 0.65
ConvertValueMethod · 0.65
ScanMethod · 0.65
ColumnsMethod · 0.65

Tested by

no test coverage detected