+//go:build cgo
// +build cgo
package storage
import (
"path/filepath"
+ "sync"
"crawshaw.io/sqlite"
"crawshaw.io/sqlite/sqlitex"
)
type sqlitePieceCompletion struct {
+ mu sync.Mutex
db *sqlite.Conn
}
db.Close()
return
}
- ret = &sqlitePieceCompletion{db}
+ ret = &sqlitePieceCompletion{db: db}
return
}
func (me *sqlitePieceCompletion) Get(pk metainfo.PieceKey) (c Completion, err error) {
+ me.mu.Lock()
+ defer me.mu.Unlock()
err = sqlitex.Exec(
me.db, `select complete from piece_completion where infohash=? and "index"=?`,
func(stmt *sqlite.Stmt) error {
}
func (me *sqlitePieceCompletion) Set(pk metainfo.PieceKey, b bool) error {
+ me.mu.Lock()
+ defer me.mu.Unlock()
return sqlitex.Exec(
me.db,
`insert or replace into piece_completion(infohash, "index", complete) values(?, ?, ?)`,
pk.InfoHash.HexString(), pk.Index, b)
}
-func (me *sqlitePieceCompletion) Close() error {
- return me.db.Close()
+func (me *sqlitePieceCompletion) Close() (err error) {
+ me.mu.Lock()
+ defer me.mu.Unlock()
+ if me.db != nil {
+ err = me.db.Close()
+ me.db = nil
+ }
+ return
}