+// modernc.org/sqlite depends on modernc.org/libc which doesn't work for JS (and probably wasm but I
+// think JS is the stronger signal).
+
//go:build cgo && !nosqlite
// +build cgo,!nosqlite
package storage
import (
+ "errors"
"path/filepath"
"sync"
- "crawshaw.io/sqlite"
- "crawshaw.io/sqlite/sqlitex"
+ "github.com/go-llsqlite/adapter"
+ "github.com/go-llsqlite/adapter/sqlitex"
"github.com/anacrolix/torrent/metainfo"
)
+// sqlite is always the default when available.
+func NewDefaultPieceCompletionForDir(dir string) (PieceCompletion, error) {
+ return NewSqlitePieceCompletion(dir)
+}
+
type sqlitePieceCompletion struct {
- mu sync.Mutex
- db *sqlite.Conn
+ mu sync.Mutex
+ closed bool
+ db *sqlite.Conn
}
var _ PieceCompletion = (*sqlitePieceCompletion)(nil)
func (me *sqlitePieceCompletion) Set(pk metainfo.PieceKey, b bool) error {
me.mu.Lock()
defer me.mu.Unlock()
+ if me.closed {
+ return errors.New("closed")
+ }
return sqlitex.Exec(
me.db,
`insert or replace into piece_completion(infohash, "index", complete) values(?, ?, ?)`,
func (me *sqlitePieceCompletion) Close() (err error) {
me.mu.Lock()
defer me.mu.Unlock()
- if me.db != nil {
- err = me.db.Close()
+ if me.closed {
+ return
}
+ err = me.db.Close()
+ me.db = nil
+ me.closed = true
return
}