-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathargs.go
91 lines (83 loc) · 1.74 KB
/
args.go
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
80
81
82
83
84
85
86
87
88
89
90
91
package mysqlx
import (
"fmt"
"reflect"
)
// This file handles argument parsing
type _parsedArgs struct {
FieldMap map[string]*Field
Opt Options
Offset int
Limit int
CondList []string
OrderList []string
forUpdate bool
}
func (d *xdb) handleArgs(prototype interface{}, args []interface{}) (ret *_parsedArgs, err error) {
ret = &_parsedArgs{
CondList: make([]string, 0, len(args)),
OrderList: make([]string, 0, len(args)),
}
ret.FieldMap, err = d.getFieldMap(prototype)
if err != nil {
return
}
ret.Opt = mergeOptions(prototype)
for _, arg := range args {
c := ""
o := ""
switch arg.(type) {
default:
t := reflect.TypeOf(arg)
err = fmt.Errorf("unsupported type %v", t)
return
case *Options:
ret.Opt = mergeOptions(prototype, *(arg.(*Options)))
case Options:
ret.Opt = mergeOptions(prototype, arg.(Options))
case Limit:
ret.Limit = int(arg.(Limit))
case Offset:
ret.Offset = int(arg.(Offset))
case Cond:
cond := arg.(Cond)
c = cond.pack(ret.FieldMap)
case *Cond:
cond := arg.(*Cond)
c = cond.pack(ret.FieldMap)
case And:
and := arg.(And)
c = and.pack(ret.FieldMap)
case *And:
and := arg.(*And)
c = and.pack(ret.FieldMap)
case Or:
or := arg.(Or)
c = or.pack(ret.FieldMap)
case *Or:
or := arg.(*Or)
c = or.pack(ret.FieldMap)
case Order:
order := arg.(Order)
o = order.pack()
case *Order:
order := arg.(*Order)
o = order.pack()
case *ForUpdateType:
ret.forUpdate = true
case ForUpdateType:
ret.forUpdate = true
}
if "" != c {
ret.CondList = append(ret.CondList, c)
}
if "" != o {
ret.OrderList = append(ret.OrderList, o)
}
}
if "" == ret.Opt.TableName {
err = fmt.Errorf("nil table name")
return
}
return
}