]> Sergey Matveev's repositories - btrtrc.git/blob - storage/sqlite-piece-completion.go
Switch to crawshaw.io/sqlite
[btrtrc.git] / storage / sqlite-piece-completion.go
1 // +build cgo
2
3 package storage
4
5 import (
6         "path/filepath"
7
8         "crawshaw.io/sqlite"
9         "crawshaw.io/sqlite/sqlitex"
10
11         "github.com/anacrolix/torrent/metainfo"
12 )
13
14 type sqlitePieceCompletion struct {
15         db *sqlite.Conn
16 }
17
18 var _ PieceCompletion = (*sqlitePieceCompletion)(nil)
19
20 func NewSqlitePieceCompletion(dir string) (ret *sqlitePieceCompletion, err error) {
21         p := filepath.Join(dir, ".torrent.db")
22         db, err := sqlite.OpenConn(p, 0)
23         if err != nil {
24                 return
25         }
26         err = sqlitex.ExecScript(db, `create table if not exists piece_completion(infohash, "index", complete, unique(infohash, "index"))`)
27         if err != nil {
28                 db.Close()
29                 return
30         }
31         ret = &sqlitePieceCompletion{db}
32         return
33 }
34
35 func (me *sqlitePieceCompletion) Get(pk metainfo.PieceKey) (c Completion, err error) {
36         err = sqlitex.Exec(
37                 me.db, `select complete from piece_completion where infohash=? and "index"=?`,
38                 func(stmt *sqlite.Stmt) error {
39                         c.Complete = stmt.ColumnInt(0) != 0
40                         c.Ok = true
41                         return nil
42                 },
43                 pk.InfoHash.HexString(), pk.Index)
44         return
45 }
46
47 func (me *sqlitePieceCompletion) Set(pk metainfo.PieceKey, b bool) error {
48         return sqlitex.Exec(
49                 me.db,
50                 `insert or replace into piece_completion(infohash, "index", complete) values(?, ?, ?)`,
51                 nil,
52                 pk.InfoHash.HexString(), pk.Index, b)
53 }
54
55 func (me *sqlitePieceCompletion) Close() error {
56         return me.db.Close()
57 }