|
@@ -1,20 +1,26 @@
|
1
|
1
|
package utils
|
2
|
2
|
|
3
|
3
|
import (
|
4
|
|
- "errors"
|
5
|
4
|
"strconv"
|
6
|
|
-
|
7
|
|
- "github.com/go-xorm/xorm"
|
8
|
5
|
)
|
9
|
6
|
|
|
7
|
+type PageNaviEngine struct {
|
|
8
|
+ ctx *Context
|
|
9
|
+}
|
|
10
|
+
|
|
11
|
+func NewPageNaviEngine(ctx *Context) *PageNaviEngine {
|
|
12
|
+ return &PageNaviEngine{ctx: ctx}
|
|
13
|
+}
|
|
14
|
+
|
10
|
15
|
// GetPageList 获取列表
|
11
|
|
-func GetPageList(db *xorm.Session, target interface{}, limit []int, sqlorArgs ...interface{}) (int64, error) {
|
12
|
|
- if sqlorArgs == nil || len(sqlorArgs) == 0 {
|
13
|
|
- return 0, errors.New("SQL 语句不存在")
|
|
16
|
+func (t *PageNaviEngine) GetPageList(target interface{}, sql string, limit []int, sqlArgs ...interface{}) (int64, error) {
|
|
17
|
+ countSQL := "select count(*) as cnt from (" + sql + ") as virtualTable"
|
|
18
|
+ countSQLorArgs := []interface{}{countSQL}
|
|
19
|
+ for _, arg := range sqlArgs {
|
|
20
|
+ countSQLorArgs = append(countSQLorArgs, arg)
|
14
|
21
|
}
|
15
|
22
|
|
16
|
|
- countSQLorArgs := GetCountSQL(sqlorArgs...)
|
17
|
|
- cntRes, err := db.Query(countSQLorArgs...)
|
|
23
|
+ cntRes, err := t.ctx.DB.Query(countSQLorArgs...)
|
18
|
24
|
if err != nil {
|
19
|
25
|
return 0, err
|
20
|
26
|
}
|
|
@@ -22,9 +28,9 @@ func GetPageList(db *xorm.Session, target interface{}, limit []int, sqlorArgs ..
|
22
|
28
|
cntStr := string(cntRes[0]["cnt"])
|
23
|
29
|
cnt, _ := strconv.ParseInt(cntStr, 10, 64)
|
24
|
30
|
|
25
|
|
- sql, args := PackLimitToSQL(limit, sqlorArgs...)
|
|
31
|
+ newSQL := t.PackLimitToSQL(sql, limit)
|
26
|
32
|
|
27
|
|
- err = db.SQL(sql, args...).Find(target)
|
|
33
|
+ err = t.ctx.DB.SQL(newSQL, sqlArgs...).Find(target)
|
28
|
34
|
if err != nil {
|
29
|
35
|
return 0, err
|
30
|
36
|
}
|
|
@@ -32,28 +38,14 @@ func GetPageList(db *xorm.Session, target interface{}, limit []int, sqlorArgs ..
|
32
|
38
|
return cnt, nil
|
33
|
39
|
}
|
34
|
40
|
|
35
|
|
-// GetCountSQL 获取计算 Count 的相关 SQL 脚本
|
36
|
|
-func GetCountSQL(sqlorArgs ...interface{}) []interface{} {
|
37
|
|
- sql := sqlorArgs[0].(string)
|
38
|
|
-
|
39
|
|
- cntSQL := "select count(*) as cnt from (" + sql + ")"
|
40
|
|
-
|
41
|
|
- newSQLorArgs := []interface{}{cntSQL}
|
42
|
|
- newSQLorArgs = append(newSQLorArgs, sqlorArgs[1:])
|
43
|
|
- return newSQLorArgs
|
44
|
|
-}
|
45
|
|
-
|
46
|
41
|
// PackLimitToSQL 添加 limit 语句到 sql 最后
|
47
|
|
-func PackLimitToSQL(limit []int, sqlorArgs ...interface{}) (string, []interface{}) {
|
48
|
|
- sql := sqlorArgs[0].(string)
|
49
|
|
- args := sqlorArgs[1:]
|
50
|
|
-
|
|
42
|
+func (t *PageNaviEngine) PackLimitToSQL(sql string, limit []int) string {
|
51
|
43
|
switch len(limit) {
|
52
|
44
|
case 1:
|
53
|
|
- return sql + " LIMIT " + strconv.Itoa(limit[0]), args
|
|
45
|
+ return sql + " LIMIT " + strconv.Itoa(limit[0])
|
54
|
46
|
case 2:
|
55
|
|
- return sql + " LIMIT " + strconv.Itoa(limit[0]) + " OFFSET " + strconv.Itoa(limit[1]), args
|
|
47
|
+ return sql + " LIMIT " + strconv.Itoa(limit[0]) + " OFFSET " + strconv.Itoa(limit[1])
|
56
|
48
|
default:
|
57
|
|
- return sql, args
|
|
49
|
+ return sql
|
58
|
50
|
}
|
59
|
51
|
}
|