2019-06-21 13:56:57 +02:00
|
|
|
package jet
|
2019-04-20 19:49:29 +02:00
|
|
|
|
|
|
|
|
import (
|
2019-06-20 12:22:19 +02:00
|
|
|
"context"
|
2019-04-20 19:49:29 +02:00
|
|
|
"database/sql"
|
2019-06-05 17:15:20 +02:00
|
|
|
"errors"
|
2019-06-21 13:56:57 +02:00
|
|
|
"github.com/go-jet/jet/execution"
|
2019-04-20 19:49:29 +02:00
|
|
|
)
|
|
|
|
|
|
2019-07-18 17:43:11 +02:00
|
|
|
// DeleteStatement is interface for SQL DELETE statement
|
2019-06-04 12:10:23 +02:00
|
|
|
type DeleteStatement interface {
|
2019-05-12 18:15:23 +02:00
|
|
|
Statement
|
2019-04-20 19:49:29 +02:00
|
|
|
|
2019-06-04 12:10:23 +02:00
|
|
|
WHERE(expression BoolExpression) DeleteStatement
|
2019-06-30 17:16:00 +02:00
|
|
|
|
|
|
|
|
RETURNING(projections ...projection) DeleteStatement
|
2019-04-20 19:49:29 +02:00
|
|
|
}
|
|
|
|
|
|
2019-06-05 17:15:20 +02:00
|
|
|
func newDeleteStatement(table WritableTable) DeleteStatement {
|
2019-04-20 19:49:29 +02:00
|
|
|
return &deleteStatementImpl{
|
|
|
|
|
table: table,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type deleteStatementImpl struct {
|
2019-06-30 17:16:00 +02:00
|
|
|
table WritableTable
|
|
|
|
|
where BoolExpression
|
|
|
|
|
returning []projection
|
2019-04-20 19:49:29 +02:00
|
|
|
}
|
|
|
|
|
|
2019-06-04 12:10:23 +02:00
|
|
|
func (d *deleteStatementImpl) WHERE(expression BoolExpression) DeleteStatement {
|
2019-04-20 19:49:29 +02:00
|
|
|
d.where = expression
|
|
|
|
|
return d
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-30 17:16:00 +02:00
|
|
|
func (d *deleteStatementImpl) RETURNING(projections ...projection) DeleteStatement {
|
|
|
|
|
d.returning = projections
|
|
|
|
|
return d
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-08 10:48:03 +02:00
|
|
|
func (d *deleteStatementImpl) serializeImpl(out *sqlBuilder) error {
|
2019-05-13 12:33:11 +02:00
|
|
|
if d == nil {
|
2019-07-08 13:00:44 +02:00
|
|
|
return errors.New("jet: delete statement is nil")
|
2019-05-13 12:33:11 +02:00
|
|
|
}
|
2019-06-14 14:35:50 +02:00
|
|
|
out.newLine()
|
2019-05-12 18:15:23 +02:00
|
|
|
out.writeString("DELETE FROM")
|
2019-04-20 19:49:29 +02:00
|
|
|
|
|
|
|
|
if d.table == nil {
|
2019-07-08 13:00:44 +02:00
|
|
|
return errors.New("jet: nil tableName")
|
2019-04-20 19:49:29 +02:00
|
|
|
}
|
|
|
|
|
|
2019-07-18 17:43:11 +02:00
|
|
|
if err := d.table.serialize(deleteStatement, out); err != nil {
|
2019-05-12 18:15:23 +02:00
|
|
|
return err
|
2019-04-20 19:49:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if d.where == nil {
|
2019-07-08 13:00:44 +02:00
|
|
|
return errors.New("jet: deleting without a WHERE clause")
|
2019-04-20 19:49:29 +02:00
|
|
|
}
|
|
|
|
|
|
2019-07-18 17:43:11 +02:00
|
|
|
if err := out.writeWhere(deleteStatement, d.where); err != nil {
|
2019-05-12 18:15:23 +02:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-18 17:43:11 +02:00
|
|
|
if err := out.writeReturning(deleteStatement, d.returning); err != nil {
|
2019-06-30 17:16:00 +02:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-12 18:15:23 +02:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (d *deleteStatementImpl) Sql() (query string, args []interface{}, err error) {
|
2019-07-08 10:48:03 +02:00
|
|
|
queryData := &sqlBuilder{}
|
2019-05-12 18:15:23 +02:00
|
|
|
|
|
|
|
|
err = d.serializeImpl(queryData)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
2019-04-20 19:49:29 +02:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-12 18:15:23 +02:00
|
|
|
query, args = queryData.finalize()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (d *deleteStatementImpl) DebugSql() (query string, err error) {
|
2019-06-29 16:58:41 +02:00
|
|
|
return debugSql(d)
|
2019-04-20 19:49:29 +02:00
|
|
|
}
|
2019-05-03 12:51:57 +02:00
|
|
|
|
2019-06-23 18:55:57 +02:00
|
|
|
func (d *deleteStatementImpl) Query(db execution.DB, destination interface{}) error {
|
2019-06-29 16:58:41 +02:00
|
|
|
return query(d, db, destination)
|
2019-05-03 12:51:57 +02:00
|
|
|
}
|
|
|
|
|
|
2019-07-19 10:40:30 +02:00
|
|
|
func (d *deleteStatementImpl) QueryContext(context context.Context, db execution.DB, destination interface{}) error {
|
2019-07-18 17:43:11 +02:00
|
|
|
return queryContext(context, d, db, destination)
|
2019-06-20 12:22:19 +02:00
|
|
|
}
|
|
|
|
|
|
2019-06-23 18:55:57 +02:00
|
|
|
func (d *deleteStatementImpl) Exec(db execution.DB) (res sql.Result, err error) {
|
2019-06-29 16:58:41 +02:00
|
|
|
return exec(d, db)
|
2019-05-03 12:51:57 +02:00
|
|
|
}
|
2019-06-20 12:22:19 +02:00
|
|
|
|
2019-07-19 10:40:30 +02:00
|
|
|
func (d *deleteStatementImpl) ExecContext(context context.Context, db execution.DB) (res sql.Result, err error) {
|
2019-06-29 16:58:41 +02:00
|
|
|
return execContext(d, db, context)
|
2019-06-20 12:22:19 +02:00
|
|
|
}
|