diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2016-03-25 21:17:42 -0600 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2016-03-25 21:17:42 -0600 |
commit | b35bb5db2e0ef64e0d987504a4cd3d14224e8aa4 (patch) | |
tree | da55ceb25e0642f44187e1ce5350054b570431be | |
parent | Merge pull request #542 from boltdb/remove-drone-badge (diff) | |
parent | set slice capacity (diff) | |
download | dedo-b35bb5db2e0ef64e0d987504a4cd3d14224e8aa4.tar.gz dedo-b35bb5db2e0ef64e0d987504a4cd3d14224e8aa4.tar.xz |
Merge pull request #545 from benbjohnson/slice-capacity
Set slice capacity
-rw-r--r-- | bucket_test.go | 40 | ||||
-rw-r--r-- | page.go | 4 |
2 files changed, 42 insertions, 2 deletions
diff --git a/bucket_test.go b/bucket_test.go index a02c367..528fec2 100644 --- a/bucket_test.go +++ b/bucket_test.go @@ -80,6 +80,46 @@ func TestBucket_Get_IncompatibleValue(t *testing.T) { } } +// Ensure that a slice returned from a bucket has a capacity equal to its length. +// This also allows slices to be appended to since it will require a realloc by Go. +// +// https://github.com/boltdb/bolt/issues/544 +func TestBucket_Get_Capacity(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + // Write key to a bucket. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("bucket")) + if err != nil { + return err + } + return b.Put([]byte("key"), []byte("val")) + }); err != nil { + t.Fatal(err) + } + + // Retrieve value and attempt to append to it. + if err := db.Update(func(tx *bolt.Tx) error { + k, v := tx.Bucket([]byte("bucket")).Cursor().First() + + // Verify capacity. + if len(k) != cap(k) { + t.Fatalf("unexpected key slice capacity: %d", cap(k)) + } else if len(v) != cap(v) { + t.Fatalf("unexpected value slice capacity: %d", cap(v)) + } + + // Ensure slice can be appended to without a segfault. + k = append(k, []byte("123")...) + v = append(v, []byte("123")...) + + return nil + }); err != nil { + t.Fatal(err) + } +} + // Ensure that a bucket can write a key/value. func TestBucket_Put(t *testing.T) { db := MustOpenDB() @@ -111,13 +111,13 @@ type leafPageElement struct { // key returns a byte slice of the node key. func (n *leafPageElement) key() []byte { buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) - return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize] + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize:n.ksize] } // value returns a byte slice of the node value. func (n *leafPageElement) value() []byte { buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) - return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos+n.ksize]))[:n.vsize] + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos+n.ksize]))[:n.vsize:n.vsize] } // PageInfo represents human readable information about a page. |