diff --git a/session/sess_file.go b/session/sess_file.go index 955cc9e0..38e52af8 100644 --- a/session/sess_file.go +++ b/session/sess_file.go @@ -2,6 +2,7 @@ package session import ( "errors" + "fmt" "io" "io/ioutil" "os" @@ -131,6 +132,18 @@ func (fp *FileProvider) SessionGC() { filepath.Walk(fp.savePath, gcpath) } +func (fp *FileProvider) SessionAll() int { + a := &activeSession{} + err := filepath.Walk(fp.savePath, func(path string, f os.FileInfo, err error) error { + return a.visit(path, f, err) + }) + if err != nil { + fmt.Printf("filepath.Walk() returned %v\n", err) + return 0 + } + return a.total +} + func (fp *FileProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { err := os.MkdirAll(path.Join(fp.savePath, string(oldsid[0]), string(oldsid[1])), 0777) if err != nil { @@ -193,6 +206,21 @@ func gcpath(path string, info os.FileInfo, err error) error { return nil } +type activeSession struct { + total int +} + +func (self *activeSession) visit(paths string, f os.FileInfo, err error) error { + if err != nil { + return err + } + if f.IsDir() { + return nil + } + self.total = self.total + 1 + return nil +} + func init() { Register("file", filepder) } diff --git a/session/sess_mem.go b/session/sess_mem.go index fd021dac..93cc7fc6 100644 --- a/session/sess_mem.go +++ b/session/sess_mem.go @@ -142,6 +142,10 @@ func (pder *MemProvider) SessionGC() { pder.lock.RUnlock() } +func (pder *MemProvider) SessionAll() int { + return pder.list.Len() +} + func (pder *MemProvider) SessionUpdate(sid string) error { pder.lock.Lock() defer pder.lock.Unlock() diff --git a/session/sess_mysql.go b/session/sess_mysql.go index f1af8564..9eff85ef 100644 --- a/session/sess_mysql.go +++ b/session/sess_mysql.go @@ -152,6 +152,17 @@ func (mp *MysqlProvider) SessionGC() { return } +func (mp *MysqlProvider) SessionAll() int { + c := mp.connectInit() + defer c.Close() + var total int + err := c.QueryRow("SELECT count(*) as num from session").Scan(&total) + if err != nil { + return 0 + } + return total +} + func init() { Register("mysql", mysqlpder) } diff --git a/session/sess_redis.go b/session/sess_redis.go index eb2e5120..b8cde175 100644 --- a/session/sess_redis.go +++ b/session/sess_redis.go @@ -128,6 +128,12 @@ func (rp *RedisProvider) SessionGC() { return } +//@todo +func (rp *RedisProvider) SessionAll() int { + + return 0 +} + func init() { Register("redis", redispder) } diff --git a/session/session.go b/session/session.go index 1ffc7aaf..9e795ee7 100644 --- a/session/session.go +++ b/session/session.go @@ -27,6 +27,7 @@ type Provider interface { SessionRead(sid string) (SessionStore, error) SessionRegenerate(oldsid, sid string) (SessionStore, error) SessionDestroy(sid string) error + SessionAll() int //get all active session SessionGC() } @@ -195,6 +196,10 @@ func (manager *Manager) SessionRegenerateId(w http.ResponseWriter, r *http.Reque return } +func (manager *Manager) GetActiveSession() int { + return manager.provider.SessionAll() +} + //remote_addr cruunixnano randdata func (manager *Manager) sessionId(r *http.Request) (sid string) {