You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.2 KiB
60 lines
1.2 KiB
3 years ago
|
package clause
|
||
|
|
||
|
type OnConflict struct {
|
||
|
Columns []Column
|
||
|
Where Where
|
||
|
TargetWhere Where
|
||
|
OnConstraint string
|
||
|
DoNothing bool
|
||
|
DoUpdates Set
|
||
|
UpdateAll bool
|
||
|
}
|
||
|
|
||
|
func (OnConflict) Name() string {
|
||
|
return "ON CONFLICT"
|
||
|
}
|
||
|
|
||
|
// Build build onConflict clause
|
||
|
func (onConflict OnConflict) Build(builder Builder) {
|
||
|
if len(onConflict.Columns) > 0 {
|
||
|
builder.WriteByte('(')
|
||
|
for idx, column := range onConflict.Columns {
|
||
|
if idx > 0 {
|
||
|
builder.WriteByte(',')
|
||
|
}
|
||
|
builder.WriteQuoted(column)
|
||
|
}
|
||
|
builder.WriteString(`) `)
|
||
|
}
|
||
|
|
||
|
if len(onConflict.TargetWhere.Exprs) > 0 {
|
||
|
builder.WriteString(" WHERE ")
|
||
|
onConflict.TargetWhere.Build(builder)
|
||
|
builder.WriteByte(' ')
|
||
|
}
|
||
|
|
||
|
if onConflict.OnConstraint != "" {
|
||
|
builder.WriteString("ON CONSTRAINT ")
|
||
|
builder.WriteString(onConflict.OnConstraint)
|
||
|
builder.WriteByte(' ')
|
||
|
}
|
||
|
|
||
|
if onConflict.DoNothing {
|
||
|
builder.WriteString("DO NOTHING")
|
||
|
} else {
|
||
|
builder.WriteString("DO UPDATE SET ")
|
||
|
onConflict.DoUpdates.Build(builder)
|
||
|
}
|
||
|
|
||
|
if len(onConflict.Where.Exprs) > 0 {
|
||
|
builder.WriteString(" WHERE ")
|
||
|
onConflict.Where.Build(builder)
|
||
|
builder.WriteByte(' ')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MergeClause merge onConflict clauses
|
||
|
func (onConflict OnConflict) MergeClause(clause *Clause) {
|
||
|
clause.Expression = onConflict
|
||
|
}
|