WebFramework v3.0.12
Web framework for C++.
Loading...
Searching...
No Matches
SessionsManager.cpp
1#include "SessionsManager.h"
2
3using namespace std;
4
5namespace framework
6{
7 void SessionsManager::SessionTime::asyncCheck()
8 {
9 unique_lock<mutex> guard(checkLock);
10 vector<pair<SessionTimePoint, string>> deleteVariants;
11 const SessionTimePoint current = chrono::high_resolution_clock::now();
12
13 for (const auto& i : timeIp)
14 {
15 if ((current - i.first).count() >= sessionLifeTime)
16 {
17 deleteVariants.push_back(i);
18 }
19 else
20 {
21 break;
22 }
23 }
24
25 for (const auto& [time, ip] : deleteVariants)
26 {
27 timeIp.erase(time);
28 ipTime.erase(ip);
29
30 userSessionSynchronization->deleteSession(ip);
31 }
32
33 this->nextPeriod();
34 }
35
36 void SessionsManager::SessionTime::runAsyncCheck()
37 {
38 while (true)
39 {
40 this->asyncCheck();
41
42 this_thread::sleep_for(sessionCheckPeriod);
43 }
44 }
45
46 void SessionsManager::SessionTime::nextPeriod()
47 {
48 multimap<SessionTimePoint, string, greater<SessionTimePoint>> tem;
49 const SessionTimePoint period = chrono::high_resolution_clock::now();
50
51 for (const auto& [time, ip] : timeIp)
52 {
53 SessionTimePoint next = time;
54
55 next += period - next;
56
57 ipTime[ip] = next;
58
59 tem.emplace(move(next), ip);
60 }
61
62 timeIp = move(tem);
63 }
64
65 SessionsManager::SessionTime::SessionTime(SessionsManager* userSession) :
66 userSessionSynchronization(userSession)
67 {
68 thread(&SessionTime::runAsyncCheck, this).detach();
69 }
70
71 void SessionsManager::SessionTime::updateSessionTime(const string& ip)
72 {
73 unique_lock<mutex> guard(checkLock);
74
75 auto findTime = ipTime.find(ip);
76
77 if (findTime != ipTime.end())
78 {
79 auto target = timeIp.find(findTime->second);
80
81 while (target->second != ip)
82 {
83 target++;
84 }
85
86 timeIp.erase(target);
87 }
88
89 SessionTimePoint start = chrono::high_resolution_clock::now();
90
91 ipTime[ip] = start;
92
93 timeIp.emplace(move(start), ip);
94 }
95
96 SessionsManager::SessionsManager() :
97 time(this)
98 {
99
100 }
101
102 void SessionsManager::setAttribute(const string& ip, const string& name, const string& value)
103 {
104 unique_lock<mutex> guard(lock);
105
106 userSession[ip][name] = value;
107
108 time.updateSessionTime(ip);
109 }
110
111 string SessionsManager::getAttribute(const string& ip, const string& name)
112 {
113 unique_lock guard(lock);
114
115 time.updateSessionTime(ip);
116
117 return userSession.at(ip).at(name);
118 }
119
120 void SessionsManager::deleteSession(const string& ip)
121 {
122 unique_lock guard(lock);
123
124 userSession.erase(ip);
125 }
126
127 void SessionsManager::deleteAttribute(const string& ip, const string& name)
128 {
129 unique_lock guard(lock);
130
131 userSession[ip].erase(name);
132 }
133}