source: code/trunk/db.go@ 639

Last change on this file since 639 was 620, checked in by hubert, 4 years ago

PostgreSQL support

File size: 3.2 KB
RevLine 
[98]1package soju
[77]2
3import (
[148]4 "fmt"
[457]5 "net/url"
[263]6 "strings"
[434]7 "time"
[77]8)
9
[531]10type Database interface {
11 Close() error
[607]12 Stats() (*DatabaseStats, error)
[531]13
14 ListUsers() ([]User, error)
15 GetUser(username string) (*User, error)
16 StoreUser(user *User) error
17 DeleteUser(id int64) error
18
19 ListNetworks(userID int64) ([]Network, error)
20 StoreNetwork(userID int64, network *Network) error
21 DeleteNetwork(id int64) error
22 ListChannels(networkID int64) ([]Channel, error)
23 StoreChannel(networKID int64, ch *Channel) error
24 DeleteChannel(id int64) error
25
26 ListDeliveryReceipts(networkID int64) ([]DeliveryReceipt, error)
27 StoreClientDeliveryReceipts(networkID int64, client string, receipts []DeliveryReceipt) error
28}
29
[620]30func OpenDB(driver, source string) (Database, error) {
31 switch driver {
32 case "sqlite3":
33 return OpenSqliteDB(source)
34 case "postgres":
35 return OpenPostgresDB(source)
36 default:
37 return nil, fmt.Errorf("unsupported database driver: %q", driver)
38 }
39}
40
[607]41type DatabaseStats struct {
42 Users int64
43 Networks int64
44 Channels int64
45}
46
[77]47type User struct {
[382]48 ID int64
[77]49 Username string
[85]50 Password string // hashed
[568]51 Realname string
[327]52 Admin bool
[77]53}
54
[95]55type SASL struct {
56 Mechanism string
57
58 Plain struct {
59 Username string
60 Password string
61 }
[307]62
63 // TLS client certificate authentication.
64 External struct {
65 // X.509 certificate in DER form.
66 CertBlob []byte
67 // PKCS#8 private key in DER form.
68 PrivKeyBlob []byte
69 }
[95]70}
71
[77]72type Network struct {
[263]73 ID int64
74 Name string
75 Addr string
76 Nick string
77 Username string
78 Realname string
79 Pass string
80 ConnectCommands []string
81 SASL SASL
[542]82 Enabled bool
[77]83}
84
[149]85func (net *Network) GetName() string {
86 if net.Name != "" {
87 return net.Name
88 }
89 return net.Addr
90}
91
[457]92func (net *Network) URL() (*url.URL, error) {
93 s := net.Addr
94 if !strings.Contains(s, "://") {
95 // This is a raw domain name, make it an URL with the default scheme
96 s = "ircs://" + s
97 }
98
99 u, err := url.Parse(s)
100 if err != nil {
101 return nil, fmt.Errorf("failed to parse upstream server URL: %v", err)
102 }
103
104 return u, nil
105}
106
107func (net *Network) GetUsername() string {
108 if net.Username != "" {
109 return net.Username
110 }
111 return net.Nick
112}
113
[568]114func GetRealname(user *User, net *Network) string {
[457]115 if net.Realname != "" {
116 return net.Realname
117 }
[568]118 if user.Realname != "" {
119 return user.Realname
120 }
[457]121 return net.Nick
122}
123
[434]124type MessageFilter int
125
126const (
127 // TODO: use customizable user defaults for FilterDefault
128 FilterDefault MessageFilter = iota
129 FilterNone
130 FilterHighlight
131 FilterMessage
132)
133
134func parseFilter(filter string) (MessageFilter, error) {
135 switch filter {
136 case "default":
137 return FilterDefault, nil
138 case "none":
139 return FilterNone, nil
140 case "highlight":
141 return FilterHighlight, nil
142 case "message":
143 return FilterMessage, nil
144 }
145 return 0, fmt.Errorf("unknown filter: %q", filter)
146}
147
[77]148type Channel struct {
[497]149 ID int64
150 Name string
151 Key string
[434]152
[497]153 Detached bool
154 DetachedInternalMsgID string
155
[434]156 RelayDetached MessageFilter
157 ReattachOn MessageFilter
158 DetachAfter time.Duration
159 DetachOn MessageFilter
[77]160}
161
[489]162type DeliveryReceipt struct {
163 ID int64
164 Target string // channel or nick
165 Client string
166 InternalMsgID string
167}
Note: See TracBrowser for help on using the repository browser.