fix #140
Showing
1 changed file
with
27 additions
and
42 deletions
| ... | @@ -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 { | 125 | } else { |
| 137 | if k%2 == 0 { | 126 | kv, err = decodeGob([]byte(kvs)) |
| 138 | key = v | 127 | if err != nil { |
| 139 | } else { | 128 | return nil, err |
| 140 | vals[key] = v | ||
| 141 | } | ||
| 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 { | 155 | } else { |
| 169 | if k%2 == 0 { | 156 | kv, err = decodeGob([]byte(kvs)) |
| 170 | key = v | 157 | if err != nil { |
| 171 | } else { | 158 | return nil, err |
| 172 | vals[key] = v | ||
| 173 | } | ||
| 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 | ... | ... |
-
Please register or sign in to post a comment