1
1
package database
2
2
3
3
import (
4
+ "cmp"
4
5
"context"
5
6
"encoding/json"
6
7
"fmt"
8
+ "slices"
7
9
"sort"
8
10
"strconv"
9
11
"strings"
@@ -14,7 +16,6 @@ import (
14
16
log "github.com/sirupsen/logrus"
15
17
16
18
"github.com/crowdsecurity/go-cs-lib/cstime"
17
- "github.com/crowdsecurity/go-cs-lib/slicetools"
18
19
19
20
"github.com/crowdsecurity/crowdsec/pkg/csnet"
20
21
"github.com/crowdsecurity/crowdsec/pkg/database/ent"
@@ -166,9 +167,7 @@ func (c *Client) CreateOrUpdateAlert(ctx context.Context, machineID string, aler
166
167
167
168
decisions := []* ent.Decision {}
168
169
169
- builderChunks := slicetools .Chunks (decisionBuilders , c .decisionBulkSize )
170
-
171
- for _ , builderChunk := range builderChunks {
170
+ for builderChunk := range slices .Chunk (decisionBuilders , max (1 , cmp .Or (c .decisionBulkSize , len (decisionBuilders )))) {
172
171
decisionsCreateRet , err := c .Ent .Decision .CreateBulk (builderChunk ... ).Save (ctx )
173
172
if err != nil {
174
173
return "" , fmt .Errorf ("creating alert decisions: %w" , err )
@@ -179,9 +178,7 @@ func (c *Client) CreateOrUpdateAlert(ctx context.Context, machineID string, aler
179
178
180
179
// now that we bulk created missing decisions, let's update the alert
181
180
182
- decisionChunks := slicetools .Chunks (decisions , c .decisionBulkSize )
183
-
184
- for _ , decisionChunk := range decisionChunks {
181
+ for decisionChunk := range slices .Chunk (decisions , max (1 , cmp .Or (c .decisionBulkSize , len (decisions )))) {
185
182
err = c .Ent .Alert .Update ().Where (alert .UUID (alertItem .UUID )).AddDecisions (decisionChunk ... ).Exec (ctx )
186
183
if err != nil {
187
184
return "" , fmt .Errorf ("updating alert %s: %w" , alertItem .UUID , err )
@@ -329,9 +326,7 @@ func (c *Client) UpdateCommunityBlocklist(ctx context.Context, alertItem *models
329
326
valueList = append (valueList , * decisionItem .Value )
330
327
}
331
328
332
- deleteChunks := slicetools .Chunks (valueList , c .decisionBulkSize )
333
-
334
- for _ , deleteChunk := range deleteChunks {
329
+ for deleteChunk := range slices .Chunk (valueList , max (1 , cmp .Or (c .decisionBulkSize , len (valueList )))) {
335
330
// Deleting older decisions from capi
336
331
deletedDecisions , err := txClient .Decision .Delete ().
337
332
Where (decision .And (
@@ -346,9 +341,7 @@ func (c *Client) UpdateCommunityBlocklist(ctx context.Context, alertItem *models
346
341
deleted += deletedDecisions
347
342
}
348
343
349
- builderChunks := slicetools .Chunks (decisionBuilders , c .decisionBulkSize )
350
-
351
- for _ , builderChunk := range builderChunks {
344
+ for builderChunk := range slices .Chunk (decisionBuilders , max (1 , cmp .Or (c .decisionBulkSize , len (decisionBuilders )))) {
352
345
insertedDecisions , err := txClient .Decision .CreateBulk (builderChunk ... ).Save (ctx )
353
346
if err != nil {
354
347
return 0 , 0 , 0 , rollbackOnError (txClient , err , "bulk creating decisions" )
@@ -545,8 +538,7 @@ func buildMetaCreates(ctx context.Context, logger log.FieldLogger, client *ent.C
545
538
func buildDecisions (ctx context.Context , logger log.FieldLogger , client * Client , alertItem * models.Alert , stopAtTime time.Time ) ([]* ent.Decision , int , error ) {
546
539
decisions := []* ent.Decision {}
547
540
548
- decisionChunks := slicetools .Chunks (alertItem .Decisions , client .decisionBulkSize )
549
- for _ , decisionChunk := range decisionChunks {
541
+ for decisionChunk := range slices .Chunk (alertItem .Decisions , max (1 , cmp .Or (client .decisionBulkSize , len (alertItem .Decisions )))) {
550
542
decisionRet , err := client .createDecisionChunk (ctx , * alertItem .Simulated , stopAtTime , decisionChunk )
551
543
if err != nil {
552
544
return nil , 0 , fmt .Errorf ("creating alert decisions: %w" , err )
@@ -601,9 +593,8 @@ func saveAlerts(ctx context.Context, c *Client, alertBuilders []*ent.AlertCreate
601
593
ret [i ] = strconv .Itoa (a .ID )
602
594
603
595
d := alertDecisions [i ]
604
- decisionsChunk := slicetools .Chunks (d , c .decisionBulkSize )
605
596
606
- for _ , d2 := range decisionsChunk {
597
+ for d2 := range slices . Chunk ( d , max ( 1 , cmp . Or ( c . decisionBulkSize , len ( d )))) {
607
598
if err := retryOnBusy (func () error {
608
599
_ , err := c .Ent .Alert .Update ().Where (alert .IDEQ (a .ID )).AddDecisions (d2 ... ).Save (ctx )
609
600
return err
@@ -720,10 +711,9 @@ func (c *Client) CreateAlert(ctx context.Context, machineID string, alertList []
720
711
721
712
c .Log .Debugf ("writing %d items" , len (alertList ))
722
713
723
- alertChunks := slicetools .Chunks (alertList , alertCreateBulkSize )
724
714
alertIDs := []string {}
725
715
726
- for _ , alertChunk := range alertChunks {
716
+ for alertChunk := range slices . Chunk ( alertList , max ( 1 , cmp . Or ( alertCreateBulkSize , len ( alertList )))) {
727
717
ids , err := c .createAlertChunk (ctx , machineID , owner , alertChunk )
728
718
if err != nil {
729
719
return nil , fmt .Errorf ("machine '%s': %w" , machineID , err )
0 commit comments