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

Function ConvertToAssignments

callbacks/update.go:145–318  ·  view source on GitHub ↗

ConvertToAssignments convert to update assignments

(stmt *gorm.Statement)

Source from the content-addressed store, hash-verified

143
144// ConvertToAssignments convert to update assignments
145func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) {
146 var (
147 selectColumns, restricted = stmt.SelectAndOmitColumns(false, true)
148 assignValue func(field *schema.Field, value interface{})
149 )
150
151 switch stmt.ReflectValue.Kind() {
152 case reflect.Slice, reflect.Array:
153 assignValue = func(field *schema.Field, value interface{}) {
154 for i := 0; i < stmt.ReflectValue.Len(); i++ {
155 if stmt.ReflectValue.CanAddr() {
156 field.Set(stmt.Context, stmt.ReflectValue.Index(i), value)
157 }
158 }
159 }
160 case reflect.Struct:
161 assignValue = func(field *schema.Field, value interface{}) {
162 if stmt.ReflectValue.CanAddr() {
163 field.Set(stmt.Context, stmt.ReflectValue, value)
164 }
165 }
166 default:
167 assignValue = func(field *schema.Field, value interface{}) {
168 }
169 }
170
171 updatingValue := reflect.ValueOf(stmt.Dest)
172 for updatingValue.Kind() == reflect.Ptr {
173 updatingValue = updatingValue.Elem()
174 }
175
176 if !updatingValue.CanAddr() || stmt.Dest != stmt.Model {
177 switch stmt.ReflectValue.Kind() {
178 case reflect.Slice, reflect.Array:
179 if size := stmt.ReflectValue.Len(); size > 0 {
180 var isZero bool
181 for i := 0; i < size; i++ {
182 for _, field := range stmt.Schema.PrimaryFields {
183 _, isZero = field.ValueOf(stmt.Context, stmt.ReflectValue.Index(i))
184 if !isZero {
185 break
186 }
187 }
188 }
189
190 if !isZero {
191 _, primaryValues := schema.GetIdentityFieldValuesMap(stmt.Context, stmt.ReflectValue, stmt.Schema.PrimaryFields)
192 column, values := schema.ToQueryValues("", stmt.Schema.PrimaryFieldDBNames, primaryValues)
193 stmt.AddClause(clause.Where{Exprs: []clause.Expression{clause.IN{Column: column, Values: values}}})
194 }
195 }
196 case reflect.Struct:
197 for _, field := range stmt.Schema.PrimaryFields {
198 if value, isZero := field.ValueOf(stmt.Context, stmt.ReflectValue); !isZero {
199 stmt.AddClause(clause.Where{Exprs: []clause.Expression{clause.Eq{Column: field.DBName, Value: value}}})
200 }
201 }
202 }

Callers 1

UpdateFunction · 0.85

Calls 9

ParseMethod · 0.95
ToQueryValuesFunction · 0.92
SelectAndOmitColumnsMethod · 0.80
LenMethod · 0.80
AddClauseMethod · 0.80
LookUpFieldMethod · 0.80
SetMethod · 0.65
AddErrorMethod · 0.65

Tested by

no test coverage detected