/
sqlite3torrentuserdb.go
120 lines (100 loc) 路 2.81 KB
/
sqlite3torrentuserdb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//go:build cgo
// +build cgo
package db
import (
"sync"
sqlite "github.com/go-llsqlite/crawshaw"
"github.com/go-llsqlite/crawshaw/sqlitex"
"github.com/anacrolix/torrent/metainfo"
)
type SqliteTorrentUserDb struct {
Db *sqlite.Conn
mu sync.Mutex
}
func (db *SqliteTorrentUserDb) Open(fp string) {
var err error
db.Db, err = sqlite.OpenConn(fp, 0)
if err != nil {
DbL.Fatalln(err)
}
err = sqlitex.ExecScript(db.Db, `create table if not exists torrentuserdb (username text,infohash text, unique(username,infohash));`)
if err != nil {
DbL.Fatalln(err)
}
}
func (db *SqliteTorrentUserDb) Close() {
db.mu.Lock()
defer db.mu.Unlock()
err := db.Db.Close()
if err != nil {
DbL.Fatalln(err)
}
}
func (db *SqliteTorrentUserDb) Add(username string, ih metainfo.Hash) (err error) {
db.mu.Lock()
defer db.mu.Unlock()
err = sqlitex.Exec(db.Db, `insert into torrentuserdb (username,infohash) values (?,?) on conflict (username,infohash) do nothing;`, nil, username, ih.HexString())
return
}
func (db *SqliteTorrentUserDb) Remove(username string, ih metainfo.Hash) (err error) {
db.mu.Lock()
defer db.mu.Unlock()
err = sqlitex.Exec(db.Db, `delete from torrentuserdb where username=? and infohash=?;`, nil, username, ih.HexString())
return
}
func (db *SqliteTorrentUserDb) RemoveAll(username string) (err error) {
db.mu.Lock()
defer db.mu.Unlock()
err = sqlitex.Exec(db.Db, `delete from torrentuserdb where username=?;`, nil, username)
return
}
func (db *SqliteTorrentUserDb) RemoveAllMi(mi metainfo.Hash) (err error) {
db.mu.Lock()
defer db.mu.Unlock()
err = sqlitex.Exec(db.Db, `delete from torrentuserdb where infohash=?;`, nil, mi.HexString())
return
}
func (db *SqliteTorrentUserDb) HasUser(username string, ih string) (ret bool) {
db.mu.Lock()
defer db.mu.Unlock()
serr := sqlitex.Exec(
db.Db, `select 1 from torrentuserdb where username=? and infohash=?;`,
func(stmt *sqlite.Stmt) error {
ret = stmt.ColumnInt(0) == 1
return nil
}, username, ih)
if serr != nil {
return false
}
return
}
func (db *SqliteTorrentUserDb) ListTorrents(username string) (ret []metainfo.Hash) {
ret = make([]metainfo.Hash, 0)
db.mu.Lock()
defer db.mu.Unlock()
_ = sqlitex.Exec(
db.Db, `select infohash from torrentuserdb where username=?;`,
func(stmt *sqlite.Stmt) error {
tm, terr := MetafromHex(stmt.GetText("infohash"))
if terr != nil {
DbL.Println(terr)
return terr
}
ret = append(ret, tm)
return nil
}, username)
return
}
func (db *SqliteTorrentUserDb) ListUsers(mi metainfo.Hash) (ret []string) {
ret = make([]string, 0)
db.mu.Lock()
defer db.mu.Unlock()
_ = sqlitex.Exec(
db.Db, `select username from torrentuserdb where infohash=?;`,
func(stmt *sqlite.Stmt) error {
username := stmt.GetText("username")
ret = append(ret, username)
return nil
}, mi.HexString())
return
}