...

Source file src/github.com/doug-martin/goqu/v9/internal/sb/sql_builder.go

Documentation: github.com/doug-martin/goqu/v9/internal/sb

     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  }
   102  

View as plain text