102 lines
2.2 KiB
Go
102 lines
2.2 KiB
Go
package sb
|
|
|
|
import (
|
|
"bytes"
|
|
)
|
|
|
|
// Builder that is composed of a bytes.Buffer. It is used internally and by adapters to build SQL statements
|
|
type (
|
|
SQLBuilder interface {
|
|
Error() error
|
|
SetError(err error) SQLBuilder
|
|
WriteArg(i ...interface{}) SQLBuilder
|
|
Write(p []byte) SQLBuilder
|
|
WriteStrings(ss ...string) SQLBuilder
|
|
WriteRunes(r ...rune) SQLBuilder
|
|
IsPrepared() bool
|
|
CurrentArgPosition() int
|
|
ToSQL() (sql string, args []interface{}, err error)
|
|
}
|
|
sqlBuilder struct {
|
|
buf *bytes.Buffer
|
|
// True if the sql should not be interpolated
|
|
isPrepared bool
|
|
// Current Number of arguments, used by adapters that need positional placeholders
|
|
currentArgPosition int
|
|
args []interface{}
|
|
err error
|
|
}
|
|
)
|
|
|
|
func NewSQLBuilder(isPrepared bool) SQLBuilder {
|
|
return &sqlBuilder{
|
|
buf: &bytes.Buffer{},
|
|
isPrepared: isPrepared,
|
|
args: make([]interface{}, 0),
|
|
currentArgPosition: 1,
|
|
}
|
|
}
|
|
|
|
func (b *sqlBuilder) Error() error {
|
|
return b.err
|
|
}
|
|
|
|
func (b *sqlBuilder) SetError(err error) SQLBuilder {
|
|
if b.err == nil {
|
|
b.err = err
|
|
}
|
|
return b
|
|
}
|
|
|
|
func (b *sqlBuilder) Write(bs []byte) SQLBuilder {
|
|
if b.err == nil {
|
|
b.buf.Write(bs)
|
|
}
|
|
return b
|
|
}
|
|
|
|
func (b *sqlBuilder) WriteStrings(ss ...string) SQLBuilder {
|
|
if b.err == nil {
|
|
for _, s := range ss {
|
|
b.buf.WriteString(s)
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
func (b *sqlBuilder) WriteRunes(rs ...rune) SQLBuilder {
|
|
if b.err == nil {
|
|
for _, r := range rs {
|
|
b.buf.WriteRune(r)
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
// Returns true if the sql is a prepared statement
|
|
func (b *sqlBuilder) IsPrepared() bool {
|
|
return b.isPrepared
|
|
}
|
|
|
|
// Returns true if the sql is a prepared statement
|
|
func (b *sqlBuilder) CurrentArgPosition() int {
|
|
return b.currentArgPosition
|
|
}
|
|
|
|
// Adds an argument to the builder, used when IsPrepared is false
|
|
func (b *sqlBuilder) WriteArg(i ...interface{}) SQLBuilder {
|
|
if b.err == nil {
|
|
b.currentArgPosition += len(i)
|
|
b.args = append(b.args, i...)
|
|
}
|
|
return b
|
|
}
|
|
|
|
// Returns the sql string, and arguments.
|
|
func (b *sqlBuilder) ToSQL() (sql string, args []interface{}, err error) {
|
|
if b.err != nil {
|
|
return sql, args, b.err
|
|
}
|
|
return b.buf.String(), b.args, nil
|
|
}
|