7ec2a077 by Meaglith Ma

Fix the wrong parameter bug in ledis session.

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