diff options
Diffstat (limited to 'buckets.go')
-rw-r--r-- | buckets.go | 110 |
1 files changed, 0 insertions, 110 deletions
diff --git a/buckets.go b/buckets.go deleted file mode 100644 index 3226873..0000000 --- a/buckets.go +++ /dev/null @@ -1,110 +0,0 @@ -package bolt - -import ( - "sort" - "unsafe" -) - -// buckets represents a in-memory buckets page. -type buckets struct { - pgid pgid - items map[string]*bucket -} - -// size returns the size of the page after serialization. -func (b *buckets) size() int { - var size = pageHeaderSize - for key := range b.items { - size += int(unsafe.Sizeof(bucket{})) + len(key) - } - return size -} - -// get retrieves a bucket by name. -func (b *buckets) get(key string) *bucket { - return b.items[key] -} - -// put sets a new value for a bucket. -func (b *buckets) put(key string, item *bucket) { - b.items[key] = item -} - -// del deletes a bucket by name. -func (b *buckets) del(key string) { - if item := b.items[key]; item != nil { - delete(b.items, key) - } -} - -// read initializes the data from an on-disk page. -func (b *buckets) read(p *page) { - b.pgid = p.id - b.items = make(map[string]*bucket) - - var items []*bucket - var keys []string - - // Read items. - nodes := (*[maxNodesPerPage]bucket)(unsafe.Pointer(&p.ptr)) - for i := 0; i < int(p.count); i++ { - node := &nodes[i] - items = append(items, node) - } - - // Read keys. - buf := (*[maxAllocSize]byte)(unsafe.Pointer(&nodes[p.count]))[:] - for i := 0; i < int(p.count); i++ { - size := int(buf[0]) - buf = buf[1:] - keys = append(keys, string(buf[:size])) - buf = buf[size:] - } - - // Associate keys and items. - for index, key := range keys { - b.items[key] = &bucket{ - root: items[index].root, - sequence: items[index].sequence, - } - } -} - -// write writes the items onto a page. -func (b *buckets) write(p *page) { - // Initialize page. - p.flags |= bucketsPageFlag - p.count = uint16(len(b.items)) - - // Sort keys. - var keys []string - for key := range b.items { - keys = append(keys, key) - } - sort.StringSlice(keys).Sort() - - // Write each bucket to the page. - items := (*[maxNodesPerPage]bucket)(unsafe.Pointer(&p.ptr)) - for index, key := range keys { - items[index] = *b.items[key] - } - - // Write each key to the page. - buf := (*[maxAllocSize]byte)(unsafe.Pointer(&items[p.count]))[:] - for _, key := range keys { - buf[0] = byte(len(key)) - buf = buf[1:] - copy(buf, []byte(key)) - buf = buf[len(key):] - } -} - -// updateRoot finds a bucket by root id and then updates it to point to a new root. -func (b *buckets) updateRoot(oldid, newid pgid) { - for _, b := range b.items { - if b.root == oldid { - b.root = newid - return - } - } -} |