package bbolt
import (
"fmt"
"os"
"sort"
"unsafe"
)
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 (p *page ) typ () string {
if (p .flags & branchPageFlag ) != 0 {
return "branch"
} else if (p .flags & leafPageFlag ) != 0 {
return "leaf"
} else if (p .flags & metaPageFlag ) != 0 {
return "meta"
} else if (p .flags & freelistPageFlag ) != 0 {
return "freelist"
}
return fmt .Sprintf ("unknown<%02x>" , p .flags )
}
func (p *page ) meta () *meta {
return (*meta )(unsafeAdd (unsafe .Pointer (p ), unsafe .Sizeof (*p )))
}
func (p *page ) leafPageElement (index uint16 ) *leafPageElement {
return (*leafPageElement )(unsafeIndex (unsafe .Pointer (p ), unsafe .Sizeof (*p ),
leafPageElementSize , int (index )))
}
func (p *page ) leafPageElements () []leafPageElement {
if p .count == 0 {
return nil
}
var elems []leafPageElement
data := unsafeAdd (unsafe .Pointer (p ), unsafe .Sizeof (*p ))
unsafeSlice (unsafe .Pointer (&elems ), data , int (p .count ))
return elems
}
func (p *page ) branchPageElement (index uint16 ) *branchPageElement {
return (*branchPageElement )(unsafeIndex (unsafe .Pointer (p ), unsafe .Sizeof (*p ),
unsafe .Sizeof (branchPageElement {}), int (index )))
}
func (p *page ) branchPageElements () []branchPageElement {
if p .count == 0 {
return nil
}
var elems []branchPageElement
data := unsafeAdd (unsafe .Pointer (p ), unsafe .Sizeof (*p ))
unsafeSlice (unsafe .Pointer (&elems ), data , int (p .count ))
return elems
}
func (p *page ) hexdump (n int ) {
buf := unsafeByteSlice (unsafe .Pointer (p ), 0 , 0 , n )
fmt .Fprintf (os .Stderr , "%x\n" , buf )
}
type pages []*page
func (s pages ) Len () int { return len (s ) }
func (s pages ) Swap (i , j int ) { s [i ], s [j ] = s [j ], s [i ] }
func (s pages ) Less (i , j int ) bool { return s [i ].id < s [j ].id }
type branchPageElement struct {
pos uint32
ksize uint32
pgid pgid
}
func (n *branchPageElement ) key () []byte {
return unsafeByteSlice (unsafe .Pointer (n ), 0 , int (n .pos ), int (n .pos )+int (n .ksize ))
}
type leafPageElement struct {
flags uint32
pos uint32
ksize uint32
vsize uint32
}
func (n *leafPageElement ) key () []byte {
i := int (n .pos )
j := i + int (n .ksize )
return unsafeByteSlice (unsafe .Pointer (n ), 0 , i , j )
}
func (n *leafPageElement ) value () []byte {
i := int (n .pos ) + int (n .ksize )
j := i + int (n .vsize )
return unsafeByteSlice (unsafe .Pointer (n ), 0 , i , j )
}
type PageInfo struct {
ID int
Type string
Count int
OverflowCount int
}
type pgids []pgid
func (s pgids ) Len () int { return len (s ) }
func (s pgids ) Swap (i , j int ) { s [i ], s [j ] = s [j ], s [i ] }
func (s pgids ) Less (i , j int ) bool { return s [i ] < s [j ] }
func (a pgids ) merge (b pgids ) pgids {
if len (a ) == 0 {
return b
}
if len (b ) == 0 {
return a
}
merged := make (pgids , len (a )+len (b ))
mergepgids (merged , a , b )
return merged
}
func mergepgids(dst , a , b pgids ) {
if len (dst ) < len (a )+len (b ) {
panic (fmt .Errorf ("mergepgids bad len %d < %d + %d" , len (dst ), len (a ), len (b )))
}
if len (a ) == 0 {
copy (dst , b )
return
}
if len (b ) == 0 {
copy (dst , a )
return
}
merged := dst [:0 ]
lead , follow := a , b
if b [0 ] < a [0 ] {
lead , follow = b , a
}
for len (lead ) > 0 {
n := sort .Search (len (lead ), func (i int ) bool { return lead [i ] > follow [0 ] })
merged = append (merged , lead [:n ]...)
if n >= len (lead ) {
break
}
lead , follow = follow , lead [n :]
}
_ = append (merged , follow ...)
}
The pages are generated with Golds v0.8.2 . (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 .