...
1 package sb
2
3 import (
4 "bytes"
5 )
6
7
8 type (
9 SQLBuilder interface {
10 Error() error
11 SetError(err error) SQLBuilder
12 WriteArg(i ...interface{}) SQLBuilder
13 Write(p []byte) SQLBuilder
14 WriteStrings(ss ...string) SQLBuilder
15 WriteRunes(r ...rune) SQLBuilder
16 IsPrepared() bool
17 CurrentArgPosition() int
18 ToSQL() (sql string, args []interface{}, err error)
19 }
20 sqlBuilder struct {
21 buf *bytes.Buffer
22
23 isPrepared bool
24
25 currentArgPosition int
26 args []interface{}
27 err error
28 }
29 )
30
31 func NewSQLBuilder(isPrepared bool) SQLBuilder {
32 return &sqlBuilder{
33 buf: &bytes.Buffer{},
34 isPrepared: isPrepared,
35 args: make([]interface{}, 0),
36 currentArgPosition: 1,
37 }
38 }
39
40 func (b *sqlBuilder) Error() error {
41 return b.err
42 }
43
44 func (b *sqlBuilder) SetError(err error) SQLBuilder {
45 if b.err == nil {
46 b.err = err
47 }
48 return b
49 }
50
51 func (b *sqlBuilder) Write(bs []byte) SQLBuilder {
52 if b.err == nil {
53 b.buf.Write(bs)
54 }
55 return b
56 }
57
58 func (b *sqlBuilder) WriteStrings(ss ...string) SQLBuilder {
59 if b.err == nil {
60 for _, s := range ss {
61 b.buf.WriteString(s)
62 }
63 }
64 return b
65 }
66
67 func (b *sqlBuilder) WriteRunes(rs ...rune) SQLBuilder {
68 if b.err == nil {
69 for _, r := range rs {
70 b.buf.WriteRune(r)
71 }
72 }
73 return b
74 }
75
76
77 func (b *sqlBuilder) IsPrepared() bool {
78 return b.isPrepared
79 }
80
81
82 func (b *sqlBuilder) CurrentArgPosition() int {
83 return b.currentArgPosition
84 }
85
86
87 func (b *sqlBuilder) WriteArg(i ...interface{}) SQLBuilder {
88 if b.err == nil {
89 b.currentArgPosition += len(i)
90 b.args = append(b.args, i...)
91 }
92 return b
93 }
94
95
96 func (b *sqlBuilder) ToSQL() (sql string, args []interface{}, err error) {
97 if b.err != nil {
98 return sql, args, b.err
99 }
100 return b.buf.String(), b.args, nil
101 }
102
View as plain text