mirror of
https://github.com/astaxie/beego.git
synced 2025-06-21 19:40:18 +00:00
remove pkg directory;
remove build directory; remove githook directory;
This commit is contained in:
.travis.ymldoc.go
adapter
admin.goapp.gobeego.gobuild_info.gopolicy.gorouter.go
cache
config.goconfig
context
controller.godoc.goerror.gofilter.goflash.gofs.gograce
httplib
log.gologs
metric
migration
namespace.goorm
cmd.godb.godb_alias.gomodels.gomodels_boot.gomodels_fields.goorm.goorm_conds.goorm_log.goorm_queryset.goqb.goqb_mysql.goqb_tidb.goquery_setter_adapter.gotypes.goutils.goutils_test.go
plugins
apiauth
auth
authz
cors
session
couchbase
ledis
memcache
mysql
postgres
provider_adapter.goredis
redis_cluster
redis_sentinel
sess_cookie.gosess_cookie_test.gosess_file.gosess_file_test.gosess_mem.gosess_mem_test.gosess_test.gosess_utils.gosession.gossdb
store_adapter.goswagger
template.gotemplatefunc.gotemplatefunc_test.gotesting
toolbox
tree.gotree_test.goutils
caller.gocaller_test.go
captcha
debug.godebug_test.gofile.gomail.gomail_test.gopagination
rand.gorand_test.gosafemap.gosafemap_test.goslice.goslice_test.goutils.govalidation
build
build_info.goclient
cache
httplib
orm
README.mdcmd.gocmd_utils.godb.godb_alias.godb_alias_test.godb_mysql.godb_oracle.godb_postgres.godb_sqlite.godb_tables.godb_tidb.godb_utils.godo_nothing_orm.godo_nothing_orm_test.gofilter.gofilter_orm_decorator.gofilter_orm_decorator_test.gofilter_test.go
filter
bean
opentracing
prometheus
hints
invocation.gomigration
model_utils_test.gomodels.gomodels_boot.gomodels_fields.gomodels_info_f.gomodels_info_m.gomodels_test.gomodels_utils.gomodels_utils_test.goorm.goorm_conds.goorm_log.goorm_object.goorm_querym2m.goorm_queryset.goorm_raw.goorm_test.goqb.goqb_mysql.goqb_postgres.goqb_tidb.gotypes.goutils.goutils_test.gocore
bean
context.godoc.gofactory.gometadata.gotag_auto_wire_bean_factory.gotag_auto_wire_bean_factory_test.gotime_type_adapter.gotime_type_adapter_test.gotype_adapter.go
config
governor
logs
README.mdaccess_log.goaccess_log_test.go
alils
alils.goconfig.golog.pb.golog_config.golog_project.golog_store.gomachine_group.gorequest.gosignature.go
conn.goconn_test.goconsole.goconsole_test.goes
file.gofile_test.goformatter.goformatter_test.gojianliao.gojianliao_test.golog.golog_msg.golog_msg_test.golog_test.gologger.gologger_test.gomultifile.gomultifile_test.goslack.gosmtp.gosmtp_test.goutils
caller.gocaller_test.godebug.godebug_test.gofile.gofile_test.gokv.gokv_test.gomail.gomail_test.go
pagination
rand.gorand_test.gosafemap.gosafemap_test.goslice.goslice_test.gotestdata
time.goutils.goutils_test.govalidation
githook
pkg/adapter/logs
server/web
LICENSEadmin.goadmin_controller.goadmin_test.goadminui.gobeego.gofilter_chain_test.gofilter_test.goflash.goflash_test.gofs.go
captcha
config.goconfig_test.gocontext
acceptencoder.goacceptencoder_test.gocontext.gocontext_test.goinput.goinput_test.gooutput.go
controller.gocontroller_test.godoc.goerror.goerror_test.gofilter.goparam
renderer.goresponse.gofilter
apiauth
auth
authz
cors
opentracing
prometheus
grace
hooks.gomime.gonamespace.gonamespace_test.gopagination
parser.gopolicy.gorouter.gorouter_test.goserver.goserver_test.gosession
README.md
staticfile.gostaticfile_test.gostatistics.gostatistics_test.gocouchbase
ledis
memcache
mysql
postgres
redis
redis_cluster
redis_sentinel
sess_cookie.gosess_cookie_test.gosess_file.gosess_file_test.gosess_mem.gosess_mem_test.gosess_test.gosess_utils.gosession.gossdb
swagger
template.gotemplate_test.gotemplatefunc.gotemplatefunc_test.gotree.gotree_test.gounregroute_test.gotask
201
server/web/session/ssdb/sess_ssdb.go
Normal file
201
server/web/session/ssdb/sess_ssdb.go
Normal file
@ -0,0 +1,201 @@
|
||||
package ssdb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/ssdb/gossdb/ssdb"
|
||||
|
||||
"github.com/astaxie/beego/server/web/session"
|
||||
)
|
||||
|
||||
var ssdbProvider = &Provider{}
|
||||
|
||||
// Provider holds ssdb client and configs
|
||||
type Provider struct {
|
||||
client *ssdb.Client
|
||||
host string
|
||||
port int
|
||||
maxLifetime int64
|
||||
}
|
||||
|
||||
func (p *Provider) connectInit() error {
|
||||
var err error
|
||||
if p.host == "" || p.port == 0 {
|
||||
return errors.New("SessionInit First")
|
||||
}
|
||||
p.client, err = ssdb.Connect(p.host, p.port)
|
||||
return err
|
||||
}
|
||||
|
||||
// SessionInit init the ssdb with the config
|
||||
func (p *Provider) SessionInit(ctx context.Context, maxLifetime int64, savePath string) error {
|
||||
p.maxLifetime = maxLifetime
|
||||
address := strings.Split(savePath, ":")
|
||||
p.host = address[0]
|
||||
|
||||
var err error
|
||||
if p.port, err = strconv.Atoi(address[1]); err != nil {
|
||||
return err
|
||||
}
|
||||
return p.connectInit()
|
||||
}
|
||||
|
||||
// SessionRead return a ssdb client session Store
|
||||
func (p *Provider) SessionRead(ctx context.Context, sid string) (session.Store, error) {
|
||||
if p.client == nil {
|
||||
if err := p.connectInit(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var kv map[interface{}]interface{}
|
||||
value, err := p.client.Get(sid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if value == nil || len(value.(string)) == 0 {
|
||||
kv = make(map[interface{}]interface{})
|
||||
} else {
|
||||
kv, err = session.DecodeGob([]byte(value.(string)))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
rs := &SessionStore{sid: sid, values: kv, maxLifetime: p.maxLifetime, client: p.client}
|
||||
return rs, nil
|
||||
}
|
||||
|
||||
// SessionExist judged whether sid is exist in session
|
||||
func (p *Provider) SessionExist(ctx context.Context, sid string) (bool, error) {
|
||||
if p.client == nil {
|
||||
if err := p.connectInit(); err != nil {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
value, err := p.client.Get(sid)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if value == nil || len(value.(string)) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate regenerate session with new sid and delete oldsid
|
||||
func (p *Provider) SessionRegenerate(ctx context.Context, oldsid, sid string) (session.Store, error) {
|
||||
// conn.Do("setx", key, v, ttl)
|
||||
if p.client == nil {
|
||||
if err := p.connectInit(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
value, err := p.client.Get(oldsid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var kv map[interface{}]interface{}
|
||||
if value == nil || len(value.(string)) == 0 {
|
||||
kv = make(map[interface{}]interface{})
|
||||
} else {
|
||||
kv, err = session.DecodeGob([]byte(value.(string)))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = p.client.Del(oldsid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
_, e := p.client.Do("setx", sid, value, p.maxLifetime)
|
||||
if e != nil {
|
||||
return nil, e
|
||||
}
|
||||
rs := &SessionStore{sid: sid, values: kv, maxLifetime: p.maxLifetime, client: p.client}
|
||||
return rs, nil
|
||||
}
|
||||
|
||||
// SessionDestroy destroy the sid
|
||||
func (p *Provider) SessionDestroy(ctx context.Context, sid string) error {
|
||||
if p.client == nil {
|
||||
if err := p.connectInit(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
_, err := p.client.Del(sid)
|
||||
return err
|
||||
}
|
||||
|
||||
// SessionGC not implemented
|
||||
func (p *Provider) SessionGC(context.Context) {
|
||||
}
|
||||
|
||||
// SessionAll not implemented
|
||||
func (p *Provider) SessionAll(context.Context) int {
|
||||
return 0
|
||||
}
|
||||
|
||||
// SessionStore holds the session information which stored in ssdb
|
||||
type SessionStore struct {
|
||||
sid string
|
||||
lock sync.RWMutex
|
||||
values map[interface{}]interface{}
|
||||
maxLifetime int64
|
||||
client *ssdb.Client
|
||||
}
|
||||
|
||||
// Set the key and value
|
||||
func (s *SessionStore) Set(ctx context.Context, key, value interface{}) error {
|
||||
s.lock.Lock()
|
||||
defer s.lock.Unlock()
|
||||
s.values[key] = value
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get return the value by the key
|
||||
func (s *SessionStore) Get(ctx context.Context, key interface{}) interface{} {
|
||||
s.lock.Lock()
|
||||
defer s.lock.Unlock()
|
||||
if value, ok := s.values[key]; ok {
|
||||
return value
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Delete the key in session store
|
||||
func (s *SessionStore) Delete(ctx context.Context, key interface{}) error {
|
||||
s.lock.Lock()
|
||||
defer s.lock.Unlock()
|
||||
delete(s.values, key)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Flush delete all keys and values
|
||||
func (s *SessionStore) Flush(context.Context) error {
|
||||
s.lock.Lock()
|
||||
defer s.lock.Unlock()
|
||||
s.values = make(map[interface{}]interface{})
|
||||
return nil
|
||||
}
|
||||
|
||||
// SessionID return the sessionID
|
||||
func (s *SessionStore) SessionID(context.Context) string {
|
||||
return s.sid
|
||||
}
|
||||
|
||||
// SessionRelease Store the keyvalues into ssdb
|
||||
func (s *SessionStore) SessionRelease(ctx context.Context, w http.ResponseWriter) {
|
||||
b, err := session.EncodeGob(s.values)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
s.client.Do("setx", s.sid, string(b), s.maxLifetime)
|
||||
}
|
||||
|
||||
func init() {
|
||||
session.Register("ssdb", ssdbProvider)
|
||||
}
|
Reference in New Issue
Block a user