source: code/trunk/db.go@ 77

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

Add SQLite database

Closes: https://todo.sr.ht/~emersion/jounce/9

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