summaryrefslogtreecommitdiff
path: root/vendor/github.com/go-pg/pg/v10/orm/delete.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/go-pg/pg/v10/orm/delete.go')
-rw-r--r--vendor/github.com/go-pg/pg/v10/orm/delete.go158
1 files changed, 158 insertions, 0 deletions
diff --git a/vendor/github.com/go-pg/pg/v10/orm/delete.go b/vendor/github.com/go-pg/pg/v10/orm/delete.go
new file mode 100644
index 000000000..c54cd10f8
--- /dev/null
+++ b/vendor/github.com/go-pg/pg/v10/orm/delete.go
@@ -0,0 +1,158 @@
+package orm
+
+import (
+ "reflect"
+
+ "github.com/go-pg/pg/v10/types"
+)
+
+type DeleteQuery struct {
+ q *Query
+ placeholder bool
+}
+
+var (
+ _ QueryAppender = (*DeleteQuery)(nil)
+ _ QueryCommand = (*DeleteQuery)(nil)
+)
+
+func NewDeleteQuery(q *Query) *DeleteQuery {
+ return &DeleteQuery{
+ q: q,
+ }
+}
+
+func (q *DeleteQuery) String() string {
+ b, err := q.AppendQuery(defaultFmter, nil)
+ if err != nil {
+ panic(err)
+ }
+ return string(b)
+}
+
+func (q *DeleteQuery) Operation() QueryOp {
+ return DeleteOp
+}
+
+func (q *DeleteQuery) Clone() QueryCommand {
+ return &DeleteQuery{
+ q: q.q.Clone(),
+ placeholder: q.placeholder,
+ }
+}
+
+func (q *DeleteQuery) Query() *Query {
+ return q.q
+}
+
+func (q *DeleteQuery) AppendTemplate(b []byte) ([]byte, error) {
+ cp := q.Clone().(*DeleteQuery)
+ cp.placeholder = true
+ return cp.AppendQuery(dummyFormatter{}, b)
+}
+
+func (q *DeleteQuery) AppendQuery(fmter QueryFormatter, b []byte) (_ []byte, err error) {
+ if q.q.stickyErr != nil {
+ return nil, q.q.stickyErr
+ }
+
+ if len(q.q.with) > 0 {
+ b, err = q.q.appendWith(fmter, b)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ b = append(b, "DELETE FROM "...)
+ b, err = q.q.appendFirstTableWithAlias(fmter, b)
+ if err != nil {
+ return nil, err
+ }
+
+ if q.q.hasMultiTables() {
+ b = append(b, " USING "...)
+ b, err = q.q.appendOtherTables(fmter, b)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ b = append(b, " WHERE "...)
+ value := q.q.tableModel.Value()
+
+ if q.q.isSliceModelWithData() {
+ if len(q.q.where) > 0 {
+ b, err = q.q.appendWhere(fmter, b)
+ if err != nil {
+ return nil, err
+ }
+ } else {
+ table := q.q.tableModel.Table()
+ err = table.checkPKs()
+ if err != nil {
+ return nil, err
+ }
+
+ b = appendColumnAndSliceValue(fmter, b, value, table.Alias, table.PKs)
+ }
+ } else {
+ b, err = q.q.mustAppendWhere(fmter, b)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ if len(q.q.returning) > 0 {
+ b, err = q.q.appendReturning(fmter, b)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return b, q.q.stickyErr
+}
+
+func appendColumnAndSliceValue(
+ fmter QueryFormatter, b []byte, slice reflect.Value, alias types.Safe, fields []*Field,
+) []byte {
+ if len(fields) > 1 {
+ b = append(b, '(')
+ }
+ b = appendColumns(b, alias, fields)
+ if len(fields) > 1 {
+ b = append(b, ')')
+ }
+
+ b = append(b, " IN ("...)
+
+ isPlaceholder := isTemplateFormatter(fmter)
+ sliceLen := slice.Len()
+ for i := 0; i < sliceLen; i++ {
+ if i > 0 {
+ b = append(b, ", "...)
+ }
+
+ el := indirect(slice.Index(i))
+
+ if len(fields) > 1 {
+ b = append(b, '(')
+ }
+ for i, f := range fields {
+ if i > 0 {
+ b = append(b, ", "...)
+ }
+ if isPlaceholder {
+ b = append(b, '?')
+ } else {
+ b = f.AppendValue(b, el, 1)
+ }
+ }
+ if len(fields) > 1 {
+ b = append(b, ')')
+ }
+ }
+
+ b = append(b, ')')
+
+ return b
+}