64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
|
package squirrel
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
type part struct {
|
||
|
pred interface{}
|
||
|
args []interface{}
|
||
|
}
|
||
|
|
||
|
func newPart(pred interface{}, args ...interface{}) Sqlizer {
|
||
|
return &part{pred, args}
|
||
|
}
|
||
|
|
||
|
func (p part) ToSql() (sql string, args []interface{}, err error) {
|
||
|
switch pred := p.pred.(type) {
|
||
|
case nil:
|
||
|
// no-op
|
||
|
case Sqlizer:
|
||
|
sql, args, err = nestedToSql(pred)
|
||
|
case string:
|
||
|
sql = pred
|
||
|
args = p.args
|
||
|
default:
|
||
|
err = fmt.Errorf("expected string or Sqlizer, not %T", pred)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func nestedToSql(s Sqlizer) (string, []interface{}, error) {
|
||
|
if raw, ok := s.(rawSqlizer); ok {
|
||
|
return raw.toSqlRaw()
|
||
|
} else {
|
||
|
return s.ToSql()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func appendToSql(parts []Sqlizer, w io.Writer, sep string, args []interface{}) ([]interface{}, error) {
|
||
|
for i, p := range parts {
|
||
|
partSql, partArgs, err := nestedToSql(p)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
} else if len(partSql) == 0 {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if i > 0 {
|
||
|
_, err := io.WriteString(w, sep)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_, err = io.WriteString(w, partSql)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
args = append(args, partArgs...)
|
||
|
}
|
||
|
return args, nil
|
||
|
}
|