import (
"time"
+ "errors"
"strconv"
)
-type session struct {}
-
-const (
- session_SumInTimeout int64 = 1e5
- session_Timeout int64 = 1
-)
+type session struct {
+ SumInTimeout int64
+ Timeout int64
+ session_now int64
+}
var (
session_ks map[string]string = make(map[string]string)
session_kt map[string]int64 = make(map[string]int64)
session_rand int64 = 1
- session_now int64
session_stop chan bool = make(chan bool,1)
)
-func Session() (*session) {
- if session_now == 0 {
+func Session(SumInTimeout,Timeout int64) (*session,error) {
+ if SumInTimeout == 0 {return &session{},errors.New("SumInTimeout == 0")}
+ if Timeout == 0 {return &session{},errors.New("Timeout == 0")}
+
+ s := new(session)
+
+ if s.session_now == 0 {
go func(){
for{
- session_now = time.Now().Unix()
+ s.session_now = time.Now().Unix()
time.Sleep(time.Second)
}
}()
}
- return &session{}
+
+ return s,nil
}
func (s *session) Set(key string) (val string) {
session_stop <- true
- if session_rand >= session_SumInTimeout {session_rand = 1}else{session_rand += 1}
+ if session_rand >= s.SumInTimeout {session_rand = 1}else{session_rand += 1}
t := strconv.FormatInt(session_rand, 10)
session_ks[t] = key
- session_kt[t] = session_now
+ session_kt[t] = s.session_now
<-session_stop
return t
if !oks {return false,""}
T, _ := session_kt[val]
- return session_now-T <= session_Timeout, K
+ return s.session_now-T <= s.Timeout, K
}
func (s *session) Check(val string,key string) bool {
}
func (s *session) Buf() (int64,int) {
- return session_now,len(session_ks)
+ return s.session_now,len(session_ks)
}
--- /dev/null
+package part
+
+import (
+ "time"
+ "testing"
+)
+
+func Test_session(t *testing.T) {
+ s,e := Session(1e6, 1)
+ if e != nil {return}
+ v := s.Set("a")
+ if o,p := s.Buf();p != 1 || o - time.Now().Unix() > 1{return}
+ if ok,k := s.Get(v);!ok || k != "a" {return}
+ if !s.Check(v, "a") {return}
+}