{{/* Copyright 2019-present Facebook Inc. All rights reserved. This source code is licensed under the Apache 2.0 license found in the LICENSE file in the root directory of this source tree. */}} {{/* gotype: entgo.io/ent/entc/gen.typeScope */}} {{ define "dialect/sql/delete" }} {{ $builder := pascal $.Scope.Builder }} {{ $receiver := $.Scope.Receiver }} {{ $mutation := print $receiver ".mutation" }} func ({{ $receiver}} *{{ $builder }}) sqlExec(ctx context.Context) (int, error) { _spec := sqlgraph.NewDeleteSpec({{ $.Package }}.Table, {{ if $.HasOneFieldID }}sqlgraph.NewFieldSpec({{ $.Package }}.{{ $.ID.Constant }}, field.{{ $.ID.Type.ConstName }}){{ else }}nil{{ end }}) {{- /* Allow mutating the sqlgraph.DeleteSpec by ent extensions or user templates.*/}} {{- with $tmpls := matchTemplate "dialect/sql/delete/spec/*" }} {{- range $tmpl := $tmpls }} {{- xtemplate $tmpl $ }} {{- end }} {{- end }} if ps := {{ $mutation }}.Predicates(); len(ps) > 0 { _spec.Predicate = func(selector *sql.Selector) { for i := range ps { ps[i](selector) } } } {{- if $.HasBlobFields }} // Collect blob keys before deleting rows so we can remove blobs from storage afterward. _blobCleanup, _blobErr := ent.NewBlobs({{ $mutation }}.blobOpeners.{{ $.Name }}).Delete(ctx, &sqlgraph.BlobSpec{ Driver: {{ $receiver }}.driver, Predicate: _spec.Predicate, Table: {{ $.Package }}.Table, Columns: map[string]string{ {{- range $f := $.BlobFields }} {{ $.Package }}.{{ $f.Constant }}: "{{ $f.BlobKeyColumn }}", {{- end }} }, }) if _blobErr != nil { return 0, _blobErr } {{- end }} affected, err := sqlgraph.DeleteNodes(ctx, {{ $receiver}}.driver, _spec) if err != nil && sqlgraph.IsConstraintError(err) { err = &ConstraintError{msg: err.Error(), wrap: err} } {{- if $.HasBlobFields }} if err == nil { if txd, ok := {{ $receiver }}.driver.(*txDriver); ok { txd.mu.Lock() txd.onCommit = append(txd.onCommit, func(next Committer) Committer { return CommitFunc(func(ctx context.Context, tx *Tx) error { if err := next.Commit(ctx, tx); err != nil { return err } return _blobCleanup(ctx) }) }) txd.mu.Unlock() } else { err = _blobCleanup(ctx) } } {{- end }} {{ $mutation }}.done = true return affected, err } {{ end }}