-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcursor.go
68 lines (60 loc) · 1.52 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
package sophia
import (
"errors"
"unsafe"
)
// Order string type of sophia cursor order
type Order string
// Constants for sophia cursor order
// They are used while creating cursor to select it's direction
const (
GreaterThan Order = ">"
GT Order = GreaterThan
GreaterThanEqual Order = ">="
GTE Order = GreaterThanEqual
LessThan Order = "<"
LT Order = LessThan
LessThanEqual Order = "<="
LTE Order = LessThanEqual
)
const (
// CursorPrefix uses for setting cursor prefix
CursorPrefix = "prefix"
// CursorOrder uses for setting cursor order
CursorOrder = "order"
)
// ErrCursorClosed will be returned in case of closed cursor usage
var ErrCursorClosed = errors.New("usage of closed Cursor")
// Cursor iterates over key-values in a database.
type Cursor struct {
ptr unsafe.Pointer
doc Document
closed bool
}
// Close closes the cursor. If a cursor is not closed, future operations
// on the database can hang indefinitely.
// Cursor won't be accessible after this
func (cur *Cursor) Close() error {
if cur.closed {
return ErrCursorClosed
}
cur.doc.Free()
cur.closed = true
if !spDestroy(cur.ptr) {
return errors.New("cursor: failed to close")
}
return nil
}
// Next fetches the next row for the cursor
// Returns next row if it exists else it will return nil
func (cur *Cursor) Next() Document {
if cur.closed {
return Document{}
}
ptr := spGet(cur.ptr, cur.doc.ptr)
if ptr == nil {
return Document{}
}
cur.doc.ptr = ptr
return cur.doc
}