-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathwhere.go
More file actions
79 lines (76 loc) · 1.43 KB
/
where.go
File metadata and controls
79 lines (76 loc) · 1.43 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
68
69
70
71
72
73
74
75
76
77
78
79
package lama
import (
"database/sql"
"strings"
)
type Where struct {
Expr string
Op string
Value interface{}
Or []Where
Args []sql.NamedArg
Raw string
Fake bool
}
func (w *Where) Build(di Dialect) (string, []sql.NamedArg) {
if w.Args == nil {
w.Args = make([]sql.NamedArg,0)
}
bnN := "arg"
if len(w.Expr) > 0 {
n := strings.TrimLeft(w.Expr, "(")
n = strings.TrimLeft(n, "/")
n = strings.TrimLeft(n, ":")
n = strings.TrimLeft(n, ".")
n = strings.TrimLeft(n, ",")
n = strings.TrimLeft(n, "'")
n = strings.TrimLeft(n, `"`)
ln := len(n)
if ln >= 3 {
chr := []rune(n)
bnN = string(chr[0:3])
} else {
chr := []rune(n)
bnN = string(chr[0:ln])
}
}
bnN = strings.TrimSpace(bnN)
if bnN == "" {
bnN = "arg"
}
//name := bnN + strconv.Itoa(rand.Int())
name:=getArgName(bnN)
or := ""
if w.Or != nil {
for idx := range w.Or {
o:=w.Or[idx]
stm, args := o.Build(di)
if idx == 0 {
or = stm
} else {
or = or + " OR " + stm
}
for i := range args {
//w.Args[a] = b
w.Args=append(w.Args,args[i])
}
}
}
wh := ""
if len(w.Expr) > 0 {
wh = "(" + w.Expr + w.Op + di.BindVarStr(name) + ")"
w.Args = append(w.Args, sql.NamedArg{Name: name, Value: w.Value})
//w.Args[name] = w.Value
}
if len(w.Raw) > 0 {
wh = "(" + w.Raw + ")"
}
if len(or) > 0 {
if len(wh) > 0 {
wh = "(" + wh + " and (" + or + "))"
} else {
wh = "(" + or + ")"
}
}
return wh, w.Args
}