61 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package clause
 | 
						|
 | 
						|
import "sort"
 | 
						|
 | 
						|
type Set []Assignment
 | 
						|
 | 
						|
type Assignment struct {
 | 
						|
	Column Column
 | 
						|
	Value  interface{}
 | 
						|
}
 | 
						|
 | 
						|
func (set Set) Name() string {
 | 
						|
	return "SET"
 | 
						|
}
 | 
						|
 | 
						|
func (set Set) Build(builder Builder) {
 | 
						|
	if len(set) > 0 {
 | 
						|
		for idx, assignment := range set {
 | 
						|
			if idx > 0 {
 | 
						|
				builder.WriteByte(',')
 | 
						|
			}
 | 
						|
			builder.WriteQuoted(assignment.Column)
 | 
						|
			builder.WriteByte('=')
 | 
						|
			builder.AddVar(builder, assignment.Value)
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		builder.WriteQuoted(Column{Name: PrimaryKey})
 | 
						|
		builder.WriteByte('=')
 | 
						|
		builder.WriteQuoted(Column{Name: PrimaryKey})
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// MergeClause merge assignments clauses
 | 
						|
func (set Set) MergeClause(clause *Clause) {
 | 
						|
	copiedAssignments := make([]Assignment, len(set))
 | 
						|
	copy(copiedAssignments, set)
 | 
						|
	clause.Expression = Set(copiedAssignments)
 | 
						|
}
 | 
						|
 | 
						|
func Assignments(values map[string]interface{}) Set {
 | 
						|
	keys := make([]string, 0, len(values))
 | 
						|
	for key := range values {
 | 
						|
		keys = append(keys, key)
 | 
						|
	}
 | 
						|
	sort.Strings(keys)
 | 
						|
 | 
						|
	assignments := make([]Assignment, len(keys))
 | 
						|
	for idx, key := range keys {
 | 
						|
		assignments[idx] = Assignment{Column: Column{Name: key}, Value: values[key]}
 | 
						|
	}
 | 
						|
	return assignments
 | 
						|
}
 | 
						|
 | 
						|
func AssignmentColumns(values []string) Set {
 | 
						|
	assignments := make([]Assignment, len(values))
 | 
						|
	for idx, value := range values {
 | 
						|
		assignments[idx] = Assignment{Column: Column{Name: value}, Value: Column{Table: "excluded", Name: value}}
 | 
						|
	}
 | 
						|
	return assignments
 | 
						|
}
 |