123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- // Copyright 2018 Huan Du. All rights reserved.
- // Licensed under the MIT license that can be found in the LICENSE file.
- package sqlbuilder
- import (
- "bytes"
- "strings"
- )
- // NewCreateTableBuilder creates a new CREATE TABLE builder.
- func NewCreateTableBuilder() *CreateTableBuilder {
- return DefaultFlavor.NewCreateTableBuilder()
- }
- func newCreateTableBuilder() *CreateTableBuilder {
- args := &Args{}
- return &CreateTableBuilder{
- verb: "CREATE TABLE",
- args: args,
- }
- }
- // CreateTableBuilder is a builder to build CREATE TABLE.
- type CreateTableBuilder struct {
- verb string
- ifNotExists bool
- table string
- defs [][]string
- options [][]string
- args *Args
- }
- // CreateTable sets the table name in CREATE TABLE.
- func (ctb *CreateTableBuilder) CreateTable(table string) *CreateTableBuilder {
- ctb.table = Escape(table)
- return ctb
- }
- // CreateTempTable sets the table name and changes the verb of ctb to CREATE TEMPORARY TABLE.
- func (ctb *CreateTableBuilder) CreateTempTable(table string) *CreateTableBuilder {
- ctb.verb = "CREATE TEMPORARY TABLE"
- ctb.table = Escape(table)
- return ctb
- }
- // IfNotExists adds IF NOT EXISTS before table name in CREATE TABLE.
- func (ctb *CreateTableBuilder) IfNotExists() *CreateTableBuilder {
- ctb.ifNotExists = true
- return ctb
- }
- // Define adds definition of a column or index in CREATE TABLE.
- func (ctb *CreateTableBuilder) Define(def ...string) *CreateTableBuilder {
- ctb.defs = append(ctb.defs, def)
- return ctb
- }
- // Option adds a table option in CREATE TABLE.
- func (ctb *CreateTableBuilder) Option(opt ...string) *CreateTableBuilder {
- ctb.options = append(ctb.options, opt)
- return ctb
- }
- // String returns the compiled INSERT string.
- func (ctb *CreateTableBuilder) String() string {
- s, _ := ctb.Build()
- return s
- }
- // Build returns compiled CREATE TABLE string and args.
- // They can be used in `DB#Query` of package `database/sql` directly.
- func (ctb *CreateTableBuilder) Build() (sql string, args []interface{}) {
- return ctb.BuildWithFlavor(ctb.args.Flavor)
- }
- // BuildWithFlavor returns compiled CREATE TABLE string and args with flavor and initial args.
- // They can be used in `DB#Query` of package `database/sql` directly.
- func (ctb *CreateTableBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{}) {
- buf := &bytes.Buffer{}
- buf.WriteString(ctb.verb)
- if ctb.ifNotExists {
- buf.WriteString(" IF NOT EXISTS")
- }
- buf.WriteRune(' ')
- buf.WriteString(ctb.table)
- buf.WriteString(" (")
- defs := make([]string, 0, len(ctb.defs))
- for _, def := range ctb.defs {
- defs = append(defs, strings.Join(def, " "))
- }
- buf.WriteString(strings.Join(defs, ", "))
- buf.WriteRune(')')
- if len(ctb.options) > 0 {
- buf.WriteRune(' ')
- opts := make([]string, 0, len(ctb.options))
- for _, opt := range ctb.options {
- opts = append(opts, strings.Join(opt, " "))
- }
- buf.WriteString(strings.Join(opts, ", "))
- }
- return ctb.args.CompileWithFlavor(buf.String(), flavor, initialArg...)
- }
- // SetFlavor sets the flavor of compiled sql.
- func (ctb *CreateTableBuilder) SetFlavor(flavor Flavor) (old Flavor) {
- old = ctb.args.Flavor
- ctb.args.Flavor = flavor
- return
- }
|