bca6a333 by astaxie

fix #140

1 parent c8f86652
...@@ -58,21 +58,12 @@ func (rs *RedisSessionStore) SessionID() string { ...@@ -58,21 +58,12 @@ func (rs *RedisSessionStore) SessionID() string {
58 58
59 func (rs *RedisSessionStore) SessionRelease() { 59 func (rs *RedisSessionStore) SessionRelease() {
60 defer rs.c.Close() 60 defer rs.c.Close()
61 keys, err := redis.Values(rs.c.Do("HKEYS", rs.sid))
62 if err == nil {
63 for _, key := range keys {
64 if val, ok := rs.values[key]; ok {
65 rs.c.Do("HSET", rs.sid, key, val)
66 rs.Delete(key)
67 } else {
68 rs.c.Do("HDEL", rs.sid, key)
69 }
70 }
71 }
72 if len(rs.values) > 0 { 61 if len(rs.values) > 0 {
73 for k, v := range rs.values { 62 b, err := encodeGob(rs.values)
74 rs.c.Do("HSET", rs.sid, k, v) 63 if err != nil {
64 return
75 } 65 }
66 rs.c.Do("SET", rs.sid, string(b))
76 } 67 }
77 } 68 }
78 69
...@@ -123,31 +114,27 @@ func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { ...@@ -123,31 +114,27 @@ func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error {
123 114
124 func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { 115 func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) {
125 c := rp.poollist.Get() 116 c := rp.poollist.Get()
126 //if str, err := redis.String(c.Do("GET", sid)); err != nil || str == "" { 117 if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 {
127 if str, err := redis.String(c.Do("HGET", sid, sid)); err != nil || str == "" { 118 c.Do("SET", sid)
128 //c.Do("SET", sid, sid, rp.maxlifetime)
129 c.Do("HSET", sid, sid, rp.maxlifetime)
130 } 119 }
131 c.Do("EXPIRE", sid, rp.maxlifetime) 120 c.Do("EXPIRE", sid, rp.maxlifetime)
132 kvs, err := redis.Values(c.Do("HGETALL", sid)) 121 kvs, err := redis.String(c.Do("GET", sid))
133 vals := make(map[interface{}]interface{}) 122 var kv map[interface{}]interface{}
134 var key interface{} 123 if len(kvs) == 0 {
135 if err == nil { 124 kv = make(map[interface{}]interface{})
136 for k, v := range kvs {
137 if k%2 == 0 {
138 key = v
139 } else { 125 } else {
140 vals[key] = v 126 kv, err = decodeGob([]byte(kvs))
141 } 127 if err != nil {
128 return nil, err
142 } 129 }
143 } 130 }
144 rs := &RedisSessionStore{c: c, sid: sid, values: vals} 131 rs := &RedisSessionStore{c: c, sid: sid, values: kv}
145 return rs, nil 132 return rs, nil
146 } 133 }
147 134
148 func (rp *RedisProvider) SessionExist(sid string) bool { 135 func (rp *RedisProvider) SessionExist(sid string) bool {
149 c := rp.poollist.Get() 136 c := rp.poollist.Get()
150 if str, err := redis.String(c.Do("HGET", sid, sid)); err != nil || str == "" { 137 if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 {
151 return false 138 return false
152 } else { 139 } else {
153 return true 140 return true
...@@ -156,24 +143,22 @@ func (rp *RedisProvider) SessionExist(sid string) bool { ...@@ -156,24 +143,22 @@ func (rp *RedisProvider) SessionExist(sid string) bool {
156 143
157 func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { 144 func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) {
158 c := rp.poollist.Get() 145 c := rp.poollist.Get()
159 if str, err := redis.String(c.Do("HGET", oldsid, oldsid)); err != nil || str == "" { 146 if existed, err := redis.Int(c.Do("EXISTS", oldsid)); err != nil || existed == 0 {
160 c.Do("HSET", oldsid, oldsid, rp.maxlifetime) 147 c.Do("SET", oldsid)
161 } 148 }
162 c.Do("RENAME", oldsid, sid) 149 c.Do("RENAME", oldsid, sid)
163 c.Do("EXPIRE", sid, rp.maxlifetime) 150 c.Do("EXPIRE", sid, rp.maxlifetime)
164 kvs, err := redis.Values(c.Do("HGETALL", sid)) 151 kvs, err := redis.String(c.Do("GET", sid))
165 vals := make(map[interface{}]interface{}) 152 var kv map[interface{}]interface{}
166 var key interface{} 153 if len(kvs) == 0 {
167 if err == nil { 154 kv = make(map[interface{}]interface{})
168 for k, v := range kvs {
169 if k%2 == 0 {
170 key = v
171 } else { 155 } else {
172 vals[key] = v 156 kv, err = decodeGob([]byte(kvs))
173 } 157 if err != nil {
158 return nil, err
174 } 159 }
175 } 160 }
176 rs := &RedisSessionStore{c: c, sid: sid, values: vals} 161 rs := &RedisSessionStore{c: c, sid: sid, values: kv}
177 return rs, nil 162 return rs, nil
178 } 163 }
179 164
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!