Beego/session/ledis/ledis_session.go

177 lines
4.0 KiB
Go
Raw Normal View History

2015-09-12 14:53:55 +00:00
// Package ledis provide session Provider
package ledis
2014-10-27 05:56:00 +00:00
import (
2015-03-01 04:59:34 +00:00
"net/http"
"strconv"
"strings"
"sync"
"github.com/astaxie/beego/session"
"github.com/siddontang/ledisdb/config"
"github.com/siddontang/ledisdb/ledis"
2014-10-27 05:56:00 +00:00
)
2015-09-12 14:53:55 +00:00
var ledispder = &Provider{}
2014-10-27 05:56:00 +00:00
var c *ledis.DB
2015-09-12 14:53:55 +00:00
// SessionStore ledis session store
type SessionStore struct {
2015-03-01 04:59:34 +00:00
sid string
lock sync.RWMutex
values map[interface{}]interface{}
maxlifetime int64
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// Set value in ledis session
func (ls *SessionStore) Set(key, value interface{}) error {
2015-03-01 04:59:34 +00:00
ls.lock.Lock()
defer ls.lock.Unlock()
ls.values[key] = value
return nil
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// Get value in ledis session
func (ls *SessionStore) Get(key interface{}) interface{} {
2015-03-01 04:59:34 +00:00
ls.lock.RLock()
defer ls.lock.RUnlock()
if v, ok := ls.values[key]; ok {
return v
}
2015-09-12 14:53:55 +00:00
return nil
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// Delete value in ledis session
func (ls *SessionStore) Delete(key interface{}) error {
2015-03-01 04:59:34 +00:00
ls.lock.Lock()
defer ls.lock.Unlock()
delete(ls.values, key)
return nil
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// Flush clear all values in ledis session
func (ls *SessionStore) Flush() error {
2015-03-01 04:59:34 +00:00
ls.lock.Lock()
defer ls.lock.Unlock()
ls.values = make(map[interface{}]interface{})
return nil
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// SessionID get ledis session id
func (ls *SessionStore) SessionID() string {
2015-03-01 04:59:34 +00:00
return ls.sid
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// SessionRelease save session values to ledis
func (ls *SessionStore) SessionRelease(w http.ResponseWriter) {
2015-03-01 04:59:34 +00:00
b, err := session.EncodeGob(ls.values)
if err != nil {
return
}
c.Set([]byte(ls.sid), b)
c.Expire([]byte(ls.sid), ls.maxlifetime)
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// Provider ledis session provider
type Provider struct {
2015-03-01 04:59:34 +00:00
maxlifetime int64
savePath string
db int
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// SessionInit init ledis session
2014-10-27 05:56:00 +00:00
// savepath like ledis server saveDataPath,pool size
// e.g. 127.0.0.1:6379,100,astaxie
2015-09-12 14:53:55 +00:00
func (lp *Provider) SessionInit(maxlifetime int64, savePath string) error {
2015-03-01 04:59:34 +00:00
var err error
lp.maxlifetime = maxlifetime
configs := strings.Split(savePath, ",")
if len(configs) == 1 {
lp.savePath = configs[0]
} else if len(configs) == 2 {
lp.savePath = configs[0]
lp.db, err = strconv.Atoi(configs[1])
if err != nil {
return err
}
}
cfg := new(config.Config)
cfg.DataDir = lp.savePath
nowLedis, err := ledis.Open(cfg)
c, err = nowLedis.Select(lp.db)
if err != nil {
println(err)
return nil
}
return nil
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// SessionRead read ledis session by sid
func (lp *Provider) SessionRead(sid string) (session.Store, error) {
2015-03-01 04:59:34 +00:00
kvs, err := c.Get([]byte(sid))
var kv map[interface{}]interface{}
if len(kvs) == 0 {
kv = make(map[interface{}]interface{})
} else {
kv, err = session.DecodeGob(kvs)
if err != nil {
return nil, err
}
}
2015-09-12 14:53:55 +00:00
ls := &SessionStore{sid: sid, values: kv, maxlifetime: lp.maxlifetime}
2015-03-01 04:59:34 +00:00
return ls, nil
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// SessionExist check ledis session exist by sid
func (lp *Provider) SessionExist(sid string) bool {
2015-03-01 04:59:34 +00:00
count, _ := c.Exists([]byte(sid))
2017-03-17 17:24:45 +00:00
return !(count == 0)
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// SessionRegenerate generate new sid for ledis session
func (lp *Provider) SessionRegenerate(oldsid, sid string) (session.Store, error) {
2015-03-01 04:59:34 +00:00
count, _ := c.Exists([]byte(sid))
if count == 0 {
// oldsid doesn't exists, set the new sid directly
// ignore error here, since if it return error
// the existed value will be 0
c.Set([]byte(sid), []byte(""))
c.Expire([]byte(sid), lp.maxlifetime)
} else {
data, _ := c.Get([]byte(oldsid))
c.Set([]byte(sid), data)
c.Expire([]byte(sid), lp.maxlifetime)
}
kvs, err := c.Get([]byte(sid))
var kv map[interface{}]interface{}
if len(kvs) == 0 {
kv = make(map[interface{}]interface{})
} else {
kv, err = session.DecodeGob([]byte(kvs))
if err != nil {
return nil, err
}
}
2015-09-12 14:53:55 +00:00
ls := &SessionStore{sid: sid, values: kv, maxlifetime: lp.maxlifetime}
2015-03-01 04:59:34 +00:00
return ls, nil
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// SessionDestroy delete ledis session by id
func (lp *Provider) SessionDestroy(sid string) error {
2015-03-01 04:59:34 +00:00
c.Del([]byte(sid))
return nil
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// SessionGC Impelment method, no used.
func (lp *Provider) SessionGC() {
2015-03-01 04:59:34 +00:00
return
2014-10-27 05:56:00 +00:00
}
2015-09-12 14:53:55 +00:00
// SessionAll return all active session
func (lp *Provider) SessionAll() int {
2015-03-01 04:59:34 +00:00
return 0
2014-10-27 05:56:00 +00:00
}
func init() {
2015-03-01 04:59:34 +00:00
session.Register("ledis", ledispder)
2014-10-27 05:56:00 +00:00
}