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

Method Changed

statement.go:643–696  ·  view source on GitHub ↗

Changed check model changed or not when updating

(fields ...string)

Source from the content-addressed store, hash-verified

641
642// Changed check model changed or not when updating
643func (stmt *Statement) Changed(fields ...string) bool {
644 modelValue := stmt.ReflectValue
645 switch modelValue.Kind() {
646 case reflect.Slice, reflect.Array:
647 modelValue = stmt.ReflectValue.Index(stmt.CurDestIndex)
648 }
649
650 selectColumns, restricted := stmt.SelectAndOmitColumns(false, true)
651 changed := func(field *schema.Field) bool {
652 fieldValue, _ := field.ValueOf(stmt.Context, modelValue)
653 if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && !restricted) {
654 if mv, mok := stmt.Dest.(map[string]interface{}); mok {
655 if fv, ok := mv[field.Name]; ok {
656 return !utils.AssertEqual(fv, fieldValue)
657 } else if fv, ok := mv[field.DBName]; ok {
658 return !utils.AssertEqual(fv, fieldValue)
659 }
660 } else {
661 destValue := reflect.ValueOf(stmt.Dest)
662 for destValue.Kind() == reflect.Ptr {
663 destValue = destValue.Elem()
664 }
665 if descSchema, err := schema.Parse(stmt.Dest, stmt.DB.cacheStore, stmt.DB.NamingStrategy); err == nil {
666 if destField := descSchema.LookUpField(field.DBName); destField != nil {
667 changedValue, zero := destField.ValueOf(stmt.Context, destValue)
668 if v {
669 return !utils.AssertEqual(changedValue, fieldValue)
670 }
671 return !zero && !utils.AssertEqual(changedValue, fieldValue)
672 }
673 }
674 }
675 }
676 return false
677 }
678
679 if len(fields) == 0 {
680 for _, field := range stmt.Schema.FieldsByDBName {
681 if changed(field) {
682 return true
683 }
684 }
685 } else {
686 for _, name := range fields {
687 if field := stmt.Schema.LookUpField(name); field != nil {
688 if changed(field) {
689 return true
690 }
691 }
692 }
693 }
694
695 return false
696}
697
698var matchName = func() func(tableColumn string) (table, column string) {
699 nameMatcher := regexp.MustCompile(`^(?:\W?(\w+?)\W?\.)?(?:(\*)|\W?(\w+?)\W?)$`)

Callers 2

BeforeUpdateMethod · 0.80
BeforeUpdateMethod · 0.80

Calls 4

SelectAndOmitColumnsMethod · 0.95
AssertEqualFunction · 0.92
ParseFunction · 0.92
LookUpFieldMethod · 0.80

Tested by 2

BeforeUpdateMethod · 0.64
BeforeUpdateMethod · 0.64