From f92dd279a1e26dad7507d5d6944567c23834d440 Mon Sep 17 00:00:00 2001 From: deva Date: Thu, 27 May 2010 09:45:12 +0000 Subject: A lot of session handling. A lot of new unit tests. Add of a more structured commit/discard handling. Fix of some wierd line break bugs in journalwriter --- server/src/session.cc | 108 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 99 insertions(+), 9 deletions(-) (limited to 'server/src/session.cc') 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 +// for stat +#include +#include +#include +#include + #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::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_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*/ -- cgit v1.2.3