annotate auth/pool.go @ 213:2fad2931a5a6

Fix for [issue78] gemma back end broken for me since 213:3d0988d9f867 During unification of the two connection pool implementions forget to initialize the tokens -> connection mapping in the non-persistent case.
author Sascha L. Teichmann <teichmann@intevation.de>
date Mon, 23 Jul 2018 20:38:40 +0200
parents 2a152816fc38
children 11d1a488b08f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package auth
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import (
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
4 "bytes"
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 "database/sql"
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 "log"
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
7 "time"
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
8
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
9 bolt "github.com/coreos/bbolt"
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 )
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
12 type ConnectionPool struct {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
13 storage *bolt.DB
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
14 conns map[string]*Connection
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
15 cmds chan func(*ConnectionPool)
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
18 var sessionsBucket = []byte("sessions")
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
19
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
20 func NewConnectionPool(filename string) (*ConnectionPool, error) {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
21
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
22 pcp := &ConnectionPool{
213
2fad2931a5a6 Fix for [issue78] gemma back end broken for me since 213:3d0988d9f867
Sascha L. Teichmann <teichmann@intevation.de>
parents: 205
diff changeset
23 conns: make(map[string]*Connection),
2fad2931a5a6 Fix for [issue78] gemma back end broken for me since 213:3d0988d9f867
Sascha L. Teichmann <teichmann@intevation.de>
parents: 205
diff changeset
24 cmds: make(chan func(*ConnectionPool)),
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
25 }
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
26 if err := pcp.openStorage(filename); err != nil {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
27 return nil, err
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
28 }
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
29 go pcp.run()
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
30 return pcp, nil
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
31 }
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
32
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
33 // openStorage opens a storage file.
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
34 func (pcp *ConnectionPool) openStorage(filename string) error {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
35
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
36 // No file, nothing to restore/persist.
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
37 if filename == "" {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
38 return nil
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
39 }
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
41 db, err := bolt.Open(filename, 0600, nil)
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
42 if err != nil {
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
43 return err
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
44 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
45
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
46 err = db.Update(func(tx *bolt.Tx) error {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
47 b, err := tx.CreateBucketIfNotExists(sessionsBucket)
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
48 if err != nil {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
49 return err
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
50 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
51
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
52 // pre-load sessions
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
53 c := b.Cursor()
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
54
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
55 for k, v := c.First(); k != nil; k, v = c.Next() {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
56 var conn Connection
197
e85413e5befa Cleaned up serialisation/deserilisation of sessions a bit.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 193
diff changeset
57 if err := conn.deserialize(bytes.NewReader(v)); err != nil {
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
58 return err
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
59 }
213
2fad2931a5a6 Fix for [issue78] gemma back end broken for me since 213:3d0988d9f867
Sascha L. Teichmann <teichmann@intevation.de>
parents: 205
diff changeset
60 pcp.conns[string(k)] = &conn
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
61 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
62
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
63 return nil
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
64 })
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
65
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
66 if err != nil {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
67 db.Close()
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
68 return err
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
69 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
70
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
71 pcp.storage = db
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
72 return nil
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
75 func (pcp *ConnectionPool) run() {
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
76 for {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
77 select {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
78 case cmd := <-pcp.cmds:
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
79 cmd(pcp)
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
80 case <-time.After(time.Minute):
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
81 pcp.cleanDB()
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
82 case <-time.After(time.Minute * 5):
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
83 pcp.cleanToken()
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
84 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
85 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
86 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
87
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
88 func (pcp *ConnectionPool) cleanDB() {
203
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
89 valid := time.Now().Add(-maxDBIdle)
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
90 for _, con := range pcp.conns {
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
91 if con.refCount <= 0 && con.last().Before(valid) {
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
92 con.close()
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
93 }
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
94 }
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
95 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
96
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
97 func (pcp *ConnectionPool) cleanToken() {
203
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
98 now := time.Now()
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
99 for token, con := range pcp.conns {
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
100 expires := time.Unix(con.session.ExpiresAt, 0)
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
101 if expires.Before(now) {
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
102 // TODO: Be more graceful here?
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
103 con.close()
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
104 delete(pcp.conns, token)
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
105 pcp.remove(token)
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
106 }
6a802aed7f99 Persistent session store: Implemented cleanDB/cleanToken.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 202
diff changeset
107 }
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
108 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
109
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
110 func (pcp *ConnectionPool) remove(token string) {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
111 if pcp.storage == nil {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
112 return
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
113 }
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
114 err := pcp.storage.Update(func(tx *bolt.Tx) error {
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
115 b := tx.Bucket(sessionsBucket)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
116 return b.Delete([]byte(token))
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
117 })
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
118 if err != nil {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
119 log.Printf("error: %v\n", err)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
120 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
121 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
122
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
123 func (pcp *ConnectionPool) Delete(token string) bool {
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
124 res := make(chan bool)
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
125 pcp.cmds <- func(pcp *ConnectionPool) {
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
126 conn, found := pcp.conns[token]
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
127 if !found {
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
128 res <- false
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
129 return
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
130 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
131 conn.close()
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
132 delete(pcp.conns, token)
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
133 pcp.remove(token)
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
134 res <- true
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
135 }
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
136 return <-res
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
137 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
138
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
139 func (pcp *ConnectionPool) store(token string, con *Connection) {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
140 if pcp.storage == nil {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
141 return
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
142 }
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
143 err := pcp.storage.Update(func(tx *bolt.Tx) error {
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
144 b := tx.Bucket(sessionsBucket)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
145 var buf bytes.Buffer
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
146 if err := con.serialize(&buf); err != nil {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
147 return err
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
148 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
149 return b.Put([]byte(token), buf.Bytes())
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
150 })
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
151 if err != nil {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
152 log.Printf("error: %v\n", err)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
153 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
154 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
155
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
156 func (pcp *ConnectionPool) Add(token string, session *Session) *Connection {
199
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
157 res := make(chan *Connection)
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
158
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
159 pcp.cmds <- func(cp *ConnectionPool) {
199
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
160 con := pcp.conns[token]
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
161 if con == nil {
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
162 con = &Connection{}
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
163 pcp.conns[token] = con
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
164 }
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
165 con.set(session)
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
166 pcp.store(token, con)
199
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
167 res <- con
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
168 }
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
169
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
170 con := <-res
ddc7ef95c247 Implemented Add of persistent sessions.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 197
diff changeset
171 return con
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
172 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
173
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
174 func (pcp *ConnectionPool) Renew(token string) (string, error) {
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
175
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
176 type result struct {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
177 newToken string
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
178 err error
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
179 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
180
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
181 resCh := make(chan result)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
182
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
183 pcp.cmds <- func(cp *ConnectionPool) {
200
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
184 con := pcp.conns[token]
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
185 if con == nil {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
186 resCh <- result{err: ErrNoSuchToken}
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
187 } else {
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
188 delete(pcp.conns, token)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
189 pcp.remove(token)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
190 newToken := GenerateSessionKey()
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
191 // TODO: Ensure that this is not racy!
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
192 con.session.ExpiresAt = time.Now().Add(maxTokenValid).Unix()
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
193 pcp.conns[newToken] = con
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
194 pcp.store(newToken, con)
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
195 resCh <- result{newToken: newToken}
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
196 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
197 }
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
198
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
199 r := <-resCh
8426a92fda00 Persistent session store: Implmented Renew.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 199
diff changeset
200 return r.newToken, r.err
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
201 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
202
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
203 func (pcp *ConnectionPool) trim(conn *Connection) {
201
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
204
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
205 conn.refCount--
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
206
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
207 for {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
208 least := time.Now()
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
209 var count int
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
210 var oldest *Connection
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
211
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
212 for _, con := range pcp.conns {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
213 if con.db != nil && con.refCount <= 0 {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
214 if last := con.last(); last.Before(least) {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
215 least = last
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
216 oldest = con
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
217 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
218 count++
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
219 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
220 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
221 if count <= maxOpen {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
222 break
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
223 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
224 oldest.close()
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
225 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
226 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
227
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
228 func (pcp *ConnectionPool) Do(token string, fn func(*sql.DB) error) error {
201
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
229
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
230 type result struct {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
231 con *Connection
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
232 err error
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
233 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
234
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
235 res := make(chan result)
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
236
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
237 pcp.cmds <- func(pcp *ConnectionPool) {
201
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
238 con := pcp.conns[token]
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
239 if con == nil {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
240 res <- result{err: ErrNoSuchToken}
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
241 return
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
242 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
243 con.touch()
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
244 // store the session here. The ref counting for
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
245 // open db connections is irrelevant for persistence
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
246 // as they all come up closed when the system reboots.
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
247 pcp.store(token, con)
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
248
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
249 if con.db != nil {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
250 con.refCount++
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
251 res <- result{con: con}
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
252 return
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
253 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
254
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
255 session := con.session
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
256 db, err := opendb(session.User, session.Password)
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
257 if err != nil {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
258 res <- result{err: err}
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
259 return
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
260 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
261 con.db = db
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
262 con.refCount++
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
263 res <- result{con: con}
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
264 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
265
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
266 r := <-res
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
267
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
268 if r.err != nil {
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
269 return r.err
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
270 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
271
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
272 defer func() {
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
273 pcp.cmds <- func(pcp *ConnectionPool) {
201
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
274 pcp.trim(r.con)
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
275 }
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
276 }()
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
277
80dc7bbe97db Persistent session store: Implemented Do.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 200
diff changeset
278 return fn(r.con.db)
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
279 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
280
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
281 func (pcp *ConnectionPool) Session(token string) *Session {
202
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
282 res := make(chan *Session)
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
283 pcp.cmds <- func(pcp *ConnectionPool) {
202
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
284 con := pcp.conns[token]
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
285 if con == nil {
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
286 res <- nil
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
287 } else {
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
288 con.touch()
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
289 pcp.store(token, con)
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
290 res <- con.session
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
291 }
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
292 }
dba50c51cda7 Persistent session store: Implemented Session.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 201
diff changeset
293 return <-res
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
294 }
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
295
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
296 func (pcp *ConnectionPool) Shutdown() error {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
297 if db := pcp.storage; db != nil {
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
298 log.Println("info: shutdown persistent connection pool.")
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
299 pcp.storage = nil
193
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
300 return db.Close()
1585c334e8a7 More on persisting sessions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 190
diff changeset
301 }
204
3d0988d9f867 De-virtualize the connection pool implementation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 203
diff changeset
302 log.Println("info: shutdown in-memory connection pool.")
190
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
303 return nil
3457a60fb12d Added stub for a persistent session store.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
304 }