Builder is not in a position to validate the statement and the effort is duplicated when the query is build. The checked errors are simple and do not occur most of the time.
96 lines
1.7 KiB
Go
96 lines
1.7 KiB
Go
package qb
|
|
|
|
import (
|
|
"bytes"
|
|
)
|
|
|
|
// UPDATE reference:
|
|
// http://docs.datastax.com/en/dse/5.1/cql/cql/cql_reference/cql_commands/cqlUpdate.html
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
type UpdateBuilder struct {
|
|
table string
|
|
using using
|
|
columns columns
|
|
where where
|
|
_if _if
|
|
exists bool
|
|
}
|
|
|
|
// Update returns a new UpdateBuilder with the given table name.
|
|
func Update(table string) *UpdateBuilder {
|
|
return &UpdateBuilder{
|
|
table: table,
|
|
}
|
|
}
|
|
|
|
func (b *UpdateBuilder) ToCql() (stmt string, names []string) {
|
|
cql := bytes.Buffer{}
|
|
|
|
cql.WriteString("UPDATE ")
|
|
cql.WriteString(b.table)
|
|
cql.WriteByte(' ')
|
|
|
|
b.using.writeCql(&cql)
|
|
|
|
cql.WriteString("SET ")
|
|
for i, c := range b.columns {
|
|
cql.WriteString(c)
|
|
cql.WriteString("=?")
|
|
if i < len(b.columns)-1 {
|
|
cql.WriteByte(',')
|
|
}
|
|
}
|
|
names = append(names, b.columns...)
|
|
cql.WriteByte(' ')
|
|
|
|
names = append(names, b.where.writeCql(&cql)...)
|
|
names = append(names, b._if.writeCql(&cql)...)
|
|
|
|
if b.exists {
|
|
cql.WriteString("IF EXISTS ")
|
|
}
|
|
|
|
stmt = cql.String()
|
|
return
|
|
}
|
|
|
|
// Table sets the table to be updated.
|
|
func (b *UpdateBuilder) Table(table string) *UpdateBuilder {
|
|
b.table = table
|
|
return b
|
|
}
|
|
|
|
func (b *UpdateBuilder) Timestamp(t time.Time) *UpdateBuilder {
|
|
b.using.timestamp = t
|
|
return b
|
|
}
|
|
|
|
func (b *UpdateBuilder) TTL(d time.Duration) *UpdateBuilder {
|
|
b.using.ttl = d
|
|
return b
|
|
}
|
|
|
|
func (b *UpdateBuilder) Set(columns ...string) *UpdateBuilder {
|
|
b.columns = append(b.columns, columns...)
|
|
return b
|
|
}
|
|
|
|
func (b *UpdateBuilder) Where(w ...Cmp) *UpdateBuilder {
|
|
b.where = append(b.where, w...)
|
|
return b
|
|
}
|
|
|
|
func (b *UpdateBuilder) If(w ...Cmp) *UpdateBuilder {
|
|
b._if = append(b._if, w...)
|
|
return b
|
|
}
|
|
|
|
func (b *UpdateBuilder) Existing() *UpdateBuilder {
|
|
b.exists = true
|
|
return b
|
|
}
|