-
Notifications
You must be signed in to change notification settings - Fork 155
/
cursor.go
78 lines (69 loc) · 1.99 KB
/
cursor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
Copyright 2020 The Qmgo Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package qmgo
import (
"context"
"go.mongodb.org/mongo-driver/mongo"
)
// Cursor struct define
type Cursor struct {
ctx context.Context
cursor *mongo.Cursor
err error
}
// Next gets the next document for this cursor. It returns true if there were no errors and the cursor has not been
// exhausted.
func (c *Cursor) Next(result interface{}) bool {
if c.err != nil {
return false
}
if c.cursor.Next(c.ctx) {
err := c.cursor.Decode(result)
if err != nil {
c.err = err
return false
}
return true
}
return false
}
// All iterates the cursor and decodes each document into results. The results parameter must be a pointer to a slice.
// recommend to use All() in struct Query or Aggregate
func (c *Cursor) All(results interface{}) error {
if c.err != nil {
return c.err
}
return c.cursor.All(c.ctx, results)
}
// ID returns the ID of this cursor, or 0 if the cursor has been closed or exhausted.
//func (c *Cursor) ID() int64 {
// if c.err != nil {
// return 0
// }
// return c.cursor.ID()
//}
// Close closes this cursor. Next and TryNext must not be called after Close has been called.
// When the cursor object is no longer in use, it should be actively closed
func (c *Cursor) Close() error {
if c.err != nil {
return c.err
}
return c.cursor.Close(c.ctx)
}
// Err return the last error of Cursor, if no error occurs, return nil
func (c *Cursor) Err() error {
if c.err != nil {
return c.err
}
return c.cursor.Err()
}