forked from c9s/gatsby
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathselect.go
108 lines (94 loc) · 2.88 KB
/
select.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package gatsby
import (
"database/sql"
"github.com/c9s/gatsby/sqlutils"
"reflect"
)
const DefaultSliceCap = 200
/*
Scan data from sql.Rows and returns a map slice.
This returns []map[string]interface{}
*/
func CreateStructSliceFromRows(val PtrRecord, rows *sql.Rows) (interface{}, error) {
var value = reflect.Indirect(reflect.ValueOf(val))
var typeOfVal = value.Type()
var sliceOfVal = reflect.SliceOf(typeOfVal)
var slice = reflect.MakeSlice(sliceOfVal, 0, DefaultSliceCap)
var err error
for rows.Next() {
var newValue = reflect.New(typeOfVal)
if err = FillFromRows(newValue.Interface(), rows); err != nil {
return slice.Interface(), err
}
slice = reflect.Append(slice, reflect.Indirect(newValue))
}
if err = rows.Err(); err != nil {
return slice, err
}
return slice.Interface(), nil
}
/*
Select all records from a table which based on the record struct.
*/
func Select(db *sql.DB, val PtrRecord) (interface{}, *Result) {
var sql = sqlutils.BuildSelectClause(val)
rows, err := db.Query(sql)
if err != nil {
return nil, NewErrorResult(err, sql)
}
defer rows.Close()
slice, err := CreateStructSliceFromRows(val, rows)
if err != nil {
return slice, NewErrorResult(err, sql)
}
return slice, NewResult(sql)
}
/*
Execute a select query to the database connection.
*/
func QuerySelect(db *sql.DB, val PtrRecord) (*sql.Rows, error) {
return db.Query(sqlutils.BuildSelectClause(val))
}
func QuerySelectWith(db *sql.DB, val PtrRecord, postSql string, args ...interface{}) (*sql.Rows, error) {
return db.Query(sqlutils.BuildSelectClause(val)+" "+postSql, args...)
}
// Select a table and returns objects
func SelectWith(db *sql.DB, val PtrRecord, postSql string, args ...interface{}) (interface{}, *Result) {
sql := sqlutils.BuildSelectClause(val) + " " + postSql
rows, err := db.Query(sql, args...)
if err != nil {
return nil, NewErrorResult(err, sql)
}
defer rows.Close()
slice, err := CreateStructSliceFromRows(val, rows)
if err != nil {
return slice, NewErrorResult(err, sql)
}
return slice, NewResult(sql)
}
func SelectWhere(db *sql.DB, val PtrRecord, conds WhereMap) (interface{}, *Result) {
var whereSql, args = sqlutils.BuildWhereClauseWithAndOp(conds, GetHolderTypeByDriver(driverType))
var sql = sqlutils.BuildSelectClause(val) + whereSql
var rows, err = db.Query(sql, args...)
if err != nil {
return nil, NewErrorResult(err, sql)
}
defer rows.Close()
slice, err := CreateStructSliceFromRows(val, rows)
if err != nil {
return slice, NewErrorResult(err, sql)
}
return slice, NewResult(sql)
}
func SelectFromQuery(db *sql.DB, val PtrRecord, sql string, args ...interface{}) (interface{}, *Result) {
var rows, err = db.Query(sql, args...)
if err != nil {
return nil, NewErrorResult(err, sql)
}
defer rows.Close()
slice, err := CreateStructSliceFromRows(val, rows)
if err != nil {
return slice, NewErrorResult(err, sql)
}
return slice, NewResult(sql)
}