-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinsert_values.go
More file actions
67 lines (61 loc) · 1.39 KB
/
insert_values.go
File metadata and controls
67 lines (61 loc) · 1.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package squildx
import (
"slices"
"strings"
)
func (b *insertBuilder) Values(sql string, params ...Params) InsertBuilder {
cp := b.clone()
extracted, err := extractParams(params)
if err != nil {
cp.err = err
return cp
}
merged, prefix, err := parseParams(sql, extracted)
if err != nil {
cp.err = err
return cp
}
if err := cp.setPrefix(prefix); err != nil {
cp.err = err
return cp
}
cp.valueRows = append(cp.valueRows, paramClause{sql: sql, params: merged})
return cp
}
func (b *insertBuilder) ValuesObject(obj any) InsertBuilder {
cp := b.clone()
cols, sql, params, err := structFieldValues(obj)
if err != nil {
cp.err = err
return cp
}
if err := cp.setPrefix(':'); err != nil {
cp.err = err
return cp
}
switch {
case len(cp.columns) == 0:
cp.columns = cols
case !slices.Equal(cp.columns, cols):
cp.err = ErrColumnMismatch
return cp
}
cp.valueRows = append(cp.valueRows, paramClause{sql: sql, params: params})
return cp
}
func structFieldValues(obj any) (columns []string, sql string, params Params, err error) {
columns, err = structColumns(obj, "")
if err != nil {
return nil, "", nil, err
}
params, err = structValues(obj)
if err != nil {
return nil, "", nil, err
}
placeholders := make([]string, len(columns))
for i, col := range columns {
placeholders[i] = ":" + col
}
sql = strings.Join(placeholders, ", ")
return columns, sql, params, nil
}