123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- // Copyright 2018 Huan Du. All rights reserved.
- // Licensed under the MIT license that can be found in the LICENSE file.
- package sqlbuilder
- import (
- "errors"
- "fmt"
- )
- // Supported flavors.
- const (
- invalidFlavor Flavor = iota
- MySQL
- PostgreSQL
- )
- var (
- // DefaultFlavor is the default flavor for all builders.
- DefaultFlavor = MySQL
- )
- var (
- // ErrInterpolateNotImplemented means the method or feature is not implemented right now.
- ErrInterpolateNotImplemented = errors.New("go-sqlbuilder: interpolation for this flavor is not implemented")
- // ErrInterpolateMissingArgs means there are some args missing in query, so it's not possible to
- // prepare a query with such args.
- ErrInterpolateMissingArgs = errors.New("go-sqlbuilder: not enough args when interpolating")
- // ErrInterpolateUnsupportedArgs means that some types of the args are not supported.
- ErrInterpolateUnsupportedArgs = errors.New("go-sqlbuilder: unsupported args when interpolating")
- )
- // Flavor is the flag to control the format of compiled sql.
- type Flavor int
- // String returns the name of f.
- func (f Flavor) String() string {
- switch f {
- case MySQL:
- return "MySQL"
- case PostgreSQL:
- return "PostgreSQL"
- }
- return "<invalid>"
- }
- // Interpolate parses sql returned by `Args#Compile` or `Builder`,
- // and interpolate args to replace placeholders in the sql.
- //
- // If there are some args missing in sql, e.g. the number of placeholders are larger than len(args),
- // returns ErrMissingArgs error.
- func (f Flavor) Interpolate(sql string, args []interface{}) (string, error) {
- switch f {
- case MySQL:
- return mysqlInterpolate(sql, args...)
- case PostgreSQL:
- return postgresqlInterpolate(sql, args...)
- }
- return "", ErrInterpolateNotImplemented
- }
- // NewCreateTableBuilder creates a new CREATE TABLE builder with flavor.
- func (f Flavor) NewCreateTableBuilder() *CreateTableBuilder {
- b := newCreateTableBuilder()
- b.SetFlavor(f)
- return b
- }
- // NewDeleteBuilder creates a new DELETE builder with flavor.
- func (f Flavor) NewDeleteBuilder() *DeleteBuilder {
- b := newDeleteBuilder()
- b.SetFlavor(f)
- return b
- }
- // NewInsertBuilder creates a new INSERT builder with flavor.
- func (f Flavor) NewInsertBuilder() *InsertBuilder {
- b := newInsertBuilder()
- b.SetFlavor(f)
- return b
- }
- // NewSelectBuilder creates a new SELECT builder with flavor.
- func (f Flavor) NewSelectBuilder() *SelectBuilder {
- b := newSelectBuilder()
- b.SetFlavor(f)
- return b
- }
- // NewUpdateBuilder creates a new UPDATE builder with flavor.
- func (f Flavor) NewUpdateBuilder() *UpdateBuilder {
- b := newUpdateBuilder()
- b.SetFlavor(f)
- return b
- }
- // Quote adds quote for name to make sure the name can be used safely
- // as table name or field name.
- //
- // * For MySQL, use back quote (`) to quote name;
- // * For PostgreSQL, use double quote (") to quote name.
- func (f Flavor) Quote(name string) string {
- switch f {
- case MySQL:
- return fmt.Sprintf("`%v`", name)
- case PostgreSQL:
- return fmt.Sprintf(`"%v"`, name)
- }
- return name
- }
|