|
1 | | -// |
2 | 1 | // Example: |
3 | 2 | // |
4 | | -// qSql = &qsql.Page{ |
5 | | -// CountSql:`SELECT count(1) FROM user_info WHERE create_time >= ? AND create_time <= ?`, |
6 | | -// DataSql:`SELECT mobile, balance FROM user_info WHERE create_time >= ? AND create_time <= ?` |
7 | | -// } |
8 | | -// count, titles, result, err := qSql.QueryPageArray(db, true, condition, 0, 10) |
| 3 | +// mdb := db.GetCache("main") |
| 4 | +// |
| 5 | +// // count sql |
| 6 | +// cbd := NewSqlBuilder(mdb.DriverName()) |
| 7 | +// cbd.Select("COUNT(*)") |
| 8 | +// cbd.Add("FROM tmp") |
| 9 | +// cbd.Add("WHERE") |
| 10 | +// cbd.AddTab("create_at BETWEEN ? AND ?", time.Now().AddDate(-1,0,0), time.Now()) |
| 11 | +// |
| 12 | +// // copy condition |
| 13 | +// qbd := cbd.Copy() |
| 14 | +// qbd.Select("id", "created_at", "name") |
| 15 | +// qbd.Add("OFFSET ?", 0) |
| 16 | +// qbd.Add("LIMIT ?", 20) |
| 17 | +// |
| 18 | +// pSql := NewPageSql(cbd, qbd) |
| 19 | +// count, err := pSql.QueryCount(db) |
9 | 20 | // ... |
10 | 21 | // Or |
11 | | -// count, titles, result, err := qSql.QueryPageMap(db, true, condtion, 0, 10) |
| 22 | +// titles, result, err := pSql.QueryPageArray(db) |
12 | 23 | // ... |
13 | | -// if err != nil { |
| 24 | +// Or |
| 25 | +// titles, result, err := pSql.QueryPageMap(db) |
14 | 26 | // ... |
15 | | -// } |
16 | | -// |
17 | 27 | package qsql |
18 | 28 |
|
19 | 29 | import ( |
20 | 30 | "context" |
21 | | - "fmt" |
22 | 31 |
|
23 | 32 | "github.com/gwaylib/errors" |
24 | 33 | ) |
25 | 34 |
|
26 | | -type PageArgs struct { |
27 | | - args []interface{} |
28 | | - offset int64 |
29 | | - limit int64 |
30 | | -} |
31 | | - |
32 | | -func NewPageArgs(args ...interface{}) *PageArgs { |
33 | | - return &PageArgs{ |
34 | | - args: args, |
35 | | - } |
36 | | -} |
37 | | - |
38 | | -// using offset and limit when limit is set. |
39 | | -func (p *PageArgs) Limit(offset, limit int64) *PageArgs { |
40 | | - p.offset = offset |
41 | | - p.limit = limit |
42 | | - return p |
43 | | -} |
44 | | - |
45 | 35 | type PageSql struct { |
46 | | - countSql string |
47 | | - dataSql string |
| 36 | + countBD *SqlBuilder |
| 37 | + queryBD *SqlBuilder |
48 | 38 | } |
49 | 39 |
|
50 | | -func NewPageSql(countSql, dataSql string) *PageSql { |
51 | | - if len(countSql) == 0 { |
52 | | - panic("countSql not set") |
53 | | - } |
54 | | - if len(dataSql) == 0 { |
55 | | - panic("dataSql not set") |
56 | | - } |
| 40 | +func NewPageSql(countBD, queryBD *SqlBuilder) *PageSql { |
57 | 41 | return &PageSql{ |
58 | | - countSql: countSql, |
59 | | - dataSql: dataSql, |
| 42 | + countBD: countBD, |
| 43 | + queryBD: queryBD, |
60 | 44 | } |
61 | 45 | } |
62 | 46 |
|
63 | | -func (p PageSql) CountSql() string { |
64 | | - return p.countSql |
65 | | -} |
66 | | -func (p PageSql) DataSql() string { |
67 | | - return p.dataSql |
68 | | -} |
69 | | - |
70 | | -// fill the page sql with fmt arg, and return a new page |
71 | | -// Typically used for table name formatting |
72 | | -func (p PageSql) FmtPage(args ...interface{}) PageSql { |
73 | | - countSql := p.countSql |
74 | | - if len(countSql) > 0 { |
75 | | - countSql = fmt.Sprintf(p.countSql, args...) |
76 | | - } |
77 | | - dataSql := p.dataSql |
78 | | - if len(dataSql) > 0 { |
79 | | - dataSql = fmt.Sprintf(p.dataSql, args...) |
80 | | - } |
81 | | - |
82 | | - return PageSql{ |
83 | | - countSql: countSql, |
84 | | - dataSql: dataSql, |
85 | | - } |
86 | | -} |
87 | | - |
88 | | -func (p *PageSql) QueryCount(db *DB, args ...interface{}) (int64, error) { |
| 47 | +func (p *PageSql) QueryCount(db *DB) (int64, error) { |
89 | 48 | count := int64(0) |
90 | | - if err := queryElem(db, context.TODO(), &count, p.countSql, args...); err != nil { |
| 49 | + if err := queryElem(db, context.TODO(), &count, p.countBD.String(), p.countBD.Args()...); err != nil { |
91 | 50 | return 0, errors.As(err) |
92 | 51 | } |
93 | 52 | return count, nil |
94 | 53 | } |
95 | 54 |
|
96 | | -func (p *PageSql) QueryPageArr(db *DB, doCount bool, args *PageArgs) (int64, []string, [][]interface{}, error) { |
97 | | - total := int64(0) |
98 | | - dataArgs := args.args |
99 | | - if args.limit > 0 { |
100 | | - dataArgs = append(dataArgs, []interface{}{args.offset, args.limit}...) |
101 | | - } |
102 | | - titles, data, err := queryPageArr(db, context.TODO(), p.dataSql, dataArgs...) |
| 55 | +func (p *PageSql) QueryPageArr(db *DB) ([]string, [][]interface{}, error) { |
| 56 | + titles, data, err := queryPageArr(db, context.TODO(), p.queryBD.String(), p.queryBD.Args()...) |
103 | 57 | if err != nil { |
104 | | - return total, nil, nil, errors.As(err) |
105 | | - } else if doCount { |
106 | | - count, err := p.QueryCount(db, args.args...) |
107 | | - if err != nil { |
108 | | - return total, nil, nil, errors.As(err) |
109 | | - } |
110 | | - total = count |
| 58 | + return nil, nil, errors.As(err) |
111 | 59 | } |
112 | | - return total, titles, data, nil |
| 60 | + return titles, data, nil |
113 | 61 | } |
114 | 62 |
|
115 | | -func (p *PageSql) QueryPageMap(db *DB, doCount bool, args *PageArgs) (int64, []string, []map[string]interface{}, error) { |
116 | | - total := int64(0) |
117 | | - dataArgs := args.args |
118 | | - if args.limit > 0 { |
119 | | - dataArgs = append(dataArgs, []interface{}{args.offset, args.limit}...) |
120 | | - } |
121 | | - title, data, err := queryPageMap(db, context.TODO(), p.dataSql, dataArgs...) |
| 63 | +func (p *PageSql) QueryPageMap(db *DB) ([]string, []map[string]interface{}, error) { |
| 64 | + titles, data, err := queryPageMap(db, context.TODO(), p.queryBD.String(), p.queryBD.Args()...) |
122 | 65 | if err != nil { |
123 | | - return total, nil, nil, errors.As(err) |
124 | | - } else if doCount { |
125 | | - count, err := p.QueryCount(db, args.args...) |
126 | | - if err != nil { |
127 | | - return total, nil, nil, errors.As(err) |
128 | | - } |
129 | | - total = count |
| 66 | + return nil, nil, errors.As(err) |
130 | 67 | } |
131 | | - return total, title, data, nil |
| 68 | + return titles, data, nil |
132 | 69 | } |
0 commit comments