File: utils_test.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 (47 lines) | stat: -rw-r--r-- 1,225 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
package bbolt_test

import (
	bolt "go.etcd.io/bbolt"
	"go.etcd.io/bbolt/internal/common"
)

// `dumpBucket` dumps all the data, including both key/value data
// and child buckets, from the source bucket into the target db file.
func dumpBucket(srcBucketName []byte, srcBucket *bolt.Bucket, dstFilename string) error {
	common.Assert(len(srcBucketName) != 0, "source bucket name can't be empty")
	common.Assert(srcBucket != nil, "the source bucket can't be nil")
	common.Assert(len(dstFilename) != 0, "the target file path can't be empty")

	dstDB, err := bolt.Open(dstFilename, 0600, nil)
	if err != nil {
		return err
	}
	defer dstDB.Close()

	return dstDB.Update(func(tx *bolt.Tx) error {
		dstBucket, err := tx.CreateBucket(srcBucketName)
		if err != nil {
			return err
		}
		return cloneBucket(srcBucket, dstBucket)
	})
}

func cloneBucket(src *bolt.Bucket, dst *bolt.Bucket) error {
	return src.ForEach(func(k, v []byte) error {
		if v == nil {
			srcChild := src.Bucket(k)
			dstChild, err := dst.CreateBucket(k)
			if err != nil {
				return err
			}
			if err = dstChild.SetSequence(srcChild.Sequence()); err != nil {
				return err
			}

			return cloneBucket(srcChild, dstChild)
		}

		return dst.Put(k, v)
	})
}