11 "github.com/anacrolix/torrent/metainfo"
15 boltDbCompleteValue = "c"
16 boltDbIncompleteValue = "i"
20 completionBucketKey = []byte("completion")
23 type boltPieceCompletion struct {
27 var _ PieceCompletion = (*boltPieceCompletion)(nil)
29 func NewBoltPieceCompletion(dir string) (ret PieceCompletion, err error) {
30 os.MkdirAll(dir, 0770)
31 p := filepath.Join(dir, ".torrent.bolt.db")
32 db, err := bbolt.Open(p, 0660, &bbolt.Options{
39 ret = &boltPieceCompletion{db}
43 func (me boltPieceCompletion) Get(pk metainfo.PieceKey) (cn Completion, err error) {
44 err = me.db.View(func(tx *bbolt.Tx) error {
45 cb := tx.Bucket(completionBucketKey)
49 ih := cb.Bucket(pk.InfoHash[:])
54 binary.BigEndian.PutUint32(key[:], uint32(pk.Index))
56 switch string(ih.Get(key[:])) {
57 case boltDbCompleteValue:
59 case boltDbIncompleteValue:
69 func (me boltPieceCompletion) Set(pk metainfo.PieceKey, b bool) error {
70 return me.db.Update(func(tx *bbolt.Tx) error {
71 c, err := tx.CreateBucketIfNotExists(completionBucketKey)
75 ih, err := c.CreateBucketIfNotExists(pk.InfoHash[:])
80 binary.BigEndian.PutUint32(key[:], uint32(pk.Index))
81 return ih.Put(key[:], []byte(func() string {
83 return boltDbCompleteValue
85 return boltDbIncompleteValue
91 func (me *boltPieceCompletion) Close() error {