summaryrefslogtreecommitdiff
path: root/server/src/session.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/session.cc')
-rw-r--r--server/src/session.cc108
1 files changed, 99 insertions, 9 deletions
diff --git a/server/src/session.cc b/server/src/session.cc
index 74adb32..803a515 100644
--- a/server/src/session.cc
+++ b/server/src/session.cc
@@ -29,9 +29,16 @@
#include <stdlib.h>
+// for stat
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+
#include "journalwriter.h"
#include "configuration.h"
#include "connectionpool.h"
+#include "sessionserialiser.h"
Session::Session(std::string sessionid)
{
@@ -39,6 +46,11 @@ Session::Session(std::string sessionid)
_journal = NULL;
}
+Session::~Session()
+{
+ if(_journal) delete _journal;
+}
+
std::string Session::id()
{
return _id;
@@ -63,6 +75,14 @@ void Session::commit()
}
}
+void Session::discard()
+{
+ if(_journal) {
+ delete _journal;
+ _journal = NULL;
+ }
+}
+
JournalWriter *Session::journal()
{
if(_journal == NULL) {
@@ -76,12 +96,32 @@ Sessions::Sessions()
{
}
+static bool fexists(const std::string &f)
+{
+ bool ret;
+
+/*
+ struct stat sbuf;
+ int n = stat(f.c_str(), &sbuf);
+ if(n != -1) ret = true;
+ ret = errno != ENOENT;
+*/
+
+ FILE *fp = fopen(f.c_str(), "r");
+ ret = fp != NULL;
+ if(fp) fclose(fp);
+
+ return ret;
+}
+
Session *Sessions::newSession()
{
char sessionid[32];
+ std::string filename;
do {
snprintf(sessionid, sizeof(sessionid)-1, "%d", rand());
- } while(sessions.find(sessionid) != sessions.end());
+ filename = getSessionFilename(Conf::session_path, sessionid);
+ } while(sessions.find(sessionid) != sessions.end() || fexists(filename));
Session *session = new Session(sessionid);
sessions[session->id()] = session;
@@ -90,16 +130,35 @@ Session *Sessions::newSession()
Session *Sessions::session(std::string sessionid)
{
- if(sessions.find(sessionid) == sessions.end()) return NULL;
- return sessions[sessionid];
+ if(sessions.find(sessionid) != sessions.end())
+ return sessions[sessionid];
+
+ std::string filename = getSessionFilename(Conf::session_path, sessionid);
+ if(fexists(filename)) {
+ Session *s = new Session(sessionid);
+ SessionSerialiser ser(Conf::session_path, s);
+ ser.load();
+ sessions[s->id()] = s;
+
+ fprintf(stderr, "s: %p\n",s);
+
+ return s;
+ }
+
+ return NULL;
}
Session *Sessions::takeSession(std::string sessionid)
{
- Session *s = session(sessionid);
+ Session *s = NULL;
+ if(sessions.find(sessionid) != sessions.end()) {
+ s = sessions[sessionid];
+ }
+
if(s) {
sessions.erase(sessionid);
}
+
return s;
}
@@ -114,6 +173,19 @@ size_t Sessions::size()
return sessions.size();
}
+void Sessions::store()
+{
+ std::map<std::string, Session*>::iterator i = sessions.begin();
+ while(i != sessions.end()) {
+ SessionSerialiser ser(Conf::session_path, i->second);
+ ser.save();
+ delete i->second;
+ sessions.erase(i);
+ i++;
+ }
+ sessions.clear();
+}
+
SessionAutolock::SessionAutolock(Session &s)
: session(s)
{
@@ -126,23 +198,41 @@ SessionAutolock::~SessionAutolock()
}
#ifdef TEST_SESSION
-//deps: configuration.cc journalwriter.cc journal_commit.cc mutex.cc debug.cc
-//cflags: -I.. $(PTHREAD_CFLAGS)
-//libs: $(PTHREAD_LIBS)
+//deps: configuration.cc journalwriter.cc journal_commit.cc mutex.cc debug.cc sessionserialiser.cc sessionparser.cc saxparser.cc
+//cflags: -I.. $(PTHREAD_CFLAGS) $(EXPAT_CFLAGS)
+//libs: $(PTHREAD_LIBS) $(EXPAT_LIBS)
#include <test.h>
TEST_BEGIN;
Sessions sessions;
-srand(0);
+Conf::session_path = "/tmp";
+
+srand(0); // force seed
Session *s1 = sessions.newSession();
-srand(0);
+srand(0); // force seed
Session *s2 = sessions.newSession();
TEST_NOTEQUAL(s1->id(), s2->id(), "Testing if IDs are unique.");
TEST_EQUAL(sessions.size(), 2, "Testing if size match.");
+std::string sessionid = s1->id();
+SessionSerialiser ser(Conf::session_path, s1);
+ser.save();
+
+sessions.deleteSession(sessionid);
+TEST_EQUAL(sessions.size(), 1, "Testing if size match.");
+
+s1 = sessions.session(sessionid);
+TEST_NOTEQUAL(s1, NULL, "Did we reload the session from disk?");
+
+sessions.store();
+TEST_EQUAL(sessions.size(), 0, "Testing if size match.");
+
+s1 = sessions.session(sessionid);
+TEST_NOTEQUAL(s1, NULL, "Did we reload the session from disk?");
+
TEST_END;
#endif/*TEST_SESSION*/