Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
beego
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
beego
Commits
1822dd95
Commit
1822dd95
authored
Oct 29, 2014
by
astaxie
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #892 from dockercn/master
Add a beego session backend using LedisDB
parents
ddbfc25e
0188fb37
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
168 additions
and
0 deletions
+168
-0
ledis_session.go
session/ledis/ledis_session.go
+168
-0
No files found.
session/ledis/ledis_session.go
0 → 100644
View file @
1822dd95
package
session
import
(
"net/http"
"sync"
"github.com/astaxie/beego/session"
"github.com/siddontang/ledisdb/config"
"github.com/siddontang/ledisdb/ledis"
)
var
ledispder
=
&
LedisProvider
{}
var
c
*
ledis
.
DB
// ledis session store
type
LedisSessionStore
struct
{
sid
string
lock
sync
.
RWMutex
values
map
[
interface
{}]
interface
{}
maxlifetime
int64
}
// set value in ledis session
func
(
ls
*
LedisSessionStore
)
Set
(
key
,
value
interface
{})
error
{
ls
.
lock
.
Lock
()
defer
ls
.
lock
.
Unlock
()
ls
.
values
[
key
]
=
value
return
nil
}
// get value in ledis session
func
(
ls
*
LedisSessionStore
)
Get
(
key
interface
{})
interface
{}
{
ls
.
lock
.
RLock
()
defer
ls
.
lock
.
RUnlock
()
if
v
,
ok
:=
ls
.
values
[
key
];
ok
{
return
v
}
else
{
return
nil
}
}
// delete value in ledis session
func
(
ls
*
LedisSessionStore
)
Delete
(
key
interface
{})
error
{
ls
.
lock
.
Lock
()
defer
ls
.
lock
.
Unlock
()
delete
(
ls
.
values
,
key
)
return
nil
}
// clear all values in ledis session
func
(
ls
*
LedisSessionStore
)
Flush
()
error
{
ls
.
lock
.
Lock
()
defer
ls
.
lock
.
Unlock
()
ls
.
values
=
make
(
map
[
interface
{}]
interface
{})
return
nil
}
// get ledis session id
func
(
ls
*
LedisSessionStore
)
SessionID
()
string
{
return
ls
.
sid
}
// save session values to ledis
func
(
ls
*
LedisSessionStore
)
SessionRelease
(
w
http
.
ResponseWriter
)
{
b
,
err
:=
session
.
EncodeGob
(
ls
.
values
)
if
err
!=
nil
{
return
}
c
.
Set
([]
byte
(
ls
.
sid
),
b
)
c
.
Expire
([]
byte
(
ls
.
sid
),
ls
.
maxlifetime
)
}
// ledis session provider
type
LedisProvider
struct
{
maxlifetime
int64
savePath
string
}
// init ledis session
// savepath like ledis server saveDataPath,pool size
// e.g. 127.0.0.1:6379,100,astaxie
func
(
lp
*
LedisProvider
)
SessionInit
(
maxlifetime
int64
,
savePath
string
)
error
{
lp
.
maxlifetime
=
maxlifetime
lp
.
savePath
=
savePath
cfg
:=
new
(
config
.
Config
)
cfg
.
DataDir
=
lp
.
savePath
var
err
error
nowLedis
,
err
:=
ledis
.
Open
(
cfg
)
c
,
err
=
nowLedis
.
Select
(
0
)
if
err
!=
nil
{
println
(
err
)
return
nil
}
return
nil
}
// read ledis session by sid
func
(
lp
*
LedisProvider
)
SessionRead
(
sid
string
)
(
session
.
SessionStore
,
error
)
{
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
}
}
ls
:=
&
LedisSessionStore
{
sid
:
sid
,
values
:
kv
,
maxlifetime
:
lp
.
maxlifetime
}
return
ls
,
nil
}
// check ledis session exist by sid
func
(
lp
*
LedisProvider
)
SessionExist
(
sid
string
)
bool
{
count
,
_
:=
c
.
Exists
([]
byte
(
sid
))
if
count
==
0
{
return
false
}
else
{
return
true
}
}
// generate new sid for ledis session
func
(
lp
*
LedisProvider
)
SessionRegenerate
(
oldsid
,
sid
string
)
(
session
.
SessionStore
,
error
)
{
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
}
}
ls
:=
&
LedisSessionStore
{
sid
:
sid
,
values
:
kv
,
maxlifetime
:
lp
.
maxlifetime
}
return
ls
,
nil
}
// delete ledis session by id
func
(
lp
*
LedisProvider
)
SessionDestroy
(
sid
string
)
error
{
c
.
Del
([]
byte
(
sid
))
return
nil
}
// Impelment method, no used.
func
(
lp
*
LedisProvider
)
SessionGC
()
{
return
}
// @todo
func
(
lp
*
LedisProvider
)
SessionAll
()
int
{
return
0
}
func
init
()
{
session
.
Register
(
"ledis"
,
ledispder
)
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment