123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- // Copyright 2018 Huan Du. All rights reserved.
- // Licensed under the MIT license that can be found in the LICENSE file.
- package sqlbuilder
- import (
- "bytes"
- "fmt"
- "strings"
- )
- // NewUpdateBuilder creates a new UPDATE builder.
- func NewUpdateBuilder() *UpdateBuilder {
- return DefaultFlavor.NewUpdateBuilder()
- }
- func newUpdateBuilder() *UpdateBuilder {
- args := &Args{}
- return &UpdateBuilder{
- Cond: Cond{
- Args: args,
- },
- args: args,
- }
- }
- // UpdateBuilder is a builder to build UPDATE.
- type UpdateBuilder struct {
- Cond
- table string
- assignments []string
- whereExprs []string
- args *Args
- }
- // Update sets table name in UPDATE.
- func (ub *UpdateBuilder) Update(table string) *UpdateBuilder {
- ub.table = Escape(table)
- return ub
- }
- // Set sets the assignements in SET.
- func (ub *UpdateBuilder) Set(assignment ...string) *UpdateBuilder {
- ub.assignments = assignment
- return ub
- }
- // SetMore appends the assignements in SET.
- func (ub *UpdateBuilder) SetMore(assignment ...string) *UpdateBuilder {
- ub.assignments = append(ub.assignments, assignment...)
- return ub
- }
- // Where sets expressions of WHERE in UPDATE.
- func (ub *UpdateBuilder) Where(andExpr ...string) *UpdateBuilder {
- ub.whereExprs = append(ub.whereExprs, andExpr...)
- return ub
- }
- // Assign represents SET "field = value" in UPDATE.
- func (ub *UpdateBuilder) Assign(field string, value interface{}) string {
- return fmt.Sprintf("%s = %s", Escape(field), ub.args.Add(value))
- }
- // Incr represents SET "field = field + 1" in UPDATE.
- func (ub *UpdateBuilder) Incr(field string) string {
- f := Escape(field)
- return fmt.Sprintf("%s = %s + 1", f, f)
- }
- // Decr represents SET "field = field - 1" in UPDATE.
- func (ub *UpdateBuilder) Decr(field string) string {
- f := Escape(field)
- return fmt.Sprintf("%s = %s - 1", f, f)
- }
- // Add represents SET "field = field + value" in UPDATE.
- func (ub *UpdateBuilder) Add(field string, value interface{}) string {
- f := Escape(field)
- return fmt.Sprintf("%s = %s + %s", f, f, ub.args.Add(value))
- }
- // Sub represents SET "field = field - value" in UPDATE.
- func (ub *UpdateBuilder) Sub(field string, value interface{}) string {
- f := Escape(field)
- return fmt.Sprintf("%s = %s - %s", f, f, ub.args.Add(value))
- }
- // Mul represents SET "field = field * value" in UPDATE.
- func (ub *UpdateBuilder) Mul(field string, value interface{}) string {
- f := Escape(field)
- return fmt.Sprintf("%s = %s * %s", f, f, ub.args.Add(value))
- }
- // Div represents SET "field = field / value" in UPDATE.
- func (ub *UpdateBuilder) Div(field string, value interface{}) string {
- f := Escape(field)
- return fmt.Sprintf("%s = %s / %s", f, f, ub.args.Add(value))
- }
- // String returns the compiled UPDATE string.
- func (ub *UpdateBuilder) String() string {
- s, _ := ub.Build()
- return s
- }
- // Build returns compiled UPDATE string and args.
- // They can be used in `DB#Query` of package `database/sql` directly.
- func (ub *UpdateBuilder) Build() (sql string, args []interface{}) {
- return ub.BuildWithFlavor(ub.args.Flavor)
- }
- // BuildWithFlavor returns compiled UPDATE string and args with flavor and initial args.
- // They can be used in `DB#Query` of package `database/sql` directly.
- func (ub *UpdateBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{}) {
- buf := &bytes.Buffer{}
- buf.WriteString("UPDATE ")
- buf.WriteString(ub.table)
- buf.WriteString(" SET ")
- buf.WriteString(strings.Join(ub.assignments, ", "))
- if len(ub.whereExprs) > 0 {
- buf.WriteString(" WHERE ")
- buf.WriteString(strings.Join(ub.whereExprs, " AND "))
- }
- return ub.args.CompileWithFlavor(buf.String(), flavor, initialArg...)
- }
- // SetFlavor sets the flavor of compiled sql.
- func (ub *UpdateBuilder) SetFlavor(flavor Flavor) (old Flavor) {
- old = ub.args.Flavor
- ub.args.Flavor = flavor
- return
- }
|