mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
* add query builder to facilitate dynamic SQL construction * leverage query builder to refactor user store This is partially setup work for MM-13120, but merged to master to avoid further conflicts. * fix unrelated unit test breakage * documentation tweaks * Apply suggestions from code review Co-Authored-By: lieut-data <jesse.hallam@gmail.com> * prefer comma separated case options to fallthrough * vendor github.com/Masterminds/squirrel and deps * switch to using github.com/Masterminds/squirrel * rm querybuilder
56 lines
983 B
Go
56 lines
983 B
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 = pred.ToSql()
|
|
case string:
|
|
sql = pred
|
|
args = p.args
|
|
default:
|
|
err = fmt.Errorf("expected string or Sqlizer, not %T", pred)
|
|
}
|
|
return
|
|
}
|
|
|
|
func appendToSql(parts []Sqlizer, w io.Writer, sep string, args []interface{}) ([]interface{}, error) {
|
|
for i, p := range parts {
|
|
partSql, partArgs, err := p.ToSql()
|
|
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
|
|
}
|