github.com/doug-martin/goqu/v9@v9.19.0/internal/sb/sql_builder.go (about) 1 package sb 2 3 import ( 4 "bytes" 5 ) 6 7 // Builder that is composed of a bytes.Buffer. It is used internally and by adapters to build SQL statements 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 // True if the sql should not be interpolated 23 isPrepared bool 24 // Current Number of arguments, used by adapters that need positional placeholders 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 // Returns true if the sql is a prepared statement 77 func (b *sqlBuilder) IsPrepared() bool { 78 return b.isPrepared 79 } 80 81 // Returns true if the sql is a prepared statement 82 func (b *sqlBuilder) CurrentArgPosition() int { 83 return b.currentArgPosition 84 } 85 86 // Adds an argument to the builder, used when IsPrepared is false 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 // Returns the sql string, and arguments. 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 }