MCPcopy
hub / github.com/go-gorm/gorm / scanIntoStruct

Method scanIntoStruct

scan.go:54–113  ·  view source on GitHub ↗
(rows Rows, reflectValue reflect.Value, values []interface{}, fields []*schema.Field, joinFields [][]*schema.Field)

Source from the content-addressed store, hash-verified

52}
53
54func (db *DB) scanIntoStruct(rows Rows, reflectValue reflect.Value, values []interface{}, fields []*schema.Field, joinFields [][]*schema.Field) {
55 for idx, field := range fields {
56 if field != nil {
57 values[idx] = field.NewValuePool.Get()
58 } else if len(fields) == 1 {
59 if reflectValue.CanAddr() {
60 values[idx] = reflectValue.Addr().Interface()
61 } else {
62 values[idx] = reflectValue.Interface()
63 }
64 }
65 }
66
67 db.RowsAffected++
68 db.AddError(rows.Scan(values...))
69 joinedNestedSchemaMap := make(map[string]interface{})
70 for idx, field := range fields {
71 if field == nil {
72 continue
73 }
74
75 if len(joinFields) == 0 || len(joinFields[idx]) == 0 {
76 db.AddError(field.Set(db.Statement.Context, reflectValue, values[idx]))
77 } else { // joinFields count is larger than 2 when using join
78 var isNilPtrValue bool
79 var relValue reflect.Value
80 // does not contain raw dbname
81 nestedJoinSchemas := joinFields[idx][:len(joinFields[idx])-1]
82 // current reflect value
83 currentReflectValue := reflectValue
84 fullRels := make([]string, 0, len(nestedJoinSchemas))
85 for _, joinSchema := range nestedJoinSchemas {
86 fullRels = append(fullRels, joinSchema.Name)
87 relValue = joinSchema.ReflectValueOf(db.Statement.Context, currentReflectValue)
88 if relValue.Kind() == reflect.Ptr {
89 fullRelsName := utils.JoinNestedRelationNames(fullRels)
90 // same nested structure
91 if _, ok := joinedNestedSchemaMap[fullRelsName]; !ok {
92 if value := reflect.ValueOf(values[idx]).Elem(); value.Kind() == reflect.Ptr && value.IsNil() {
93 isNilPtrValue = true
94 break
95 }
96
97 relValue.Set(reflect.New(relValue.Type().Elem()))
98 joinedNestedSchemaMap[fullRelsName] = nil
99 }
100 }
101 currentReflectValue = relValue
102 }
103
104 if !isNilPtrValue { // ignore if value is nil
105 f := joinFields[idx][len(joinFields[idx])-1]
106 db.AddError(f.Set(db.Statement.Context, relValue, values[idx]))
107 }
108 }
109
110 // release data to pool
111 field.NewValuePool.Put(values[idx])

Callers 1

ScanFunction · 0.80

Calls 8

AddErrorMethod · 0.95
JoinNestedRelationNamesFunction · 0.92
PutMethod · 0.80
GetMethod · 0.65
ScanMethod · 0.65
SetMethod · 0.65
NewMethod · 0.65
TypeMethod · 0.65

Tested by

no test coverage detected