/
ops.go
57 lines (49 loc) · 1.17 KB
/
ops.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
package edb
import (
"errors"
"fmt"
"reflect"
)
var Break = errors.New("break")
func Proto[T any]() any {
return ((*T)(nil))
}
func SGetRaw(txh Txish, sk *SKey) []byte {
tx := txh.DBTx()
buck := tx.btx.Bucket(sk.mp.buck.Raw())
return buck.Get(sk.keyBytes)
}
func SPutRaw(txh Txish, sk *SKey, raw []byte) {
tx := txh.DBTx()
buck := tx.btx.Bucket(sk.mp.buck.Raw())
tx.markWritten()
err := buck.Put(sk.keyBytes, raw)
if err != nil {
panic(fmt.Errorf("SPut %v: %w", sk, err))
}
}
func SGet[T any](txh Txish, sk *SKey, v *T) bool {
tx := txh.DBTx()
raw := SGetRaw(tx, sk)
if raw == nil {
return false
}
err := sk.valueEnc.DecodeValue(raw, reflect.ValueOf(v))
if err != nil {
panic(fmt.Errorf("SGet %v: %w", sk, err))
}
return true
}
func SPut[T any](txh Txish, sk *SKey, v *T) {
tx := txh.DBTx()
valueBuf := valueBytesPool.Get().([]byte)
tx.addValueBuf(valueBuf)
valueRaw := sk.valueEnc.EncodeValue(valueBuf, reflect.ValueOf(v))
SPutRaw(tx, sk, valueRaw)
}
func CountAll(txh Txish, tbl *Table) int {
tx := txh.DBTx()
tableBuck := nonNil(tx.btx.Bucket(tbl.buck.Raw()))
dataBuck := nonNil(tableBuck.Bucket(dataBucket.Raw()))
return dataBuck.Stats().KeyN
}