Changed check model changed or not when updating
(fields ...string)
| 641 | |
| 642 | // Changed check model changed or not when updating |
| 643 | func (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 | |
| 698 | var matchName = func() func(tableColumn string) (table, column string) { |
| 699 | nameMatcher := regexp.MustCompile(`^(?:\W?(\w+?)\W?\.)?(?:(\*)|\W?(\w+?)\W?)$`) |