]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Fix sqlite piece completion
authorMatt Joiner <anacrolix@gmail.com>
Fri, 14 May 2021 05:45:54 +0000 (15:45 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Fri, 14 May 2021 05:45:54 +0000 (15:45 +1000)
storage/sqlite-piece-completion.go

index 16bc2834877371f0dedbef3f30a8508f2b741f5c..eea18118cfd43419fd69d9dd71cb33416d6b3f1e 100644 (file)
@@ -1,9 +1,11 @@
+//go:build cgo
 // +build cgo
 
 package storage
 
 import (
        "path/filepath"
+       "sync"
 
        "crawshaw.io/sqlite"
        "crawshaw.io/sqlite/sqlitex"
@@ -12,6 +14,7 @@ import (
 )
 
 type sqlitePieceCompletion struct {
+       mu sync.Mutex
        db *sqlite.Conn
 }
 
@@ -28,11 +31,13 @@ func NewSqlitePieceCompletion(dir string) (ret *sqlitePieceCompletion, err error
                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 {
@@ -45,6 +50,8 @@ 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()
        return sqlitex.Exec(
                me.db,
                `insert or replace into piece_completion(infohash, "index", complete) values(?, ?, ?)`,
@@ -52,6 +59,12 @@ func (me *sqlitePieceCompletion) Set(pk metainfo.PieceKey, b bool) error {
                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
 }