0188fb37 by Meaglith Ma

Merge pull request #1 from chliang2030598/master

add session store in ledis
2 parents 2a85c79c 0bcd828d
1 package session
2
3 import (
4 "net/http"
5 "sync"
6
7 "github.com/astaxie/beego/session"
8 "github.com/siddontang/ledisdb/config"
9 "github.com/siddontang/ledisdb/ledis"
10 )
11
12 var ledispder = &LedisProvider{}
13 var c *ledis.DB
14
15 // ledis session store
16 type LedisSessionStore struct {
17 sid string
18 lock sync.RWMutex
19 values map[interface{}]interface{}
20 maxlifetime int64
21 }
22
23 // set value in ledis session
24 func (ls *LedisSessionStore) Set(key, value interface{}) error {
25 ls.lock.Lock()
26 defer ls.lock.Unlock()
27 ls.values[key] = value
28 return nil
29 }
30
31 // get value in ledis session
32 func (ls *LedisSessionStore) Get(key interface{}) interface{} {
33 ls.lock.RLock()
34 defer ls.lock.RUnlock()
35 if v, ok := ls.values[key]; ok {
36 return v
37 } else {
38 return nil
39 }
40 }
41
42 // delete value in ledis session
43 func (ls *LedisSessionStore) Delete(key interface{}) error {
44 ls.lock.Lock()
45 defer ls.lock.Unlock()
46 delete(ls.values, key)
47 return nil
48 }
49
50 // clear all values in ledis session
51 func (ls *LedisSessionStore) Flush() error {
52 ls.lock.Lock()
53 defer ls.lock.Unlock()
54 ls.values = make(map[interface{}]interface{})
55 return nil
56 }
57
58 // get ledis session id
59 func (ls *LedisSessionStore) SessionID() string {
60 return ls.sid
61 }
62
63 // save session values to ledis
64 func (ls *LedisSessionStore) SessionRelease(w http.ResponseWriter) {
65 b, err := session.EncodeGob(ls.values)
66 if err != nil {
67 return
68 }
69 c.Set([]byte(ls.sid), b)
70 c.Expire([]byte(ls.sid), ls.maxlifetime)
71 }
72
73 // ledis session provider
74 type LedisProvider struct {
75 maxlifetime int64
76 savePath string
77 }
78
79 // init ledis session
80 // savepath like ledis server saveDataPath,pool size
81 // e.g. 127.0.0.1:6379,100,astaxie
82 func (lp *LedisProvider) SessionInit(maxlifetime int64, savePath string) error {
83 lp.maxlifetime = maxlifetime
84 lp.savePath = savePath
85 cfg := new(config.Config)
86 cfg.DataDir = lp.savePath
87 var err error
88 nowLedis, err := ledis.Open(cfg)
89 c, err = nowLedis.Select(0)
90 if err != nil {
91 println(err)
92 return nil
93 }
94 return nil
95 }
96
97 // read ledis session by sid
98 func (lp *LedisProvider) SessionRead(sid string) (session.SessionStore, error) {
99 kvs, err := c.Get([]byte(sid))
100 var kv map[interface{}]interface{}
101 if len(kvs) == 0 {
102 kv = make(map[interface{}]interface{})
103 } else {
104 kv, err = session.DecodeGob(kvs)
105 if err != nil {
106 return nil, err
107 }
108 }
109 ls := &LedisSessionStore{sid: sid, values: kv, maxlifetime: lp.maxlifetime}
110 return ls, nil
111 }
112
113 // check ledis session exist by sid
114 func (lp *LedisProvider) SessionExist(sid string) bool {
115 count, _ := c.Exists([]byte(sid))
116 if count == 0 {
117 return false
118 } else {
119 return true
120 }
121 }
122
123 // generate new sid for ledis session
124 func (lp *LedisProvider) SessionRegenerate(oldsid, sid string) (session.SessionStore, error) {
125 count, _ := c.Exists([]byte(sid))
126 if count == 0 {
127 // oldsid doesn't exists, set the new sid directly
128 // ignore error here, since if it return error
129 // the existed value will be 0
130 c.Set([]byte(sid), []byte(""))
131 c.Expire([]byte(sid), lp.maxlifetime)
132 } else {
133 data, _ := c.Get([]byte(oldsid))
134 c.Set([]byte(sid), data)
135 c.Expire([]byte(sid), lp.maxlifetime)
136 }
137 kvs, err := c.Get([]byte(sid))
138 var kv map[interface{}]interface{}
139 if len(kvs) == 0 {
140 kv = make(map[interface{}]interface{})
141 } else {
142 kv, err = session.DecodeGob([]byte(kvs))
143 if err != nil {
144 return nil, err
145 }
146 }
147 ls := &LedisSessionStore{sid: sid, values: kv, maxlifetime: lp.maxlifetime}
148 return ls, nil
149 }
150
151 // delete ledis session by id
152 func (lp *LedisProvider) SessionDestroy(sid string) error {
153 c.Del([]byte(sid))
154 return nil
155 }
156
157 // Impelment method, no used.
158 func (lp *LedisProvider) SessionGC() {
159 return
160 }
161
162 // @todo
163 func (lp *LedisProvider) SessionAll() int {
164 return 0
165 }
166 func init() {
167 session.Register("ledis", ledispder)
168 }
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!