source: code/trunk/db.go@ 84

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

cmd/jouncectl: new command

Allows to create users.

File size: 2.7 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
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 {
[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 tx, err := db.db.Begin()
81 if err != nil {
82 return err
83 }
84 defer tx.Rollback()
85
86 var password *string
87 if user.Password != "" {
88 password = &user.Password
89 }
90 _, err = tx.Exec("INSERT INTO User(username, password) VALUES (?, ?)", user.Username, password)
91 if err != nil {
92 return err
93 }
94
95 return tx.Commit()
96}
97
[77]98func (db *DB) ListNetworks(username string) ([]Network, error) {
[81]99 db.lock.RLock()
100 defer db.lock.RUnlock()
[77]101
102 rows, err := db.db.Query("SELECT id, addr, nick, username, realname FROM Network WHERE user = ?", username)
103 if err != nil {
104 return nil, err
105 }
106 defer rows.Close()
107
108 var networks []Network
109 for rows.Next() {
110 var net Network
111 var username, realname *string
112 if err := rows.Scan(&net.ID, &net.Addr, &net.Nick, &username, &realname); err != nil {
113 return nil, err
114 }
115 if username != nil {
116 net.Username = *username
117 }
118 if realname != nil {
119 net.Realname = *realname
120 }
121 networks = append(networks, net)
122 }
123 if err := rows.Err(); err != nil {
124 return nil, err
125 }
126
127 return networks, nil
128}
129
130func (db *DB) ListChannels(networkID int64) ([]Channel, error) {
[81]131 db.lock.RLock()
132 defer db.lock.RUnlock()
[77]133
134 rows, err := db.db.Query("SELECT id, name FROM Channel WHERE network = ?", networkID)
135 if err != nil {
136 return nil, err
137 }
138 defer rows.Close()
139
140 var channels []Channel
141 for rows.Next() {
142 var ch Channel
143 if err := rows.Scan(&ch.ID, &ch.Name); err != nil {
144 return nil, err
145 }
146 channels = append(channels, ch)
147 }
148 if err := rows.Err(); err != nil {
149 return nil, err
150 }
151
152 return channels, nil
153}
Note: See TracBrowser for help on using the repository browser.