]> Sergey Matveev's repositories - btrtrc.git/blobdiff - storage/sqlite-piece-completion.go
Switch to github.com/go-llsqlite/adapter
[btrtrc.git] / storage / sqlite-piece-completion.go
index 196f1e5007e6c3697250540515916c754296ee3f..73407f3f235e0b6d32ec4aa8db6c6d0ff6198bfd 100644 (file)
@@ -1,21 +1,31 @@
+// 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)
@@ -52,6 +62,9 @@ func (me *sqlitePieceCompletion) Get(pk metainfo.PieceKey) (c Completion, err er
 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(?, ?, ?)`,
@@ -62,8 +75,11 @@ func (me *sqlitePieceCompletion) Set(pk metainfo.PieceKey, b bool) error {
 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
 }