)
type pieceCompletion interface {
- Get(metainfo.Piece) bool
- Set(metainfo.Piece, bool)
+ Get(metainfo.Piece) (bool, error)
+ Set(metainfo.Piece, bool) error
Close()
}
func (mapPieceCompletion) Close() {}
-func (me *mapPieceCompletion) Get(p metainfo.Piece) bool {
+func (me *mapPieceCompletion) Get(p metainfo.Piece) (bool, error) {
_, ok := me.m[p.Key()]
- return ok
+ return ok, nil
}
-func (me *mapPieceCompletion) Set(p metainfo.Piece, b bool) {
+func (me *mapPieceCompletion) Set(p metainfo.Piece, b bool) error {
if b {
if me.m == nil {
me.m = make(map[metainfo.PieceKey]struct{})
} else {
delete(me.m, p.Key())
}
+ return nil
}
return
}
-func (me *dbPieceCompletion) Get(p metainfo.Piece) (ret bool) {
+func (me *dbPieceCompletion) Get(p metainfo.Piece) (ret bool, err error) {
row := me.db.QueryRow(`select exists(select * from completed where infohash=? and "index"=?)`, p.Info.Hash().HexString(), p.Index())
- err := row.Scan(&ret)
- if err != nil {
- panic(err)
- }
+ err = row.Scan(&ret)
return
}
-func (me *dbPieceCompletion) Set(p metainfo.Piece, b bool) {
- var err error
+func (me *dbPieceCompletion) Set(p metainfo.Piece, b bool) (err error) {
if b {
_, err = me.db.Exec(`insert into completed (infohash, "index") values (?, ?)`, p.Info.Hash().HexString(), p.Index())
} else {
_, err = me.db.Exec(`delete from completed where infohash=? and "index"=?`, p.Info.Hash().HexString(), p.Index())
}
- if err != nil {
- panic(err)
- }
+ return
}
func (me *dbPieceCompletion) Close() {
r io.ReaderAt
}
-func (fs *fileStoragePiece) GetIsComplete() (ret bool) {
- ret = fs.completion.Get(fs.p)
- if !ret {
- return
+func (fs *fileStoragePiece) GetIsComplete() bool {
+ ret, err := fs.completion.Get(fs.p)
+ if err != nil || !ret {
+ return false
}
// If it's allegedly complete, check that its constituent files have the
// necessary length.
}
}
if ret {
- return
+ return true
}
// The completion was wrong, fix it.
fs.completion.Set(fs.p, false)
- return
+ return false
}
func (fs *fileStoragePiece) MarkComplete() error {
io.WriterAt
}
-func (sp mmapStoragePiece) GetIsComplete() bool {
- return sp.pc.Get(sp.p)
+func (sp mmapStoragePiece) GetIsComplete() (ret bool) {
+ ret, _ = sp.pc.Get(sp.p)
+ return
}
func (sp mmapStoragePiece) MarkComplete() error {