]> Sergey Matveev's repositories - btrtrc.git/blobdiff - storage/interface.go
Fix UseSources panicking when sqlite storage is closed
[btrtrc.git] / storage / interface.go
index 0662ebd261fea64e1eb02d9068cd9d076c195708..9e8de06c8f55313370e938d386f234f45b22e3d3 100644 (file)
@@ -6,37 +6,55 @@ import (
        "github.com/anacrolix/torrent/metainfo"
 )
 
-// Represents data storage for a Torrent.
-type I interface {
-       Piece(metainfo.Piece) Piece
+type ClientImplCloser interface {
+       ClientImpl
+       Close() error
 }
 
-type Piece interface {
-       // Should return io.EOF only at end of torrent. Short reads due to missing
-       // data should return io.ErrUnexpectedEOF.
+// Represents data storage for an unspecified torrent.
+type ClientImpl interface {
+       OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (TorrentImpl, error)
+}
+
+type TorrentCapacity *func() (cap int64, capped bool)
+
+// Data storage bound to a torrent.
+type TorrentImpl struct {
+       Piece func(p metainfo.Piece) PieceImpl
+       Close func() error
+       Flush func() error
+       // Storages that share the same space, will provide equal pointers. The function is called once
+       // to determine the storage for torrents sharing the same function pointer, and mutated in
+       // place.
+       Capacity TorrentCapacity
+}
+
+// Interacts with torrent piece data. Optional interfaces to implement include:
+//
+//     io.WriterTo, such as when a piece supports a more efficient way to write out incomplete chunks.
+//     SelfHashing, such as when a piece supports a more efficient way to hash its contents.
+type PieceImpl interface {
+       // These interfaces are not as strict as normally required. They can
+       // assume that the parameters are appropriate for the dimensions of the
+       // piece.
        io.ReaderAt
        io.WriterAt
        // Called when the client believes the piece data will pass a hash check.
        // The storage can move or mark the piece data as read-only as it sees
        // fit.
        MarkComplete() error
+       MarkNotComplete() error
        // Returns true if the piece is complete.
-       GetIsComplete() bool
+       Completion() Completion
 }
 
-// type PieceStorage interface {
-//     ReadAt(metainfo.Piece, []byte, int64) (int, error)
-//     WriteAt(metainfo.Piece, []byte, int64) (int, error)
-//     MarkComplete(metainfo.Piece) error
-//     GetIsComplete(metainfo.Piece) bool
-// }
-
-// type wrappedPieceStorage struct {
-//     ps PieceStorage
-// }
-
-// func WrapPieceStorage(ps PieceStorage) I {
-//     return wrappedPieceStorage{ps}
-// }
+type Completion struct {
+       Complete bool
+       Ok       bool
+       Err      error
+}
 
-// func (me wrappedPieceStorage) Piece(metainfo.Piece)
+// Allows a storage backend to override hashing (i.e. if it can do it more efficiently than the torrent client can)
+type SelfHashing interface {
+       SelfHash() (metainfo.Hash, error)
+}