forked from mgutz/dat
/
queryable.go
134 lines (116 loc) · 3.38 KB
/
queryable.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package runner
import (
"database/sql"
"fmt"
"github.com/jmoiron/sqlx"
"gopkg.in/mgutz/dat.v1"
)
// Queryable is an object that can be queried.
type Queryable struct {
runner database
}
// WrapSqlxExt converts a sqlx.Ext to a *Queryable
func WrapSqlxExt(e sqlx.Ext) *Queryable {
switch e := e.(type) {
default:
panic(fmt.Sprintf("unexpected type %T", e))
case database:
return &Queryable{e}
}
}
// Call creates a new CallBuilder for the given sproc and args.
func (q *Queryable) Call(sproc string, args ...interface{}) *dat.CallBuilder {
b := dat.NewCallBuilder(sproc, args...)
b.Execer = NewExecer(q.runner, b)
return b
}
// DeleteFrom creates a new DeleteBuilder for the given table.
func (q *Queryable) DeleteFrom(table string) *dat.DeleteBuilder {
b := dat.NewDeleteBuilder(table)
b.Execer = NewExecer(q.runner, b)
return b
}
// Exec executes a SQL query with optional arguments.
func (q *Queryable) Exec(cmd string, args ...interface{}) (*dat.Result, error) {
var result sql.Result
var err error
if len(args) == 0 {
result, err = q.runner.Exec(cmd)
} else {
result, err = q.runner.Exec(cmd, args...)
}
if err != nil {
return nil, logSQLError(err, "Exec", cmd, args)
}
rowsAffected, err := result.RowsAffected()
return &dat.Result{RowsAffected: rowsAffected}, nil
}
// ExecBuilder executes the SQL in builder.
func (q *Queryable) ExecBuilder(b dat.Builder) error {
sql, args, err := b.Interpolate()
if err != nil {
return err
}
if len(args) == 0 {
_, err = q.runner.Exec(sql)
} else {
_, err = q.runner.Exec(sql, args...)
}
if err != nil {
return logSQLError(err, "ExecBuilder", sql, args)
}
return nil
}
// ExecMulti executes multiple SQL statements returning the number of
// statements executed, or the index at which an error occurred.
func (q *Queryable) ExecMulti(commands ...*dat.Expression) (int, error) {
for i, cmd := range commands {
_, err := q.runner.Exec(cmd.Sql, cmd.Args...)
if err != nil {
return i, err
}
}
return len(commands), nil
}
// InsertInto creates a new InsertBuilder for the given table.
func (q *Queryable) InsertInto(table string) *dat.InsertBuilder {
b := dat.NewInsertBuilder(table)
b.Execer = NewExecer(q.runner, b)
return b
}
// Insect inserts or selects.
func (q *Queryable) Insect(table string) *dat.InsectBuilder {
b := dat.NewInsectBuilder(table)
b.Execer = NewExecer(q.runner, b)
return b
}
// Select creates a new SelectBuilder for the given columns.
func (q *Queryable) Select(columns ...string) *dat.SelectBuilder {
b := dat.NewSelectBuilder(columns...)
b.Execer = NewExecer(q.runner, b)
return b
}
// SelectDoc creates a new SelectBuilder for the given columns.
func (q *Queryable) SelectDoc(columns ...string) *dat.SelectDocBuilder {
b := dat.NewSelectDocBuilder(columns...)
b.Execer = NewExecer(q.runner, b)
return b
}
// SQL creates a new raw SQL builder.
func (q *Queryable) SQL(sql string, args ...interface{}) *dat.RawBuilder {
b := dat.NewRawBuilder(sql, args...)
b.Execer = NewExecer(q.runner, b)
return b
}
// Update creates a new UpdateBuilder for the given table.
func (q *Queryable) Update(table string) *dat.UpdateBuilder {
b := dat.NewUpdateBuilder(table)
b.Execer = NewExecer(q.runner, b)
return b
}
// Upsert creates a new UpdateBuilder for the given table.
func (q *Queryable) Upsert(table string) *dat.UpsertBuilder {
b := dat.NewUpsertBuilder(table)
b.Execer = NewExecer(q.runner, b)
return b
}