diff options
-rw-r--r-- | server/src/client_connection.cc | 110 | ||||
-rw-r--r-- | server/src/client_connection.h | 20 | ||||
-rw-r--r-- | server/src/session.cc | 59 | ||||
-rw-r--r-- | server/src/session.h | 7 |
4 files changed, 113 insertions, 83 deletions
diff --git a/server/src/client_connection.cc b/server/src/client_connection.cc index 9689ac4..5aee707 100644 --- a/server/src/client_connection.cc +++ b/server/src/client_connection.cc @@ -40,37 +40,27 @@ static std::string error_box(std::string message) return errorbox; } -#ifdef TEST_CONNECTION +#ifdef TEST_CLIENT_CONNECTION static bool did_commit = false; #endif -ClientConnection::Parameters::Parameters() -{ - sessionid = ""; - patientid = ""; - templ = ""; - commit = false; - discard = false; - nocommit = false; -} - ClientConnection::ClientConnection(Environment &e, headers_t &headers) : env(e), parser(&transaction) { DEBUG(connection, "[%p] CREATE\n", this); if(headers.contains("SessionID")) - parms.sessionid = headers["SessionID"]; + sessionid = headers["SessionID"]; if(headers.contains("SessionPatientID")) - parms.patientid = headers["SessionPatientID"]; + patientid = headers["SessionPatientID"]; if(headers.contains("SessionTemplate")) - parms.templ = headers["SessionTemplate"]; + templ = headers["SessionTemplate"]; - parms.commit = headers.contains("SessionCommit"); - parms.nocommit = headers.contains("SessionNoCommit"); - parms.discard = headers.contains("SessionDiscard"); + docommit = headers.contains("SessionCommit"); + donocommit = headers.contains("SessionNoCommit"); + dodiscard = headers.contains("SessionDiscard"); -#ifdef TEST_CONNECTION +#ifdef TEST_CLIENT_CONNECTION did_commit = false; #endif @@ -84,23 +74,23 @@ ClientConnection::~ClientConnection() void ClientConnection::nocommit(Session *session) { - if(parms.nocommit) { + if(donocommit) { if(session->isreadonly) { // NoCommit of an empty session discards it. - parms.discard = true; + dodiscard = true; return; } DEBUG(connection, "NoCommit (%s)\n", session->id().c_str()); - parms.nocommit = false; + donocommit = false; session->nocommit(); } } void ClientConnection::commit(Session *session) { - if(parms.commit) { + if(docommit) { if(session->isreadonly) { // Commit of an empty session discards it. - parms.discard = true; + dodiscard = true; return; } @@ -108,9 +98,9 @@ void ClientConnection::commit(Session *session) std::string sid = session->id(); session->commit(); env.sessions.deleteSession(sid); - parms.sessionid = ""; - parms.commit = false; -#ifdef TEST_CONNECTION + sessionid = ""; + docommit = false; +#ifdef TEST_CLIENT_CONNECTION did_commit = true; #endif } @@ -118,13 +108,13 @@ void ClientConnection::commit(Session *session) void ClientConnection::discard(Session *session) { - if(parms.discard) { + if(dodiscard) { DEBUG(connection, "Discard (%s)\n", session->id().c_str()); std::string sid = session->id(); session->discard(); env.sessions.deleteSession(sid); - parms.sessionid = ""; - parms.discard = false; + sessionid = ""; + dodiscard = false; } } @@ -132,18 +122,16 @@ bool ClientConnection::handle(const char *data, size_t size) { Session *session = NULL; try { - if(parms.sessionid == "") { + if(sessionid == "") { // Create new session - session = env.sessions.newSession(parms.patientid, - parms.templ); + session = env.sessions.newSession(patientid, templ); } else { // Attach to old session - session = env.sessions.session(parms.sessionid); + session = env.sessions.session(sessionid); // Session didn't exist - create a new one anyway. if(session == NULL) { - session = env.sessions.newSession(parms.patientid, - parms.templ); + session = env.sessions.newSession(patientid, templ); } } } catch(Sessions::SessionAlreadyActive &e) { @@ -159,7 +147,7 @@ bool ClientConnection::handle(const char *data, size_t size) return true; } - parms.sessionid = session->id(); + sessionid = session->id(); try { @@ -199,7 +187,7 @@ void ClientConnection::getReply(Httpd::Reply &reply) headers_t hdrs; hdrs["Content-Type"] = "text/plain; charset=UTF-8"; - hdrs["SessionID"] = parms.sessionid; + hdrs["SessionID"] = sessionid; reply.headers = hdrs; @@ -212,11 +200,11 @@ void ClientConnection::getReply(Httpd::Reply &reply) } #ifdef TEST_CLIENT_CONNECTION -//deps: debug.cc transactionparser.cc session.cc xml_encode_decode.cc saxparser.cc transactionhandler.cc journal.cc mutex.cc templateparser.cc exception.cc configuration.cc macroparser.cc semaphore.cc entitylist.cc luaquerymapper.cc inotify.cc log.cc queryhandlerpentominos.cc widgetgenerator.cc queryhandlerpracro.cc resumeparser.cc journal_commit.cc versionstr.cc luaresume.cc luautil.cc artefact.cc environment.cc database.cc macrolist.cc templatelist.cc pracrodao.cc templateheaderparser.cc macroheaderparser.cc pracrodaotest.cc pracrodaopgsql.cc +//deps: debug.cc transactionparser.cc session.cc xml_encode_decode.cc saxparser.cc transactionhandler.cc journal.cc mutex.cc templateparser.cc exception.cc configuration.cc macroparser.cc semaphore.cc entitylist.cc luaquerymapper.cc inotify.cc log.cc queryhandlerpentominos.cc widgetgenerator.cc queryhandlerpracro.cc resumeparser.cc journal_commit.cc versionstr.cc luaresume.cc luautil.cc artefact.cc environment.cc database.cc macrolist.cc templatelist.cc pracrodao.cc templateheaderparser.cc macroheaderparser.cc pracrodaotest.cc pracrodaopgsql.cc journal_uploadserver.cc sessionserialiser.cc sessionparser.cc widgetvalue.cc //cflags: -DWITHOUT_DATABASE -DWITHOUT_ARTEFACT -I.. $(LUA_CFLAGS) $(EXPAT_CFLAGS) $(PTHREAD_CFLAGS) $(PQXX_CXXFLAGS) //libs: $(LUA_LIBS) $(EXPAT_LIBS) $(PTHREAD_LIBS) $(PQXX_LIBS) #include "test.h" - +/* static char xml_request[] = "<?xml version='1.0' encoding='UTF-8'?>\n" "<pracro version=\"1.0\" user=\"testuser\" cpr=\"1505050505\">\n" @@ -248,48 +236,56 @@ static char xml_commit_p2[] = " </commit>\n" "</pracro>\n" ; - +*/ TEST_BEGIN; Environment env; +Httpd::Reply reply; std::string sid; // Without data { - ClientConnection con(env, "", false); + headers_t hdrs; + ClientConnection con(env, hdrs); TEST_TRUE(con.handle("", 0), "Test handler return value."); - TEST_EQUAL_STR(con.getResponse(), "", "Test response value."); - sid = con.getSessionID(); - TEST_NOTEQUAL_STR(sid, "", "Test new session id."); + con.getReply(reply); + TEST_EQUAL_STR(reply.data, "", "Test response value."); + TEST_NOTEQUAL_STR(reply.headers["SessionID"], "", "Test new session id."); TEST_FALSE(did_commit, "No commit."); } { - ClientConnection con(env, sid, false); + headers_t hdrs; + ClientConnection con(env, hdrs); TEST_TRUE(con.handle("", 0), "Test handler return value."); - TEST_EQUAL_STR(con.getResponse(), "", "Test response value."); - TEST_NOTEQUAL_STR(con.getSessionID(), "", "Test existing session id."); - TEST_EQUAL_STR(con.getSessionID(), sid, "Test existing session id."); + con.getReply(reply); + TEST_EQUAL_STR(reply.data, "", "Test response value."); + TEST_NOTEQUAL_STR(reply.headers["SessionID"], "", "Test existing session id."); + TEST_EQUAL_STR(reply.headers["SessionID"], sid, "Test existing session id."); TEST_FALSE(did_commit, "No commit."); } { - ClientConnection con(env, sid, true); + headers_t hdrs; + ClientConnection con(env, hdrs); TEST_TRUE(con.handle("", 0), "Test handler return value."); - TEST_EQUAL_STR(con.getResponse(), "", "Test response value."); - TEST_EQUAL_STR(con.getSessionID(), "", "Test existing session id."); + con.getReply(reply); + TEST_EQUAL_STR(reply.data, "", "Test response value."); + TEST_EQUAL_STR(reply.headers["SessionID"], "", "Test existing session id."); TEST_TRUE(did_commit, "Commit."); } { - ClientConnection con(env, sid, false); + headers_t hdrs; + ClientConnection con(env, hdrs); TEST_TRUE(con.handle("", 0), "Test handler return value."); - TEST_EQUAL_STR(con.getResponse(), "", "Test response value."); - TEST_NOTEQUAL_STR(con.getSessionID(), "", "Test existing session id."); - TEST_NOTEQUAL_STR(con.getSessionID(), sid, "Test new session id."); + con.getReply(reply); + TEST_EQUAL_STR(reply.data, "", "Test response value."); + TEST_NOTEQUAL_STR(reply.headers["SessionID"], "", "Test existing session id."); + TEST_NOTEQUAL_STR(reply.headers["SessionID"], sid, "Test new session id."); TEST_FALSE(did_commit, "No commit."); } - +/* // With commit partial data { ClientConnection con(env, "", false); @@ -400,7 +396,7 @@ std::string sid; TEST_NOTEQUAL_STR(con.getSessionID(), sid, "Test new session id."); TEST_FALSE(did_commit, "No commit."); } - +*/ TEST_END; #endif/*TEST_CLIENT_CONNECTION*/ diff --git a/server/src/client_connection.h b/server/src/client_connection.h index 6427217..a509221 100644 --- a/server/src/client_connection.h +++ b/server/src/client_connection.h @@ -40,17 +40,6 @@ class Session; class ClientConnection : public Connection { public: - class Parameters { - public: - Parameters(); - std::string sessionid; - std::string patientid; - std::string templ; - bool commit; - bool discard; - bool nocommit; - }; - ClientConnection(Environment &e, headers_t &headers); ~ClientConnection(); @@ -63,8 +52,6 @@ private: void nocommit(Session *session); void discard(Session *session); - Parameters parms; - Environment &env; Transaction transaction; @@ -73,6 +60,13 @@ private: std::string response; bool parser_complete; + + std::string sessionid; + std::string patientid; + std::string templ; + bool docommit; + bool dodiscard; + bool donocommit; }; #endif/*__PRACRO_CLIENT_CONNECTION_H__*/ diff --git a/server/src/session.cc b/server/src/session.cc index 530efac..fe05ee5 100644 --- a/server/src/session.cc +++ b/server/src/session.cc @@ -178,6 +178,8 @@ static bool fexists(const std::string &f) Session *Sessions::newSession(std::string patientid, std::string templ) throw(SessionAlreadyActive) { + MutexAutolock lock(mutex); + std::map<std::string, Session *>::iterator i = sessions.begin(); while(i != sessions.end()) { if(i->second->patientid == patientid && @@ -207,6 +209,8 @@ Session *Sessions::newSession(std::string patientid, std::string templ) Session *Sessions::session(std::string sessionid) { + MutexAutolock lock(mutex); + if(sessions.find(sessionid) != sessions.end()) return sessions[sessionid]; @@ -223,6 +227,8 @@ Session *Sessions::session(std::string sessionid) Session *Sessions::takeSession(std::string sessionid) { + MutexAutolock lock(mutex); + DEBUG(session,"%s\n", sessionid.c_str()); Session *s = NULL; @@ -251,6 +257,8 @@ size_t Sessions::size() void Sessions::store() { + MutexAutolock lock(mutex); + std::map<std::string, Session*>::iterator i = sessions.begin(); while(i != sessions.end()) { SessionSerialiser ser(env, Conf::session_path); @@ -262,6 +270,21 @@ void Sessions::store() sessions.clear(); } +std::vector<std::string> Sessions::activeSessions() +{ + MutexAutolock lock(mutex); + + std::vector<std::string> act; + + std::map<std::string, Session*>::iterator i = sessions.begin(); + while(i != sessions.end()) { + act.push_back(i->first); + i++; + } + + return act; +} + SessionAutolock::SessionAutolock(Session &s) : session(s) { @@ -274,28 +297,38 @@ SessionAutolock::~SessionAutolock() } #ifdef TEST_SESSION -//deps: configuration.cc journal.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) +//deps: configuration.cc journal.cc journal_uploadserver.cc journal_commit.cc mutex.cc debug.cc sessionserialiser.cc sessionparser.cc saxparser.cc environment.cc semaphore.cc artefact.cc xml_encode_decode.cc database.cc pracrodaopgsql.cc pracrodaotest.cc pracrodao.cc entitylist.cc macrolist.cc templatelist.cc macroheaderparser.cc templateheaderparser.cc versionstr.cc exception.cc log.cc inotify.cc +//cflags: -I.. $(PTHREAD_CFLAGS) $(EXPAT_CFLAGS) $(ATF_CFLAGS) $(PQXX_CXXFLAGS) +//libs: $(PTHREAD_LIBS) $(EXPAT_LIBS) $(ATF_LIBS) $(PQXX_LIBS) #include <test.h> +#define PID "1505050505" +#define TMPL "test" + TEST_BEGIN; -Sessions sessions; +Environment env; Conf::session_path = "/tmp"; -srand(0); // force seed -Session *s1 = sessions.newSession(); -srand(0); // force seed -Session *s2 = sessions.newSession(); +Session *s1 = env.sessions.newSession(PID, TMPL); + +TEST_EXCEPTION(env.sessions.newSession(PID, TMPL), + Sessions::SessionAlreadyActive, "Session should be 'locked'"); -TEST_NOTEQUAL(s1->id(), s2->id(), "Testing if IDs are unique."); +Session *s2 = env.sessions.session(s1->id()); +TEST_EQUAL(s1, s2, "They should be the same session."); -TEST_EQUAL(sessions.size(), 2, "Testing if size match."); +env.sessions.takeSession(s1->id()); +Session *s3 = env.sessions.newSession(PID, TMPL); +TEST_NOTEQUAL_STR(s1->id(), s3->id(), "Testing if IDs are unique."); + +TEST_EQUAL_INT(env.sessions.size(), 1, "Testing if size is 1."); + +/* std::string sessionid = s1->id(); -SessionSerialiser ser(Conf::session_path, s1); -ser.save(); +SessionSerialiser ser(&env, Conf::session_path); +ser.save(s1); sessions.deleteSession(sessionid); TEST_EQUAL(sessions.size(), 1, "Testing if size match."); @@ -308,7 +341,7 @@ 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*/ diff --git a/server/src/session.h b/server/src/session.h index f532452..8eace95 100644 --- a/server/src/session.h +++ b/server/src/session.h @@ -31,6 +31,7 @@ #include <string> #include <map> #include <exception> +#include <vector> #include "mutex.h" @@ -114,9 +115,15 @@ public: */ void store(); + // + // Admin methods + // + std::vector<std::string> activeSessions(); + private: std::map<std::string, Session *> sessions; Environment *env; + Mutex mutex; }; class SessionAutolock { |