source: code/trunk/db.go@ 81

Last change on this file since 81 was 81, checked in by contact, 5 years ago

Use a RWMutex for DB

File size: 2.3 KB
Line 
1package jounce
2
3import (
4 "database/sql"
5 "sync"
6
7 _ "github.com/mattn/go-sqlite3"
8)
9
10type User struct {
11 Username string
12 Password string
13}
14
15type Network struct {
16 ID int64
17 Addr string
18 Nick string
19 Username string
20 Realname string
21}
22
23type Channel struct {
24 ID int64
25 Name string
26}
27
28type DB struct {
29 lock sync.RWMutex
30 db *sql.DB
31}
32
33func OpenSQLDB(driver, source string) (*DB, error) {
34 db, err := sql.Open(driver, source)
35 if err != nil {
36 return nil, err
37 }
38 return &DB{db: db}, nil
39}
40
41func (db *DB) Close() error {
42 db.lock.Lock()
43 defer db.lock.Unlock()
44 return db.Close()
45}
46
47func (db *DB) ListUsers() ([]User, error) {
48 db.lock.RLock()
49 defer db.lock.RUnlock()
50
51 rows, err := db.db.Query("SELECT username, password FROM User")
52 if err != nil {
53 return nil, err
54 }
55 defer rows.Close()
56
57 var users []User
58 for rows.Next() {
59 var user User
60 var password *string
61 if err := rows.Scan(&user.Username, &password); err != nil {
62 return nil, err
63 }
64 if password != nil {
65 user.Password = *password
66 }
67 users = append(users, user)
68 }
69 if err := rows.Err(); err != nil {
70 return nil, err
71 }
72
73 return users, nil
74}
75
76func (db *DB) ListNetworks(username string) ([]Network, error) {
77 db.lock.RLock()
78 defer db.lock.RUnlock()
79
80 rows, err := db.db.Query("SELECT id, addr, nick, username, realname FROM Network WHERE user = ?", username)
81 if err != nil {
82 return nil, err
83 }
84 defer rows.Close()
85
86 var networks []Network
87 for rows.Next() {
88 var net Network
89 var username, realname *string
90 if err := rows.Scan(&net.ID, &net.Addr, &net.Nick, &username, &realname); err != nil {
91 return nil, err
92 }
93 if username != nil {
94 net.Username = *username
95 }
96 if realname != nil {
97 net.Realname = *realname
98 }
99 networks = append(networks, net)
100 }
101 if err := rows.Err(); err != nil {
102 return nil, err
103 }
104
105 return networks, nil
106}
107
108func (db *DB) ListChannels(networkID int64) ([]Channel, error) {
109 db.lock.RLock()
110 defer db.lock.RUnlock()
111
112 rows, err := db.db.Query("SELECT id, name FROM Channel WHERE network = ?", networkID)
113 if err != nil {
114 return nil, err
115 }
116 defer rows.Close()
117
118 var channels []Channel
119 for rows.Next() {
120 var ch Channel
121 if err := rows.Scan(&ch.ID, &ch.Name); err != nil {
122 return nil, err
123 }
124 channels = append(channels, ch)
125 }
126 if err := rows.Err(); err != nil {
127 return nil, err
128 }
129
130 return channels, nil
131}
Note: See TracBrowser for help on using the repository browser.