view auth/connection.go @ 190:3457a60fb12d

Added stub for a persistent session store.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 20 Jul 2018 17:11:57 +0200
parents 3349bfc2a047
children 1585c334e8a7
line wrap: on
line source

package auth

import (
	"database/sql"
	"errors"
	"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) 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
	}
}