package squirrel

import (
	
	
	
	
	

	
)

type updateData struct {
	PlaceholderFormat PlaceholderFormat
	RunWith           BaseRunner
	Prefixes          []Sqlizer
	Table             string
	SetClauses        []setClause
	WhereParts        []Sqlizer
	OrderBys          []string
	Limit             string
	Offset            string
	Suffixes          []Sqlizer
}

type setClause struct {
	column string
	value  interface{}
}

func ( *updateData) () (sql.Result, error) {
	if .RunWith == nil {
		return nil, RunnerNotSet
	}
	return ExecWith(.RunWith, )
}

func ( *updateData) () (*sql.Rows, error) {
	if .RunWith == nil {
		return nil, RunnerNotSet
	}
	return QueryWith(.RunWith, )
}

func ( *updateData) () RowScanner {
	if .RunWith == nil {
		return &Row{err: RunnerNotSet}
	}
	,  := .RunWith.(QueryRower)
	if ! {
		return &Row{err: RunnerNotQueryRunner}
	}
	return QueryRowWith(, )
}

func ( *updateData) () ( string,  []interface{},  error) {
	if len(.Table) == 0 {
		 = fmt.Errorf("update statements must specify a table")
		return
	}
	if len(.SetClauses) == 0 {
		 = fmt.Errorf("update statements must have at least one Set clause")
		return
	}

	 := &bytes.Buffer{}

	if len(.Prefixes) > 0 {
		,  = appendToSql(.Prefixes, , " ", )
		if  != nil {
			return
		}

		.WriteString(" ")
	}

	.WriteString("UPDATE ")
	.WriteString(.Table)

	.WriteString(" SET ")
	 := make([]string, len(.SetClauses))
	for ,  := range .SetClauses {
		var  string
		if ,  := .value.(Sqlizer);  {
			, ,  := .ToSql()
			if  != nil {
				return "", nil, 
			}
			 = 
			 = append(, ...)
		} else {
			 = "?"
			 = append(, .value)
		}
		[] = fmt.Sprintf("%s = %s", .column, )
	}
	.WriteString(strings.Join(, ", "))

	if len(.WhereParts) > 0 {
		.WriteString(" WHERE ")
		,  = appendToSql(.WhereParts, , " AND ", )
		if  != nil {
			return
		}
	}

	if len(.OrderBys) > 0 {
		.WriteString(" ORDER BY ")
		.WriteString(strings.Join(.OrderBys, ", "))
	}

	if len(.Limit) > 0 {
		.WriteString(" LIMIT ")
		.WriteString(.Limit)
	}

	if len(.Offset) > 0 {
		.WriteString(" OFFSET ")
		.WriteString(.Offset)
	}

	if len(.Suffixes) > 0 {
		.WriteString(" ")
		,  = appendToSql(.Suffixes, , " ", )
		if  != nil {
			return
		}
	}

	,  = .PlaceholderFormat.ReplacePlaceholders(.String())
	return
}
Builder
UpdateBuilder builds SQL UPDATE statements.
Format methods
PlaceholderFormat sets PlaceholderFormat (e.g. Question or Dollar) for the query.
func ( UpdateBuilder) ( PlaceholderFormat) UpdateBuilder {
	return builder.Set(, "PlaceholderFormat", ).(UpdateBuilder)
}
Runner methods
RunWith sets a Runner (like database/sql.DB) to be used with e.g. Exec.
func ( UpdateBuilder) ( BaseRunner) UpdateBuilder {
	return setRunWith(, ).(UpdateBuilder)
}
Exec builds and Execs the query with the Runner set by RunWith.
func ( UpdateBuilder) () (sql.Result, error) {
	 := builder.GetStruct().(updateData)
	return .Exec()
}

func ( UpdateBuilder) () (*sql.Rows, error) {
	 := builder.GetStruct().(updateData)
	return .Query()
}

func ( UpdateBuilder) () RowScanner {
	 := builder.GetStruct().(updateData)
	return .QueryRow()
}

func ( UpdateBuilder) ( ...interface{}) error {
	return .QueryRow().Scan(...)
}
SQL methods
ToSql builds the query into a SQL string and bound args.
func ( UpdateBuilder) () (string, []interface{}, error) {
	 := builder.GetStruct().(updateData)
	return .ToSql()
}
Prefix adds an expression to the beginning of the query
func ( UpdateBuilder) ( string,  ...interface{}) UpdateBuilder {
	return .PrefixExpr(Expr(, ...))
}
PrefixExpr adds an expression to the very beginning of the query
func ( UpdateBuilder) ( Sqlizer) UpdateBuilder {
	return builder.Append(, "Prefixes", ).(UpdateBuilder)
}
Table sets the table to be updated.
func ( UpdateBuilder) ( string) UpdateBuilder {
	return builder.Set(, "Table", ).(UpdateBuilder)
}
Set adds SET clauses to the query.
func ( UpdateBuilder) ( string,  interface{}) UpdateBuilder {
	return builder.Append(, "SetClauses", setClause{column: , value: }).(UpdateBuilder)
}
SetMap is a convenience method which calls .Set for each key/value pair in clauses.
func ( UpdateBuilder) ( map[string]interface{}) UpdateBuilder {
	 := make([]string, len())
	 := 0
	for  := range  {
		[] = 
		++
	}
	sort.Strings()
	for ,  := range  {
		,  := []
		 = .Set(, )
	}
	return 
}
Where adds WHERE expressions to the query. See SelectBuilder.Where for more information.
func ( UpdateBuilder) ( interface{},  ...interface{}) UpdateBuilder {
	return builder.Append(, "WhereParts", newWherePart(, ...)).(UpdateBuilder)
}
OrderBy adds ORDER BY expressions to the query.
func ( UpdateBuilder) ( ...string) UpdateBuilder {
	return builder.Extend(, "OrderBys", ).(UpdateBuilder)
}
Limit sets a LIMIT clause on the query.
func ( UpdateBuilder) ( uint64) UpdateBuilder {
	return builder.Set(, "Limit", fmt.Sprintf("%d", )).(UpdateBuilder)
}
Offset sets a OFFSET clause on the query.
func ( UpdateBuilder) ( uint64) UpdateBuilder {
	return builder.Set(, "Offset", fmt.Sprintf("%d", )).(UpdateBuilder)
}
Suffix adds an expression to the end of the query
func ( UpdateBuilder) ( string,  ...interface{}) UpdateBuilder {
	return .SuffixExpr(Expr(, ...))
}
SuffixExpr adds an expression to the end of the query
func ( UpdateBuilder) ( Sqlizer) UpdateBuilder {
	return builder.Append(, "Suffixes", ).(UpdateBuilder)