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.
83 lines
1.7 KiB
83 lines
1.7 KiB
package builder
|
|
|
|
import (
|
|
"github.com/go-rel/rel"
|
|
)
|
|
|
|
// Insert builder.
|
|
type Insert struct {
|
|
BufferFactory BufferFactory
|
|
ReturningPrimaryValue bool
|
|
InsertDefaultValues bool
|
|
OnConflict OnConflict
|
|
}
|
|
|
|
// Build sql query and its arguments.
|
|
func (i Insert) Build(table string, primaryField string, mutates map[string]rel.Mutate, onConflict rel.OnConflict) (string, []interface{}) {
|
|
var (
|
|
buffer = i.BufferFactory.Create()
|
|
)
|
|
|
|
i.WriteInsertInto(&buffer, table)
|
|
i.WriteValues(&buffer, mutates)
|
|
i.OnConflict.WriteMutates(&buffer, mutates, onConflict)
|
|
i.WriteReturning(&buffer, primaryField)
|
|
|
|
buffer.WriteString(";")
|
|
|
|
return buffer.String(), buffer.Arguments()
|
|
}
|
|
|
|
func (i Insert) WriteInsertInto(buffer *Buffer, table string) {
|
|
buffer.WriteString("INSERT INTO ")
|
|
buffer.WriteEscape(table)
|
|
}
|
|
|
|
func (i Insert) WriteValues(buffer *Buffer, mutates map[string]rel.Mutate) {
|
|
var (
|
|
count = len(mutates)
|
|
)
|
|
|
|
if count == 0 && i.InsertDefaultValues {
|
|
buffer.WriteString(" DEFAULT VALUES")
|
|
} else {
|
|
buffer.WriteString(" (")
|
|
|
|
var (
|
|
n = 0
|
|
arguments = make([]interface{}, 0, count)
|
|
)
|
|
|
|
for field, mut := range mutates {
|
|
if mut.Type == rel.ChangeSetOp {
|
|
if n > 0 {
|
|
buffer.WriteByte(',')
|
|
}
|
|
|
|
buffer.WriteEscape(field)
|
|
arguments = append(arguments, mut.Value)
|
|
n++
|
|
}
|
|
}
|
|
|
|
buffer.WriteString(") VALUES (")
|
|
|
|
for i := range arguments {
|
|
if i > 0 {
|
|
buffer.WriteByte(',')
|
|
}
|
|
|
|
buffer.WritePlaceholder()
|
|
}
|
|
buffer.AddArguments(arguments...)
|
|
buffer.WriteByte(')')
|
|
}
|
|
}
|
|
|
|
func (i Insert) WriteReturning(buffer *Buffer, primaryField string) {
|
|
if i.ReturningPrimaryValue && primaryField != "" {
|
|
buffer.WriteString(" RETURNING ")
|
|
buffer.WriteEscape(primaryField)
|
|
}
|
|
}
|