package bbolt
import (
)
const pageHeaderSize = unsafe.Sizeof(page{})
const minKeysPerPage = 2
const branchPageElementSize = unsafe.Sizeof(branchPageElement{})
const leafPageElementSize = unsafe.Sizeof(leafPageElement{})
const (
branchPageFlag = 0x01
leafPageFlag = 0x02
metaPageFlag = 0x04
freelistPageFlag = 0x10
)
const (
bucketLeafFlag = 0x01
)
type pgid uint64
type page struct {
id pgid
flags uint16
count uint16
overflow uint32
}
func ( *page) () string {
if (.flags & branchPageFlag) != 0 {
return "branch"
} else if (.flags & leafPageFlag) != 0 {
return "leaf"
} else if (.flags & metaPageFlag) != 0 {
return "meta"
} else if (.flags & freelistPageFlag) != 0 {
return "freelist"
}
return fmt.Sprintf("unknown<%02x>", .flags)
}
func ( *page) () *meta {
return (*meta)(unsafeAdd(unsafe.Pointer(), unsafe.Sizeof(*)))
}
func ( *page) ( uint16) *leafPageElement {
return (*leafPageElement)(unsafeIndex(unsafe.Pointer(), unsafe.Sizeof(*),
leafPageElementSize, int()))
}
func ( *page) () []leafPageElement {
if .count == 0 {
return nil
}
var []leafPageElement
:= unsafeAdd(unsafe.Pointer(), unsafe.Sizeof(*))
unsafeSlice(unsafe.Pointer(&), , int(.count))
return
}
func ( *page) ( uint16) *branchPageElement {
return (*branchPageElement)(unsafeIndex(unsafe.Pointer(), unsafe.Sizeof(*),
unsafe.Sizeof(branchPageElement{}), int()))
}
func ( *page) () []branchPageElement {
if .count == 0 {
return nil
}
var []branchPageElement
:= unsafeAdd(unsafe.Pointer(), unsafe.Sizeof(*))
unsafeSlice(unsafe.Pointer(&), , int(.count))
return
}
func ( *page) ( int) {
:= unsafeByteSlice(unsafe.Pointer(), 0, 0, )
fmt.Fprintf(os.Stderr, "%x\n", )
}
type pages []*page
func ( pages) () int { return len() }
func ( pages) (, int) { [], [] = [], [] }
func ( pages) (, int) bool { return [].id < [].id }
type branchPageElement struct {
pos uint32
ksize uint32
pgid pgid
}
func ( *branchPageElement) () []byte {
return unsafeByteSlice(unsafe.Pointer(), 0, int(.pos), int(.pos)+int(.ksize))
}
type leafPageElement struct {
flags uint32
pos uint32
ksize uint32
vsize uint32
}
func ( *leafPageElement) () []byte {
:= int(.pos)
:= + int(.ksize)
return unsafeByteSlice(unsafe.Pointer(), 0, , )
}
func ( *leafPageElement) () []byte {
:= int(.pos) + int(.ksize)
:= + int(.vsize)
return unsafeByteSlice(unsafe.Pointer(), 0, , )
}
type PageInfo struct {
ID int
Type string
Count int
OverflowCount int
}
type pgids []pgid
func ( pgids) () int { return len() }
func ( pgids) (, int) { [], [] = [], [] }
func ( pgids) (, int) bool { return [] < [] }
func ( pgids) ( pgids) pgids {
if len() == 0 {
return
}
if len() == 0 {
return
}
:= make(pgids, len()+len())
mergepgids(, , )
return
}
func (, , pgids) {
if len() < len()+len() {
panic(fmt.Errorf("mergepgids bad len %d < %d + %d", len(), len(), len()))
}
if len() == 0 {
copy(, )
return
}
if len() == 0 {
copy(, )
return
}
:= [:0]
, := ,
if [0] < [0] {
, = ,
}
for len() > 0 {
:= sort.Search(len(), func( int) bool { return [] > [0] })
= append(, [:]...)
if >= len() {
break
}
, = , [:]
}
_ = append(, ...)
}