6 "github.com/anacrolix/missinggo/x"
7 "github.com/anacrolix/torrent/metainfo"
8 "github.com/boltdb/bolt"
11 type boltDBPiece struct {
19 _ PieceImpl = (*boltDBPiece)(nil)
20 dataBucketKey = []byte("data")
23 func (me *boltDBPiece) pc() PieceCompletionGetSetter {
24 return boltPieceCompletion{me.db}
27 func (me *boltDBPiece) pk() metainfo.PieceKey {
28 return metainfo.PieceKey{me.ih, me.p.Index()}
31 func (me *boltDBPiece) Completion() Completion {
32 c, err := me.pc().Get(me.pk())
37 func (me *boltDBPiece) MarkComplete() error {
38 return me.pc().Set(me.pk(), true)
41 func (me *boltDBPiece) MarkNotComplete() error {
42 return me.pc().Set(me.pk(), false)
44 func (me *boltDBPiece) ReadAt(b []byte, off int64) (n int, err error) {
45 err = me.db.View(func(tx *bolt.Tx) error {
46 db := tx.Bucket(dataBucketKey)
53 ck := me.chunkKey(int(ci))
55 if len(_b) != chunkSize {
58 n1 := copy(b, _b[off:])
69 func (me *boltDBPiece) chunkKey(index int) (ret [26]byte) {
70 copy(ret[:], me.key[:])
71 binary.BigEndian.PutUint16(ret[24:], uint16(index))
75 func (me *boltDBPiece) WriteAt(b []byte, off int64) (n int, err error) {
76 err = me.db.Update(func(tx *bolt.Tx) error {
77 db, err := tx.CreateBucketIfNotExists(dataBucketKey)
84 _b := make([]byte, chunkSize)
85 ck := me.chunkKey(int(ci))
86 copy(_b, db.Get(ck[:]))
87 n1 := copy(_b[off:], b)