6 "github.com/anacrolix/missinggo/x"
7 "github.com/boltdb/bolt"
9 "github.com/anacrolix/torrent/metainfo"
12 type boltDBPiece struct {
20 _ PieceImpl = (*boltDBPiece)(nil)
21 dataBucketKey = []byte("data")
24 func (me *boltDBPiece) pc() PieceCompletionGetSetter {
25 return boltPieceCompletion{me.db}
28 func (me *boltDBPiece) pk() metainfo.PieceKey {
29 return metainfo.PieceKey{me.ih, me.p.Index()}
32 func (me *boltDBPiece) Completion() Completion {
33 c, err := me.pc().Get(me.pk())
38 func (me *boltDBPiece) MarkComplete() error {
39 return me.pc().Set(me.pk(), true)
42 func (me *boltDBPiece) MarkNotComplete() error {
43 return me.pc().Set(me.pk(), false)
45 func (me *boltDBPiece) ReadAt(b []byte, off int64) (n int, err error) {
46 err = me.db.View(func(tx *bolt.Tx) error {
47 db := tx.Bucket(dataBucketKey)
54 ck := me.chunkKey(int(ci))
56 if len(_b) != chunkSize {
59 n1 := copy(b, _b[off:])
70 func (me *boltDBPiece) chunkKey(index int) (ret [26]byte) {
71 copy(ret[:], me.key[:])
72 binary.BigEndian.PutUint16(ret[24:], uint16(index))
76 func (me *boltDBPiece) WriteAt(b []byte, off int64) (n int, err error) {
77 err = me.db.Update(func(tx *bolt.Tx) error {
78 db, err := tx.CreateBucketIfNotExists(dataBucketKey)
85 _b := make([]byte, chunkSize)
86 ck := me.chunkKey(int(ci))
87 copy(_b, db.Get(ck[:]))
88 n1 := copy(_b[off:], b)