diff --git a/mongox/database/loadarray.go b/mongox/database/loadarray.go index 61d128e..d9b5139 100644 --- a/mongox/database/loadarray.go +++ b/mongox/database/loadarray.go @@ -48,6 +48,8 @@ func (d *Database) LoadArray(target interface{}, filters ...interface{}) (err er return } + defer composed.OnClose().Invoke(d.Context(), target) + for i = 0; result.Next(d.Context()); { var elem interface{} diff --git a/mongox/database/loadone.go b/mongox/database/loadone.go index 5ab5f41..8bc1db5 100644 --- a/mongox/database/loadone.go +++ b/mongox/database/loadone.go @@ -25,6 +25,8 @@ func (d *Database) LoadOne(target interface{}, filters ...interface{}) (err erro return fmt.Errorf("can't create find result: %w", err) } + defer composed.OnClose().Invoke(d.Context(), target) + hasNext := result.Next(d.Context()) if result.Err() != nil { return err diff --git a/mongox/database/streamloader.go b/mongox/database/streamloader.go index 0146bff..4f4ac72 100644 --- a/mongox/database/streamloader.go +++ b/mongox/database/streamloader.go @@ -72,6 +72,9 @@ func (l *StreamLoader) Cursor() (cursor *mongox.Cursor) { // Close cursor func (l *StreamLoader) Close() (err error) { + + _ = l.query.OnClose().Invoke(l.ctx, l.target) + return l.cur.Close(l.ctx) } diff --git a/mongox/query/callbacks.go b/mongox/query/callbacks.go index ef8da3a..3dc1437 100644 --- a/mongox/query/callbacks.go +++ b/mongox/query/callbacks.go @@ -7,7 +7,10 @@ import ( type Callback func(ctx context.Context, iter interface{}) (err error) type Callbacks []Callback -type OnDecode Callback +type ( + OnDecode Callback + OnClose Callback +) // Invoke callbacks sequence func (c Callbacks) Invoke(ctx context.Context, iter interface{}) (err error) { diff --git a/mongox/query/compose.go b/mongox/query/compose.go index 21da20f..e64ff88 100644 --- a/mongox/query/compose.go +++ b/mongox/query/compose.go @@ -130,8 +130,13 @@ func applyCallbacks(q *Query, f interface{}) (ok bool) { switch cb := f.(type) { case OnDecode: q.ondecode = append(q.ondecode, Callback(cb)) - ok = true + case OnClose: + q.onclose = append(q.onclose, Callback(cb)) + default: + return } + ok = true + return } diff --git a/mongox/query/query.go b/mongox/query/query.go index a4f05ea..c57af98 100644 --- a/mongox/query/query.go +++ b/mongox/query/query.go @@ -12,6 +12,7 @@ type Query struct { skipper Skipper preloader Preloader ondecode Callbacks + onclose Callbacks } // And function pushes the elem query to the $and array of the query @@ -81,6 +82,10 @@ func (q *Query) OnDecode() (callbacks Callbacks) { return q.ondecode } +func (q *Query) OnClose() (callbacks Callbacks) { + return q.onclose +} + // Empty checks the query for any content func (q *Query) Empty() (isEmpty bool) { return len(q.m) == 0