github.com/systematiccaos/gorm@v1.22.6/clause/set.go (about) 1 package clause 2 3 import "sort" 4 5 type Set []Assignment 6 7 type Assignment struct { 8 Column Column 9 Value interface{} 10 } 11 12 func (set Set) Name() string { 13 return "SET" 14 } 15 16 func (set Set) Build(builder Builder) { 17 if len(set) > 0 { 18 for idx, assignment := range set { 19 if idx > 0 { 20 builder.WriteByte(',') 21 } 22 builder.WriteQuoted(assignment.Column) 23 builder.WriteByte('=') 24 builder.AddVar(builder, assignment.Value) 25 } 26 } else { 27 builder.WriteQuoted(Column{Name: PrimaryKey}) 28 builder.WriteByte('=') 29 builder.WriteQuoted(Column{Name: PrimaryKey}) 30 } 31 } 32 33 // MergeClause merge assignments clauses 34 func (set Set) MergeClause(clause *Clause) { 35 copiedAssignments := make([]Assignment, len(set)) 36 copy(copiedAssignments, set) 37 clause.Expression = Set(copiedAssignments) 38 } 39 40 func Assignments(values map[string]interface{}) Set { 41 keys := make([]string, 0, len(values)) 42 for key := range values { 43 keys = append(keys, key) 44 } 45 sort.Strings(keys) 46 47 assignments := make([]Assignment, len(keys)) 48 for idx, key := range keys { 49 assignments[idx] = Assignment{Column: Column{Name: key}, Value: values[key]} 50 } 51 return assignments 52 } 53 54 func AssignmentColumns(values []string) Set { 55 assignments := make([]Assignment, len(values)) 56 for idx, value := range values { 57 assignments[idx] = Assignment{Column: Column{Name: value}, Value: Column{Table: "excluded", Name: value}} 58 } 59 return assignments 60 }