@@ -5,12 +5,13 @@ import (
55 stdsql "database/sql"
66 "errors"
77 "fmt"
8+ "reflect"
89
910 "github.com/azer/crud/v2/meta"
1011 "github.com/azer/crud/v2/sql"
1112)
1213
13- func deleteRow (ctx context.Context , exec ExecFn , record interface {} ) (stdsql.Result , error ) {
14+ func deleteRow (ctx context.Context , exec ExecFn , record any ) (stdsql.Result , error ) {
1415 table , err := NewTable (record )
1516
1617 if err != nil {
@@ -25,7 +26,31 @@ func deleteRow(ctx context.Context, exec ExecFn, record interface{}) (stdsql.Res
2526 return exec (ctx , sql .DeleteQuery (table .SQLName , pk .SQL .Name ), meta .StructFieldValue (record , pk .Name ))
2627}
2728
28- func mustDelete (ctx context.Context , exec ExecFn , record interface {}) error {
29+ func deleteRows (ctx context.Context , exec ExecFn , records []any ) (stdsql.Result , error ) {
30+ if len (records ) == 0 {
31+ return nil , errors .New ("no records to delete" )
32+ }
33+
34+ table , err := NewTable (records [0 ])
35+ if err != nil {
36+ return nil , err
37+ }
38+
39+ pk := table .PrimaryKeyField ()
40+ if pk == nil {
41+ return nil , fmt .Errorf ("Table '%s' (%s) doesn't have a primary-key field" , table .Name , table .SQLName )
42+ }
43+
44+ pkValues := make ([]any , 0 , len (records ))
45+ for _ , record := range records {
46+ pkValue := meta .StructFieldValue (record , pk .Name )
47+ pkValues = append (pkValues , pkValue )
48+ }
49+
50+ return exec (ctx , sql .BulkDeleteQuery (table .SQLName , pk .SQL .Name , len (records )), pkValues ... )
51+ }
52+
53+ func mustDelete (ctx context.Context , exec ExecFn , record any ) error {
2954 result , err := deleteRow (ctx , exec , record )
3055 if err != nil {
3156 return err
@@ -42,3 +67,35 @@ func mustDelete(ctx context.Context, exec ExecFn, record interface{}) error {
4267
4368 return nil
4469}
70+
71+ func mustBulkDelete (ctx context.Context , exec ExecFn , value any ) error {
72+ v := reflect .ValueOf (value )
73+ if v .Kind () != reflect .Slice {
74+ return errors .New ("records must be a slice" )
75+ }
76+
77+ records := make ([]any , 0 , v .Len ())
78+ for i := 0 ; i < v .Len (); i ++ {
79+ records = append (records , v .Index (i ).Interface ())
80+ }
81+
82+ if len (records ) == 0 {
83+ return errors .New ("no records to delete" )
84+ }
85+
86+ result , err := deleteRows (ctx , exec , records )
87+ if err != nil {
88+ return err
89+ }
90+
91+ count , err := result .RowsAffected ()
92+ if err != nil {
93+ return err
94+ }
95+
96+ if count == 0 {
97+ return stdsql .ErrNoRows
98+ }
99+
100+ return nil
101+ }
0 commit comments