1 // modernc.org/sqlite depends on modernc.org/libc which doesn't work for JS (and probably wasm but I
2 // think JS is the stronger signal).
4 //go:build cgo && !nosqlite
5 // +build cgo,!nosqlite
15 "crawshaw.io/sqlite/sqlitex"
16 "github.com/anacrolix/torrent/metainfo"
19 // sqlite is always the default when available.
20 func NewDefaultPieceCompletionForDir(dir string) (PieceCompletion, error) {
21 return NewSqlitePieceCompletion(dir)
24 type sqlitePieceCompletion struct {
30 var _ PieceCompletion = (*sqlitePieceCompletion)(nil)
32 func NewSqlitePieceCompletion(dir string) (ret *sqlitePieceCompletion, err error) {
33 p := filepath.Join(dir, ".torrent.db")
34 db, err := sqlite.OpenConn(p, 0)
38 err = sqlitex.ExecScript(db, `create table if not exists piece_completion(infohash, "index", complete, unique(infohash, "index"))`)
43 ret = &sqlitePieceCompletion{db: db}
47 func (me *sqlitePieceCompletion) Get(pk metainfo.PieceKey) (c Completion, err error) {
51 me.db, `select complete from piece_completion where infohash=? and "index"=?`,
52 func(stmt *sqlite.Stmt) error {
53 c.Complete = stmt.ColumnInt(0) != 0
57 pk.InfoHash.HexString(), pk.Index)
61 func (me *sqlitePieceCompletion) Set(pk metainfo.PieceKey, b bool) error {
65 return errors.New("closed")
69 `insert or replace into piece_completion(infohash, "index", complete) values(?, ?, ?)`,
71 pk.InfoHash.HexString(), pk.Index, b)
74 func (me *sqlitePieceCompletion) Close() (err error) {