43dd4e9234
Signed-off-by: Anton Nesterov <anton@demiurg.io>
46 lines
879 B
Go
46 lines
879 B
Go
package builder
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type InsertData struct {
|
|
Statement string
|
|
Values []interface{}
|
|
}
|
|
|
|
func convertInsert(ctx Dialect, inserts []Map) (InsertData, error) {
|
|
keys := aggregateSortedKeys(inserts)
|
|
posEnum := make([]string, 0)
|
|
for range keys {
|
|
posEnum = append(posEnum, "?")
|
|
}
|
|
|
|
placeholder := strings.Join(posEnum, ",")
|
|
positional := []string{}
|
|
values := make([]interface{}, 0)
|
|
for _, insert := range inserts {
|
|
vals := make([]interface{}, 0)
|
|
for _, key := range keys {
|
|
vals = append(vals, insert[key])
|
|
}
|
|
values = append(values, vals...)
|
|
positional = append(
|
|
positional,
|
|
fmt.Sprintf("(%s)", placeholder),
|
|
)
|
|
}
|
|
|
|
sfmt := fmt.Sprintf(
|
|
"INSERT INTO %s (%s) VALUES %s",
|
|
ctx.GetTableName(),
|
|
strings.Join(keys, ","),
|
|
strings.Join(positional, ","),
|
|
)
|
|
return InsertData{
|
|
Statement: sfmt,
|
|
Values: values,
|
|
}, nil
|
|
}
|