flavor.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Copyright 2018 Huan Du. All rights reserved.
  2. // Licensed under the MIT license that can be found in the LICENSE file.
  3. package sqlbuilder
  4. import (
  5. "errors"
  6. "fmt"
  7. )
  8. // Supported flavors.
  9. const (
  10. invalidFlavor Flavor = iota
  11. MySQL
  12. PostgreSQL
  13. )
  14. var (
  15. // DefaultFlavor is the default flavor for all builders.
  16. DefaultFlavor = MySQL
  17. )
  18. var (
  19. // ErrInterpolateNotImplemented means the method or feature is not implemented right now.
  20. ErrInterpolateNotImplemented = errors.New("go-sqlbuilder: interpolation for this flavor is not implemented")
  21. // ErrInterpolateMissingArgs means there are some args missing in query, so it's not possible to
  22. // prepare a query with such args.
  23. ErrInterpolateMissingArgs = errors.New("go-sqlbuilder: not enough args when interpolating")
  24. // ErrInterpolateUnsupportedArgs means that some types of the args are not supported.
  25. ErrInterpolateUnsupportedArgs = errors.New("go-sqlbuilder: unsupported args when interpolating")
  26. )
  27. // Flavor is the flag to control the format of compiled sql.
  28. type Flavor int
  29. // String returns the name of f.
  30. func (f Flavor) String() string {
  31. switch f {
  32. case MySQL:
  33. return "MySQL"
  34. case PostgreSQL:
  35. return "PostgreSQL"
  36. }
  37. return "<invalid>"
  38. }
  39. // Interpolate parses sql returned by `Args#Compile` or `Builder`,
  40. // and interpolate args to replace placeholders in the sql.
  41. //
  42. // If there are some args missing in sql, e.g. the number of placeholders are larger than len(args),
  43. // returns ErrMissingArgs error.
  44. func (f Flavor) Interpolate(sql string, args []interface{}) (string, error) {
  45. switch f {
  46. case MySQL:
  47. return mysqlInterpolate(sql, args...)
  48. case PostgreSQL:
  49. return postgresqlInterpolate(sql, args...)
  50. }
  51. return "", ErrInterpolateNotImplemented
  52. }
  53. // NewCreateTableBuilder creates a new CREATE TABLE builder with flavor.
  54. func (f Flavor) NewCreateTableBuilder() *CreateTableBuilder {
  55. b := newCreateTableBuilder()
  56. b.SetFlavor(f)
  57. return b
  58. }
  59. // NewDeleteBuilder creates a new DELETE builder with flavor.
  60. func (f Flavor) NewDeleteBuilder() *DeleteBuilder {
  61. b := newDeleteBuilder()
  62. b.SetFlavor(f)
  63. return b
  64. }
  65. // NewInsertBuilder creates a new INSERT builder with flavor.
  66. func (f Flavor) NewInsertBuilder() *InsertBuilder {
  67. b := newInsertBuilder()
  68. b.SetFlavor(f)
  69. return b
  70. }
  71. // NewSelectBuilder creates a new SELECT builder with flavor.
  72. func (f Flavor) NewSelectBuilder() *SelectBuilder {
  73. b := newSelectBuilder()
  74. b.SetFlavor(f)
  75. return b
  76. }
  77. // NewUpdateBuilder creates a new UPDATE builder with flavor.
  78. func (f Flavor) NewUpdateBuilder() *UpdateBuilder {
  79. b := newUpdateBuilder()
  80. b.SetFlavor(f)
  81. return b
  82. }
  83. // Quote adds quote for name to make sure the name can be used safely
  84. // as table name or field name.
  85. //
  86. // * For MySQL, use back quote (`) to quote name;
  87. // * For PostgreSQL, use double quote (") to quote name.
  88. func (f Flavor) Quote(name string) string {
  89. switch f {
  90. case MySQL:
  91. return fmt.Sprintf("`%v`", name)
  92. case PostgreSQL:
  93. return fmt.Sprintf(`"%v"`, name)
  94. }
  95. return name
  96. }