source: code/trunk/db.go@ 91

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

Store NICK changes in the DB

File size: 3.8 KB
RevLine 
[77]1package jounce
2
3import (
4 "database/sql"
5 "sync"
6
7 _ "github.com/mattn/go-sqlite3"
8)
9
10type User struct {
11 Username string
[85]12 Password string // hashed
[77]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 {
[81]29 lock sync.RWMutex
[77]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) {
[81]48 db.lock.RLock()
49 defer db.lock.RUnlock()
[77]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
[84]76func (db *DB) CreateUser(user *User) error {
77 db.lock.Lock()
78 defer db.lock.Unlock()
79
80 var password *string
81 if user.Password != "" {
82 password = &user.Password
83 }
[89]84 _, err := db.db.Exec("INSERT INTO User(username, password) VALUES (?, ?)", user.Username, password)
85 return err
[84]86}
87
[77]88func (db *DB) ListNetworks(username string) ([]Network, error) {
[81]89 db.lock.RLock()
90 defer db.lock.RUnlock()
[77]91
92 rows, err := db.db.Query("SELECT id, addr, nick, username, realname FROM Network WHERE user = ?", username)
93 if err != nil {
94 return nil, err
95 }
96 defer rows.Close()
97
98 var networks []Network
99 for rows.Next() {
100 var net Network
101 var username, realname *string
102 if err := rows.Scan(&net.ID, &net.Addr, &net.Nick, &username, &realname); err != nil {
103 return nil, err
104 }
105 if username != nil {
106 net.Username = *username
107 }
108 if realname != nil {
109 net.Realname = *realname
110 }
111 networks = append(networks, net)
112 }
113 if err := rows.Err(); err != nil {
114 return nil, err
115 }
116
117 return networks, nil
118}
119
[90]120func (db *DB) StoreNetwork(username string, network *Network) error {
121 db.lock.Lock()
122 defer db.lock.Unlock()
123
124 var netUsername, netRealname *string
125 if network.Username != "" {
126 netUsername = &network.Username
127 }
128 if network.Realname != "" {
129 netRealname = &network.Realname
130 }
131
132 var err error
133 if network.ID != 0 {
134 _, err = db.db.Exec("UPDATE Network SET addr = ?, nick = ?, username = ?, realname = ? WHERE id = ?", network.Addr, network.Nick, netUsername, netRealname, network.ID)
135 } else {
136 var res sql.Result
137 res, err = db.db.Exec("INSERT INTO Network(user, addr, nick, username, realname) VALUES (?, ?, ?, ?, ?)", username, network.Addr, network.Nick, netUsername, netRealname)
138 if err != nil {
139 return err
140 }
141 network.ID, err = res.LastInsertId()
142 }
143 return err
144}
145
[77]146func (db *DB) ListChannels(networkID int64) ([]Channel, error) {
[81]147 db.lock.RLock()
148 defer db.lock.RUnlock()
[77]149
150 rows, err := db.db.Query("SELECT id, name FROM Channel WHERE network = ?", networkID)
151 if err != nil {
152 return nil, err
153 }
154 defer rows.Close()
155
156 var channels []Channel
157 for rows.Next() {
158 var ch Channel
159 if err := rows.Scan(&ch.ID, &ch.Name); err != nil {
160 return nil, err
161 }
162 channels = append(channels, ch)
163 }
164 if err := rows.Err(); err != nil {
165 return nil, err
166 }
167
168 return channels, nil
169}
[89]170
171func (db *DB) StoreChannel(networkID int64, ch *Channel) error {
172 db.lock.Lock()
173 defer db.lock.Unlock()
174
175 _, err := db.db.Exec("INSERT OR REPLACE INTO Channel(network, name) VALUES (?, ?)", networkID, ch.Name)
176 return err
177}
178
179func (db *DB) DeleteChannel(networkID int64, name string) error {
180 db.lock.Lock()
181 defer db.lock.Unlock()
182
183 _, err := db.db.Exec("DELETE FROM Channel WHERE network = ? AND name = ?", networkID, name)
184 return err
185}
Note: See TracBrowser for help on using the repository browser.