diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/admin_connection.cc | 2 | ||||
| -rw-r--r-- | server/src/client_connection.cc | 4 | ||||
| -rw-r--r-- | server/src/session.cc | 105 | ||||
| -rw-r--r-- | server/src/session.h | 8 | ||||
| -rw-r--r-- | server/src/sessionserialiser.cc | 19 | ||||
| -rw-r--r-- | server/src/transactionhandler.cc | 6 | 
6 files changed, 91 insertions, 53 deletions
| diff --git a/server/src/admin_connection.cc b/server/src/admin_connection.cc index ecc7c65..0fe5380 100644 --- a/server/src/admin_connection.cc +++ b/server/src/admin_connection.cc @@ -38,7 +38,7 @@ static std::string admin_sessionunlock(Environment &env, std::string id)  {    Session *session = env.sessions.session(id);    if(session) { -    if(session->isreadonly) { +    if(session->isReadonly()) {        env.sessions.deleteSession(id);        return "Session " + id + " was 'readonly' and has been discarded.";      } else { diff --git a/server/src/client_connection.cc b/server/src/client_connection.cc index 5aee707..9a1ac0f 100644 --- a/server/src/client_connection.cc +++ b/server/src/client_connection.cc @@ -75,7 +75,7 @@ ClientConnection::~ClientConnection()  void ClientConnection::nocommit(Session *session)  {    if(donocommit) { -    if(session->isreadonly) { // NoCommit of an empty session discards it. +    if(session->isReadonly()) { // NoCommit of an empty session discards it.        dodiscard = true;        return;      } @@ -89,7 +89,7 @@ void ClientConnection::nocommit(Session *session)  void ClientConnection::commit(Session *session)  {    if(docommit) { -    if(session->isreadonly) { // Commit of an empty session discards it. +    if(session->isReadonly()) { // Commit of an empty session discards it.        dodiscard = true;        return;      } diff --git a/server/src/session.cc b/server/src/session.cc index 24a9c12..6850e9b 100644 --- a/server/src/session.cc +++ b/server/src/session.cc @@ -84,6 +84,16 @@ void Session::unlock()    mutex.unlock();  } +void Session::commitMacro(Transaction &transaction, Commit &commit, +                          Macro ¯o) +{ +  AutoBorrower<Database*> borrower(env->dbpool); +  Database *db = borrower.get(); +  db->commitTransaction(transaction, commit, macro, id()); +  isreadonly = false; +} + +  bool Session::idle()  {    if(isreadonly) return false; @@ -149,17 +159,7 @@ Journal *Session::journal()    }    return _journal;  } -/* -Database *Session::database() -{ -  if(_database == NULL) { -   _database = -      new Database(Conf::database_backend, Conf::database_addr, "", -                   Conf::database_user, Conf::database_passwd, ""); -  } -  return _database; -} -*/ +  Sessions::Sessions(Environment *e) : env(e)  {  } @@ -185,7 +185,10 @@ Session *Sessions::newSession(std::string patientid, std::string templ)      if(i->second->patientid == patientid &&         i->second->templ == templ) {        Session *session = i->second; -      if(!session->idle()) throw SessionAlreadyActive(session->id()); +      if(!session->idle()) { +        DEBUG(session, "Patient/template matched session is already active."); +        throw SessionAlreadyActive(session->id()); +      }        return session;      } @@ -195,9 +198,12 @@ Session *Sessions::newSession(std::string patientid, std::string templ)    { // Look up patientid / template tupple in session files.      SessionSerialiser ser(env, Conf::session_path);      Session *session = ser.findFromTupple(patientid, templ); -    if(session) { +    if(session != NULL) {        sessions[session->id()] = session; -      if(!session->idle()) throw SessionAlreadyActive(session->id()); +      if(!session->idle()) { +        DEBUG(session, "Looked up session by id is already active."); +        throw SessionAlreadyActive(session->id()); +      }        return session;      }    } @@ -307,13 +313,19 @@ SessionAutolock::~SessionAutolock()  TEST_BEGIN; +debug_parse("+all"); +  Conf::database_backend = "testdb";  Conf::database_poolsize = 1; -Conf::xml_basedir = "/tmp"; +Conf::xml_basedir = "../xml";  Environment env; -Conf::session_path = "/tmp"; +// Make sure we start out on an empty session directory. +Conf::session_path = "/tmp/test_session"; +while(mkdir(Conf::session_path.c_str(), 0777) == -1 && errno == EEXIST) { +  Conf::session_path += "X"; +}  Session *s1 = env.sessions.newSession(PID, TMPL); @@ -340,37 +352,56 @@ TEST_EQUAL_INT(env.sessions.size(), 0, "Testing if size is 0.");  Session *s5 = env.sessions.newSession(PID, TMPL);  TEST_NOTEQUAL(s5, NULL, "A new session was created."); -s5->isreadonly = false; +{ +  Transaction transaction; +  transaction.cpr = PID; +  transaction.user = "me"; + +  Commit commit; +  commit.fields["field1"] = "hello"; +  commit.fields["field2"] = "world"; +  commit.templ = TMPL; +   +  Macro macro; +  macro.attributes["version"] = "1.0"; +  macro.attributes["name"] = "somemacro"; +   +  s5->commitMacro(transaction, commit, macro); +} +id = s5->id();  env.sessions.store(); +// Resume session using session id.  Session *s6 = env.sessions.session(id); -TEST_EQUAL_STR(s6->id(), s5->id(), "Did we get the stored session?"); +TEST_NOTEQUAL(s6, NULL, "We did get one right?"); +TEST_EQUAL_STR(s6->id(), id, "Did we get the stored session?"); -s6->isreadonly = false; +{ +  Transaction transaction; +  transaction.cpr = PID; +  transaction.user = "me"; + +  Commit commit; +  commit.fields["field1"] = "hello"; +  commit.fields["field2"] = "world"; +  commit.templ = TMPL; +   +  Macro macro; +  macro.attributes["version"] = "1.0"; +  macro.attributes["name"] = "somemacro"; +   +  s6->commitMacro(transaction, commit, macro); +} +s6->nocommit();   env.sessions.store(); +// Resume session using patientid/template tupple.  Session *s7 = env.sessions.newSession(PID, TMPL); -TEST_EQUAL_STR(s7->id(), s5->id(), "Did we get the stored session?"); - -/* -std::string sessionid = s1->id(); -SessionSerialiser ser(&env, Conf::session_path); -ser.save(s1); - -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."); +TEST_NOTEQUAL(s7, NULL, "We did get one right?"); +TEST_EQUAL_STR(s7->id(), id, "Did we get the stored session?"); -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 533f7a0..e2751bd 100644 --- a/server/src/session.h +++ b/server/src/session.h @@ -34,11 +34,14 @@  #include <vector>  #include "mutex.h" +#include "transaction.h" +#include "template.h"  class Environment;  class Journal;  class Session { +  friend class SessionSerialiser;  public:    Session(Environment *env,            std::string sessionid, std::string patientid, std::string templ); @@ -53,6 +56,8 @@ public:    void nocommit();    void discard(); +  void commitMacro(Transaction &transaction, Commit &commit, Macro ¯o); +    Journal *journal();    std::string patientid; @@ -61,13 +66,14 @@ public:    bool idle();    void setIdle(bool idle); -  bool isreadonly; +  bool isReadonly() { return isreadonly; }  private:    Environment *env;    Journal *_journal;    Mutex mutex;    std::string sessionid; +  bool isreadonly;  };  class Sessions { diff --git a/server/src/sessionserialiser.cc b/server/src/sessionserialiser.cc index 99f880b..b9e825a 100644 --- a/server/src/sessionserialiser.cc +++ b/server/src/sessionserialiser.cc @@ -252,10 +252,15 @@ Session *SessionSerialiser::findFromTupple(const std::string &patientid,  #define SID "42"  #define PID "1234567890"  #define TID "sometemplate" -#define SPATH "/tmp"  TEST_BEGIN; +// Make sure we start out on an empty session directory. +std::string spath = "/tmp/test_sessionserialiser"; +while(mkdir(spath.c_str(), 0777) == -1 && errno == EEXIST) { +  spath += "X"; +} +  std::string xml;  debug_parse("+all"); @@ -283,7 +288,7 @@ Environment env;    j->addEntry("some text", "macro1", 0);    j->addEntry("some more text", "macro2", 2);    j->addEntry("yet some more text", "macro3", 1); -  SessionSerialiser s(&env, SPATH); +  SessionSerialiser s(&env, spath);    xml = s.saveStr(&session);    s.loadStr(xml);    std::string xml2 = s.saveStr(&session); @@ -296,13 +301,13 @@ Environment env;    j->addEntry("some text", "macro1", 0);    j->addEntry("some more text", "macro2", 2);    j->addEntry("yet some more text", "macro3", 1); -  SessionSerialiser s(&env, SPATH); +  SessionSerialiser s(&env, spath);    xml = s.saveStr(&session);  }  /*  {    Session session(SID, PID, TID); -  SessionSerialiser s(SPATH); +  SessionSerialiser s(spath);    s.loadStr(xml);    std::string xml2 = s.saveStr(&session);    TEST_EQUAL_STR(xml, xml2, "Compare"); @@ -314,13 +319,13 @@ Environment env;    j->addEntry("some text", "macro1", 0);    j->addEntry("some more text", "macro2", 2);    j->addEntry("yet some more text", "macro3", 1); -  SessionSerialiser s(&env, SPATH); +  SessionSerialiser s(&env, spath);    s.save(&session);  }  /*  {    Session session(SID, PID, TID); -  SessionSerialiser s(SPATH); +  SessionSerialiser s(spath);    s.load(SID);    std::string xml2 = s.saveStr(&session);    TEST_EQUAL_STR(xml, xml2, "Compare"); @@ -329,7 +334,7 @@ Environment env;  {    Session session(&env, SID, PID, TID); -  SessionSerialiser s(&env, SPATH); +  SessionSerialiser s(&env, spath);    s.save(&session);    Session *s1 = s.findFromTupple(PID, TID);    TEST_NOTEQUAL(s1, NULL, "Found it?"); diff --git a/server/src/transactionhandler.cc b/server/src/transactionhandler.cc index 0ebf782..bcdd638 100644 --- a/server/src/transactionhandler.cc +++ b/server/src/transactionhandler.cc @@ -54,9 +54,6 @@ static std::string handleCommits(Transaction &transaction, Environment &env,    std::string answer;    if(transaction.commits.size() > 0) { -    AutoBorrower<Database*> borrower(env.dbpool); -    Database *db = borrower.get(); -    //Database *db = session.database();      Commits::iterator i = transaction.commits.begin();      while(i != transaction.commits.end()) { @@ -68,8 +65,7 @@ static std::string handleCommits(Transaction &transaction, Environment &env,        std::string resume = resume_parser(*macro, commit);        commit.fields["journal.resume"] = resume; -      session.isreadonly = false; -      db->commitTransaction(transaction, commit, *macro, session.id()); +      session.commitMacro(transaction, commit, *macro);        if(resume != "") { | 
