-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpostgres_iterator.go
83 lines (72 loc) · 1.58 KB
/
postgres_iterator.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
79
80
81
82
83
package postgreskvdb
import (
"github.com/jackc/pgx/v5"
)
type PostgresIterator struct {
source pgx.Rows
Items item
start []byte
end []byte
isValid bool
}
var _ Iterator = (*PostgresIterator)(nil)
// NewPostgresIterator creates a new PostgresIterator.
func NewPostgresIterator(source pgx.Rows, start, end []byte) *PostgresIterator {
return &PostgresIterator{
source: source,
Items: item{key: nil, value: nil},
isValid: true,
start: start,
end: end,
}
}
// Domain implements Iterator.
func (itr *PostgresIterator) Domain() ([]byte, []byte) {
return itr.start, itr.end
}
// Valid implements Iterator.
func (itr *PostgresIterator) Valid() bool {
return itr.source != nil && itr.isValid
}
// Next implements Iterator.
func (itr *PostgresIterator) Next() {
if itr.Valid() {
if itr.source.Next() {
itr.source.Scan(&itr.Items.key, &itr.Items.value)
} else {
itr.isValid = false
}
} else {
panic("PostgresIterator is invalid")
}
}
// Key implements Iterator.
func (itr *PostgresIterator) Key() []byte {
if itr.Valid() {
return itr.Items.key
} else {
panic("PostgresIterator is invalid")
}
}
// Value implements Iterator.
func (itr *PostgresIterator) Value() []byte {
if itr.Valid() {
return itr.Items.value
} else {
panic("PostgresIterator is invalid")
}
}
// Error implements Iterator.
func (itr *PostgresIterator) Error() error {
if itr.source != nil {
return itr.source.Err()
}
return nil
}
// Close implements Iterator.
func (itr *PostgresIterator) Close() error {
if itr.source != nil {
itr.source.Close()
}
return itr.Error()
}