diff --git a/mongox/database/deletearray.go b/mongox/database/deletearray.go index 2f98698..a591730 100644 --- a/mongox/database/deletearray.go +++ b/mongox/database/deletearray.go @@ -46,14 +46,21 @@ func (d *Database) DeleteArray(target interface{}, filters ...interface{}) (err ids = append(ids, base.GetID(elem.Interface())) } + defer func() { + invokerr := composed.OnClose().Invoke(ctx, target) + if err == nil { + err = invokerr + } + + return + }() + if len(ids) == 0 { return fmt.Errorf("can't delete zero elements") } composed.And(primitive.M{"_id": primitive.M{"$in": ids}}) - defer composed.OnClose().Invoke(ctx, target) - result, err := collection.DeleteMany(ctx, composed.M(), opts) if err != nil { return diff --git a/mongox/database/deleteone.go b/mongox/database/deleteone.go index 59c60ee..6f33c4a 100644 --- a/mongox/database/deleteone.go +++ b/mongox/database/deleteone.go @@ -33,7 +33,14 @@ func (d *Database) DeleteOne(target interface{}, filters ...interface{}) (err er protected.V = time.Now().Unix() } - defer composed.OnClose().Invoke(ctx, target) + defer func() { + invokerr := composed.OnClose().Invoke(ctx, target) + if err == nil { + err = invokerr + } + + return + }() result := collection.FindOneAndDelete(ctx, composed.M(), opts) if result.Err() != nil { diff --git a/mongox/database/loadarray.go b/mongox/database/loadarray.go index 79072a5..b618647 100644 --- a/mongox/database/loadarray.go +++ b/mongox/database/loadarray.go @@ -39,6 +39,23 @@ func (d *Database) LoadArray(target interface{}, filters ...interface{}) (err er var result *mongox.Cursor var i int + defer func() { + + if result != nil { + closerr := result.Close(ctx) + if err == nil { + err = closerr + } + } + + invokerr := composed.OnClose().Invoke(ctx, target) + if err == nil { + err = invokerr + } + + return + }() + if hasPreloader { result, err = d.createAggregateLoad(zeroElem.Interface(), composed) } else { @@ -49,8 +66,6 @@ func (d *Database) LoadArray(target interface{}, filters ...interface{}) (err er return } - defer composed.OnClose().Invoke(ctx, target) - for i = 0; result.Next(ctx); { var elem interface{} @@ -68,13 +83,11 @@ func (d *Database) LoadArray(target interface{}, filters ...interface{}) (err er err = result.Decode(elem) } if err != nil { - _ = result.Close(ctx) return } err = composed.OnDecode().Invoke(ctx, elem) if err != nil { - _ = result.Close(ctx) return } @@ -84,5 +97,5 @@ func (d *Database) LoadArray(target interface{}, filters ...interface{}) (err er targetSliceV = targetSliceV.Slice(0, i) targetV.Elem().Set(targetSliceV) - return result.Close(ctx) + return } diff --git a/mongox/database/loadone.go b/mongox/database/loadone.go index 3ae7027..c121e3e 100644 --- a/mongox/database/loadone.go +++ b/mongox/database/loadone.go @@ -17,6 +17,23 @@ func (d *Database) LoadOne(target interface{}, filters ...interface{}) (err erro var result *mongox.Cursor + defer func() { + + if result != nil { + closerr := result.Close(ctx) + if err == nil { + err = closerr + } + } + + invokerr := composed.OnClose().Invoke(ctx, target) + if err == nil { + err = invokerr + } + + return + }() + if hasPreloader { result, err = d.createAggregateLoad(target, composed) } else { @@ -26,8 +43,6 @@ func (d *Database) LoadOne(target interface{}, filters ...interface{}) (err erro return fmt.Errorf("can't create find result: %w", err) } - defer composed.OnClose().Invoke(ctx, target) - hasNext := result.Next(ctx) if result.Err() != nil { return err diff --git a/mongox/database/saveone.go b/mongox/database/saveone.go index 6c39db4..68ad48f 100644 --- a/mongox/database/saveone.go +++ b/mongox/database/saveone.go @@ -32,7 +32,14 @@ func (d *Database) SaveOne(source interface{}, filters ...interface{}) (err erro protected.V = time.Now().Unix() } - defer composed.OnClose().Invoke(ctx, source) + defer func() { + invokerr := composed.OnClose().Invoke(ctx, source) + if err == nil { + err = invokerr + } + + return + }() result := collection.FindOneAndReplace(ctx, composed.M(), source, opts) if result.Err() != nil { diff --git a/mongox/database/streamloader.go b/mongox/database/streamloader.go index 4f4ac72..6bd5d19 100644 --- a/mongox/database/streamloader.go +++ b/mongox/database/streamloader.go @@ -73,9 +73,20 @@ func (l *StreamLoader) Cursor() (cursor *mongox.Cursor) { // Close cursor func (l *StreamLoader) Close() (err error) { - _ = l.query.OnClose().Invoke(l.ctx, l.target) + closerr := l.cur.Close(l.ctx) + invokerr := l.query.OnClose().Invoke(l.ctx, l.target) - return l.cur.Close(l.ctx) + if closerr != nil { + err = closerr + return + } + + if invokerr != nil { + err = invokerr + return + } + + return } func (l *StreamLoader) Err() (err error) {