Mercurial > gemma
view auth/connection.go @ 195:5dc8e734487a
Introduce database schemas as privilege-based namespaces
Some privileges changed (e.g. for responsibility_areas), but additional
privileges were not left off intentionally before.
Search path settings have been replaced by schema-qualifying names in
statements to prevent object definitions from being dependend on
search path settings.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Fri, 20 Jul 2018 17:28:16 +0200 |
parents | 1585c334e8a7 |
children | e85413e5befa |
line wrap: on
line source
package auth import ( "bytes" "database/sql" "encoding/binary" "errors" "io" "log" "sync" "time" "gemma.intevation.de/gemma/config" ) var ErrNoSuchToken = errors.New("No such token") type ConnectionPool interface { Delete(token string) bool Add(token string, session *Session) *Connection Renew(token string) (string, error) Do(token string, fn func(*sql.DB) error) error Session(token string) *Session Shutdown() error } var ConnPool = func() ConnectionPool { if config.Config.SessionStore != "" { cp, err := NewPersistentConnectionPool(config.Config.SessionStore) if err != nil { log.Panicf("Error with session store: %v\n", err) } return cp } return NewInMemoryConnectionPool() }() const ( maxOpen = 16 maxDBIdle = time.Minute * 5 ) type Connection struct { session *Session access time.Time db *sql.DB refCount int mu sync.Mutex } func (c *Connection) serialize() []byte { var buf bytes.Buffer c.session.serialize(&buf) access, _ := c.last().MarshalText() binary.Write(&buf, binary.BigEndian, string(access)) return buf.Bytes() } func (c *Connection) unserialize(r io.Reader) error { session := new(Session) if err := session.unserialize(r); err != nil { return err } var access string if err := binary.Read(r, binary.BigEndian, &access); err != nil { return err } var t time.Time if err := t.UnmarshalText([]byte(access)); err != nil { return err } *c = Connection{ session: session, access: t, } return nil } func (c *Connection) set(session *Session) { c.session = session c.touch() } func (c *Connection) touch() { c.mu.Lock() c.access = time.Now() c.mu.Unlock() } func (c *Connection) last() time.Time { c.mu.Lock() access := c.access c.mu.Unlock() return access } func (c *Connection) close() { if c.db != nil { if err := c.db.Close(); err != nil { log.Printf("warn: %v\n", err) } c.db = nil } }