source: code/trunk/db.go@ 80

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

go fmt

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