From 4ad445aa8546d19a9bb9a34a5d3c27cd5a158fd9 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Wed, 29 Jan 2014 22:50:29 -0500 Subject: Add freelist page type. --- bucket.go | 8 -------- db.go | 18 +++++++++++++++++- meta.go | 1 + page.go | 12 +++++++++--- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/bucket.go b/bucket.go index 90a01c7..1ce901f 100644 --- a/bucket.go +++ b/bucket.go @@ -1,11 +1,5 @@ package bolt -var ( - InvalidBucketError = &Error{"invalid bucket", nil} -) - -type bucketid uint32 - type Bucket struct { *bucket name string @@ -14,8 +8,6 @@ type Bucket struct { } type bucket struct { - id bucketid - flags uint32 root pgid } diff --git a/db.go b/db.go index bca4d56..a29b517 100644 --- a/db.go +++ b/db.go @@ -146,18 +146,34 @@ func (db *DB) init() error { db.pageSize = db.os.Getpagesize() // Create two meta pages on a buffer. - buf := make([]byte, db.pageSize*2) + buf := make([]byte, db.pageSize*4) for i := 0; i < 2; i++ { p := db.pageInBuffer(buf[:], pgid(i)) p.id = pgid(i) p.flags = p_meta + // Initialize the meta page. m := p.meta() m.magic = magic m.version = Version m.pageSize = uint32(db.pageSize) + m.version = Version + m.free = 3 + m.sys.root = 4 } + // Write an empty freelist at page 3. + p := db.pageInBuffer(buf[:], pgid(2)) + p.id = pgid(3) + p.flags = p_freelist + p.count = 0 + + // Write an empty leaf page at page 4. + p = db.pageInBuffer(buf[:], pgid(3)) + p.id = pgid(4) + p.flags = p_leaf + p.count = 0 + // Write the buffer to our data file. if _, err := db.metafile.WriteAt(buf, 0); err != nil { return err diff --git a/meta.go b/meta.go index 5fafa1d..3da5bc3 100644 --- a/meta.go +++ b/meta.go @@ -14,6 +14,7 @@ type meta struct { pageSize uint32 pgid pgid txnid txnid + free pgid sys bucket } diff --git a/page.go b/page.go index d45d336..12d1cee 100644 --- a/page.go +++ b/page.go @@ -11,9 +11,10 @@ const minKeysPerPage = 2 const maxNodesPerPage = 65535 const ( - p_branch = 0x01 - p_leaf = 0x02 - p_meta = 0x04 + p_branch = 0x01 + p_leaf = 0x02 + p_meta = 0x04 + p_freelist = 0x08 ) type pgid uint64 @@ -40,3 +41,8 @@ func (p *page) lnode(index int) *lnode { func (p *page) bnode(index int) *bnode { return &((*[maxNodesPerPage]bnode)(unsafe.Pointer(&p.ptr)))[index] } + +// freelist retrieves a list of page ids from a freelist page. +func (p *page) freelist() []pgid { + return ((*[maxNodesPerPage]pgid)(unsafe.Pointer(&p.ptr)))[0:p.count] +} -- cgit v1.3