From c1f0cdeb919864e0f93fcfecb8c27d889b473acb Mon Sep 17 00:00:00 2001
From: deva <deva>
Date: Thu, 10 Feb 2011 10:15:25 +0000
Subject: Some cleaning up. Added activeSessions.

---
 server/src/client_connection.cc | 110 +++++++++++++++++++---------------------
 server/src/client_connection.h  |  20 +++-----
 server/src/session.cc           |  59 ++++++++++++++++-----
 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 {
-- 
cgit v1.2.3