summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/client_connection.cc110
-rw-r--r--server/src/client_connection.h20
-rw-r--r--server/src/session.cc59
-rw-r--r--server/src/session.h7
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 {