]> Sergey Matveev's repositories - btrtrc.git/blob - storage/sqlite/direct.go
Use separate squirrel module
[btrtrc.git] / storage / sqlite / direct.go
1 //go:build cgo
2 // +build cgo
3
4 package sqliteStorage
5
6 import (
7         "io"
8
9         "crawshaw.io/sqlite"
10         "github.com/anacrolix/squirrel"
11
12         "github.com/anacrolix/torrent/metainfo"
13         "github.com/anacrolix/torrent/storage"
14 )
15
16 // A convenience function that creates a connection pool, resource provider, and a pieces storage
17 // ClientImpl and returns them all with a Close attached.
18 func NewDirectStorage(opts NewDirectStorageOpts) (_ storage.ClientImplCloser, err error) {
19         cache, err := squirrel.NewCache(opts)
20         if err != nil {
21                 return
22         }
23         return &client{
24                 cache,
25                 cache.GetCapacity}, nil
26 }
27
28 type client struct {
29         *squirrel.Cache
30         capacity func() *int64
31 }
32
33 func (c *client) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (storage.TorrentImpl, error) {
34         t := torrent{c.Cache}
35         return storage.TorrentImpl{Piece: t.Piece, Close: t.Close, Capacity: &c.capacity}, nil
36 }
37
38 type torrent struct {
39         c *squirrel.Cache
40 }
41
42 func (t torrent) Piece(p metainfo.Piece) storage.PieceImpl {
43         ret := piece{
44                 sb: squirrel.Blob{
45                         p.Hash().HexString(),
46                         p.Length(),
47                         t.c,
48                 },
49         }
50         ret.ReaderAt = &ret.sb
51         ret.WriterAt = &ret.sb
52         return ret
53 }
54
55 func (t torrent) Close() error {
56         return nil
57 }
58
59 type piece struct {
60         sb squirrel.Blob
61         io.ReaderAt
62         io.WriterAt
63 }
64
65 func (p piece) MarkComplete() error {
66         return p.sb.SetTag("verified", true)
67 }
68
69 func (p piece) MarkNotComplete() error {
70         return p.sb.SetTag("verified", false)
71 }
72
73 func (p piece) Completion() (ret storage.Completion) {
74         err := p.sb.GetTag("verified", func(stmt *sqlite.Stmt) {
75                 ret.Complete = stmt.ColumnInt(0) != 0
76         })
77         ret.Ok = err == nil
78         if err != nil {
79                 panic(err)
80         }
81         return
82 }