File: bucket.go

package info (click to toggle)
golang-github-coreos-bbolt 1.4.2-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,300 kB
  • sloc: makefile: 87; sh: 57
file content (54 lines) | stat: -rw-r--r-- 1,282 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package common

import (
	"fmt"
	"unsafe"
)

const BucketHeaderSize = int(unsafe.Sizeof(InBucket{}))

// InBucket represents the on-file representation of a bucket.
// This is stored as the "value" of a bucket key. If the bucket is small enough,
// then its root page can be stored inline in the "value", after the bucket
// header. In the case of inline buckets, the "root" will be 0.
type InBucket struct {
	root     Pgid   // page id of the bucket's root-level page
	sequence uint64 // monotonically incrementing, used by NextSequence()
}

func NewInBucket(root Pgid, seq uint64) InBucket {
	return InBucket{
		root:     root,
		sequence: seq,
	}
}

func (b *InBucket) RootPage() Pgid {
	return b.root
}

func (b *InBucket) SetRootPage(id Pgid) {
	b.root = id
}

// InSequence returns the sequence. The reason why not naming it `Sequence`
// is to avoid duplicated name as `(*Bucket) Sequence()`
func (b *InBucket) InSequence() uint64 {
	return b.sequence
}

func (b *InBucket) SetInSequence(v uint64) {
	b.sequence = v
}

func (b *InBucket) IncSequence() {
	b.sequence++
}

func (b *InBucket) InlinePage(v []byte) *Page {
	return (*Page)(unsafe.Pointer(&v[BucketHeaderSize]))
}

func (b *InBucket) String() string {
	return fmt.Sprintf("<pgid=%d,seq=%d>", b.root, b.sequence)
}