package badger
import (
"encoding/binary"
"fmt"
"time"
"unsafe"
)
type valuePointer struct {
Fid uint32
Len uint32
Offset uint32
}
const vptrSize = unsafe .Sizeof (valuePointer {})
func (p valuePointer ) Less (o valuePointer ) bool {
if p .Fid != o .Fid {
return p .Fid < o .Fid
}
if p .Offset != o .Offset {
return p .Offset < o .Offset
}
return p .Len < o .Len
}
func (p valuePointer ) IsZero () bool {
return p .Fid == 0 && p .Offset == 0 && p .Len == 0
}
func (p valuePointer ) Encode () []byte {
b := make ([]byte , vptrSize )
*(*valuePointer )(unsafe .Pointer (&b [0 ])) = p
return b
}
func (p *valuePointer ) Decode (b []byte ) {
copy (((*[vptrSize ]byte )(unsafe .Pointer (p ))[:]), b [:vptrSize ])
}
type header struct {
klen uint32
vlen uint32
expiresAt uint64
meta byte
userMeta byte
}
const (
maxHeaderSize = 22
)
func (h header ) Encode (out []byte ) int {
out [0 ], out [1 ] = h .meta , h .userMeta
index := 2
index += binary .PutUvarint (out [index :], uint64 (h .klen ))
index += binary .PutUvarint (out [index :], uint64 (h .vlen ))
index += binary .PutUvarint (out [index :], h .expiresAt )
return index
}
func (h *header ) Decode (buf []byte ) int {
h .meta , h .userMeta = buf [0 ], buf [1 ]
index := 2
klen , count := binary .Uvarint (buf [index :])
h .klen = uint32 (klen )
index += count
vlen , count := binary .Uvarint (buf [index :])
h .vlen = uint32 (vlen )
index += count
h .expiresAt , count = binary .Uvarint (buf [index :])
return index + count
}
func (h *header ) DecodeFrom (reader *hashReader ) (int , error ) {
var err error
h .meta , err = reader .ReadByte ()
if err != nil {
return 0 , err
}
h .userMeta , err = reader .ReadByte ()
if err != nil {
return 0 , err
}
klen , err := binary .ReadUvarint (reader )
if err != nil {
return 0 , err
}
h .klen = uint32 (klen )
vlen , err := binary .ReadUvarint (reader )
if err != nil {
return 0 , err
}
h .vlen = uint32 (vlen )
h .expiresAt , err = binary .ReadUvarint (reader )
if err != nil {
return 0 , err
}
return reader .bytesRead , nil
}
type Entry struct {
Key []byte
Value []byte
ExpiresAt uint64
version uint64
offset uint32
UserMeta byte
meta byte
hlen int
valThreshold int64
}
func (e *Entry ) isZero () bool {
return len (e .Key ) == 0
}
func (e *Entry ) estimateSizeAndSetThreshold (threshold int64 ) int64 {
if e .valThreshold == 0 {
e .valThreshold = threshold
}
k := int64 (len (e .Key ))
v := int64 (len (e .Value ))
if v < e .valThreshold {
return k + v + 2
}
return k + 12 + 2
}
func (e *Entry ) skipVlogAndSetThreshold (threshold int64 ) bool {
if e .valThreshold == 0 {
e .valThreshold = threshold
}
return int64 (len (e .Value )) < e .valThreshold
}
func (e Entry ) print (prefix string ) {
fmt .Printf ("%s Key: %s Meta: %d UserMeta: %d Offset: %d len(val)=%d" ,
prefix , e .Key , e .meta , e .UserMeta , e .offset , len (e .Value ))
}
func NewEntry (key , value []byte ) *Entry {
return &Entry {
Key : key ,
Value : value ,
}
}
func (e *Entry ) WithMeta (meta byte ) *Entry {
e .UserMeta = meta
return e
}
func (e *Entry ) WithDiscard () *Entry {
e .meta = bitDiscardEarlierVersions
return e
}
func (e *Entry ) WithTTL (dur time .Duration ) *Entry {
e .ExpiresAt = uint64 (time .Now ().Add (dur ).Unix ())
return e
}
func (e *Entry ) withMergeBit () *Entry {
e .meta = bitMergeEntry
return e
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .