fork github.com/doug-martin
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user