-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsqlxext.go
73 lines (65 loc) · 2.45 KB
/
sqlxext.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
// Package sqlxext - provides handy extensions to sqlx default functions.
package sqlxext
import (
"context"
"github.com/jmoiron/sqlx"
)
// NamedGetContext gets and scans one row it to dst like sqlx.GetContext does, but accepts query with named parameters.
// Nil inParams is allowed, unlike dest. Use ExecSQLForRows (NamedSelectContext) if you need to discard row(-s) or Exec
// the statement.
func NamedGetContext(
ctx context.Context,
db sqlx.ExtContext,
dest interface{}, query string, inParams interface{},
) error {
query, args, err := safeBindNamed(db, query, inParams)
if err != nil {
return err
}
return sqlx.GetContext(ctx, db, dest, query, args...)
}
// NamedSelectContext select all rows and scans them to dst like sqlx.SelectContext does, but accepts query with named
// parameters. Nil dest or nil inParams are allowed. If dest is nil, it works like sqlx.NamedExecContext.
func NamedSelectContext(
ctx context.Context,
db sqlx.ExtContext,
dest interface{}, query string, inParams interface{},
) error {
query, args, err := safeBindNamed(db, query, inParams)
if err != nil {
return err
}
if dest == nil {
dest = &[]interface{}{}
}
return sqlx.SelectContext(ctx, db, dest, query, args...)
}
// ExecSQLForRows execute db request and write results to dest. It is sqlx.SelectContext under the hood, but
// accepts query with named parameters. Nil dest or nil inParams are allowed. If dest is nil, it works like
// sqlx.NamedExecContext.
func ExecSQLForRows(
ctx context.Context,
db sqlx.ExtContext,
dest interface{}, query string, inParams interface{},
) error {
return NamedSelectContext(ctx, db, dest, query, inParams)
}
// safeBindNamed safe binding params method (may take a nil as input parameter).
// nolint:unnamedResult // unneeded unnamed check
func safeBindNamed(db sqlx.ExtContext, query string, inParams interface{}) (string, []interface{}, error) {
if inParams == nil {
inParams = struct{}{}
}
// transform named parameters to '?'
query, args, err := sqlx.Named(query, inParams)
if err != nil {
return "", nil, err
}
// map parameters '?' by number of arguments in IN-arg, if its present
query, args, err = sqlx.In(query, args...)
if err != nil {
return "", nil, err
}
// transform parameters to $1, $2, etc - driver format
return db.Rebind(query), args, nil
}