Mercurial > gemma
annotate auth/connection.go @ 148:0116aae1071b
Made ConnectionPool an interface and use current in-memory implementation.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 02 Jul 2018 11:00:19 +0200 |
parents | 0c56c56a1c44 |
children | 3349bfc2a047 |
rev | line source |
---|---|
26
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 package auth |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 import ( |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 "database/sql" |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 "errors" |
126
89cf2e7672ff
Implemented an explicit token deletion under endpoint /api/logout.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
27
diff
changeset
|
6 "log" |
134
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
7 "sync" |
26
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 "time" |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 ) |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 var ErrNoSuchToken = errors.New("No such token") |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 |
148
0116aae1071b
Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
134
diff
changeset
|
13 type ConnectionPool interface { |
0116aae1071b
Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
134
diff
changeset
|
14 Delete(token string) bool |
0116aae1071b
Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
134
diff
changeset
|
15 Add(token string, session *Session) *Connection |
0116aae1071b
Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
134
diff
changeset
|
16 Renew(token string) (string, error) |
0116aae1071b
Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
134
diff
changeset
|
17 Do(token string, fn func(*sql.DB) error) error |
0116aae1071b
Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
134
diff
changeset
|
18 Session(token string) *Session |
0116aae1071b
Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
134
diff
changeset
|
19 } |
0116aae1071b
Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
134
diff
changeset
|
20 |
0116aae1071b
Made ConnectionPool an interface and use current in-memory implementation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
134
diff
changeset
|
21 var ConnPool ConnectionPool = NewInMemoryConnectionPool() |
26
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
22 |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
23 const ( |
130
13b82701b1fb
Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
129
diff
changeset
|
24 maxOpen = 16 |
13b82701b1fb
Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
129
diff
changeset
|
25 maxDBIdle = time.Minute * 5 |
26
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
26 ) |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 type Connection struct { |
134
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
29 session *Session |
26
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 |
131
af114cf64822
Added some reference counting to open db connection to not forcefully close them when system is under pressure. TODO: check if this race free (it should).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
130
diff
changeset
|
31 access time.Time |
af114cf64822
Added some reference counting to open db connection to not forcefully close them when system is under pressure. TODO: check if this race free (it should).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
130
diff
changeset
|
32 db *sql.DB |
af114cf64822
Added some reference counting to open db connection to not forcefully close them when system is under pressure. TODO: check if this race free (it should).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
130
diff
changeset
|
33 refCount int |
134
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
34 |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
35 mu sync.Mutex |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
36 } |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
37 |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
38 func (c *Connection) set(session *Session) { |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
39 c.session = session |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
40 c.touch() |
26
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 } |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
42 |
134
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
43 func (c *Connection) touch() { |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
44 c.mu.Lock() |
26
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 c.access = time.Now() |
134
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
46 c.mu.Unlock() |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
47 } |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
48 |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
49 func (c *Connection) last() time.Time { |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
50 c.mu.Lock() |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
51 access := c.access |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
52 c.mu.Unlock() |
0c56c56a1c44
Removed the JWT layer from the session management.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
133
diff
changeset
|
53 return access |
26
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
54 } |
96a429c5f227
Fundamental connection pool based on tokens.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
55 |
130
13b82701b1fb
Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
129
diff
changeset
|
56 func (c *Connection) close() { |
13b82701b1fb
Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
129
diff
changeset
|
57 if c.db != nil { |
13b82701b1fb
Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
129
diff
changeset
|
58 if err := c.db.Close(); err != nil { |
13b82701b1fb
Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
129
diff
changeset
|
59 log.Printf("warn: %v\n", err) |
13b82701b1fb
Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
129
diff
changeset
|
60 } |
13b82701b1fb
Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
129
diff
changeset
|
61 c.db = nil |
13b82701b1fb
Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
129
diff
changeset
|
62 } |
13b82701b1fb
Take expiring time from serialized tokens to garbage collect them.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
129
diff
changeset
|
63 } |