diff options
Diffstat (limited to 'server/src/pracrodaotest.cc')
-rw-r--r-- | server/src/pracrodaotest.cc | 158 |
1 files changed, 144 insertions, 14 deletions
diff --git a/server/src/pracrodaotest.cc b/server/src/pracrodaotest.cc index 51ee24f..efd94f6 100644 --- a/server/src/pracrodaotest.cc +++ b/server/src/pracrodaotest.cc @@ -68,6 +68,58 @@ void PracroDAOTest::commitTransaction(std::string sessionid, std::string macro = _macro.attributes["name"]; std::stringstream timestamp; timestamp << now; + dbtable_t::iterator ci = data.commits.begin(); + while(ci != data.commits.end()) { + dbrow_t &c = *ci; + if(c["uid"] == sessionid) { + break; + } + ci++; + } + + if(ci == data.commits.end()) { + DEBUG(testdb, "Create new commit: %s", sessionid.c_str()); + dbrow_t c; + c["patientid"] = transaction.cpr; + c["template"] = commit.templ; + c["version"] = "1.0"; + c["timestamp"] = timestamp.str(); + c["uid"] = sessionid; + c["status"] = "active"; + data.commits.push_back(c); + } else { + dbrow_t &c = *ci; + if(c["status"] == "committed") { + ERR_LOG(db, "Attempt to add to committed session %s blocked!\n", + sessionid.c_str()); + return; + } + + DEBUG(testdb, "Working on old commit: %s", sessionid.c_str()); + c["status"] = "active"; + } + + + + + + + + + + + + + + + + + + + + + + dbrow_t t; t["uid"] = data.trseq.nextval(); t["patientid"] = transaction.cpr; @@ -123,9 +175,6 @@ Values PracroDAOTest::getLatestValues(std::string sessionid, oldest); Values values; - // TODO: Take Macro* into account. If supplied (not NULL) the macro name, and - // optionally version number should match the transaction. - Fieldnames::iterator fi = fieldnames.begin(); while(fi != fieldnames.end()) { std::string fieldname = *fi; @@ -133,19 +182,21 @@ Values PracroDAOTest::getLatestValues(std::string sessionid, // Find matching transactions dbtable_t::iterator ti = data.transactions.begin(); while(ti != data.transactions.end()) { - std::map<std::string, std::string> &transaction = *ti; + dbrow_t &transaction = *ti; time_t timestamp = atol(transaction["timestamp"].c_str()); - if(transaction["patientid"] == patientid && timestamp >= oldest && (transaction["macro"] == macro_name || macro == NULL)) { + if(transaction["patientid"] == patientid && timestamp >= oldest && + (transaction["macro"] == macro_name || macro == NULL)) { std::string tid = transaction["uid"]; // Find transaction values dbtable_t::iterator vi = data.fields.begin(); while(vi != data.fields.end()) { - std::map<std::string, std::string> &field = *vi; + dbrow_t &field = *vi; // Upon match, insert it into values if(field["transaction"] == tid && field["name"] == fieldname) { - if(values.find(fieldname) == values.end() || values[fieldname].timestamp < timestamp) { + if(values.find(fieldname) == values.end() || + values[fieldname].timestamp < timestamp) { values[fieldname].timestamp = timestamp; values[fieldname].value = field["value"]; values[fieldname].source = "testdb"; @@ -175,7 +226,7 @@ unsigned PracroDAOTest::nrOfCommits(std::string sessionid, // Find and count matching transactions dbtable_t::iterator ti = data.transactions.begin(); while(ti != data.transactions.end()) { - std::map<std::string, std::string> &transaction = *ti; + dbrow_t &transaction = *ti; time_t timestamp = atol(transaction["timestamp"].c_str()); if(transaction["patientid"] == patientid && transaction["macro"] == macroname && @@ -230,13 +281,13 @@ std::vector<Fieldname> PracroDAOTest::getFieldnames() return fieldnames; } -bool PracroDAOTest::active(std::string sessionid) +bool PracroDAOTest::idle(std::string sessionid) { dbtable_t::iterator i = data.commits.begin(); while(i != data.commits.end()) { dbrow_t &commit = *i; - if(commit["sessionid"] == sessionid) { - return commit["status"] != "idle"; + if(commit["uid"] == sessionid) { + return commit["status"] == "idle"; } i++; } @@ -244,13 +295,52 @@ bool PracroDAOTest::active(std::string sessionid) return false; } -void PracroDAOTest::setActive(std::string sessionid, bool active) +void PracroDAOTest::setIdle(std::string sessionid, bool idle) { dbtable_t::iterator i = data.commits.begin(); while(i != data.commits.end()) { dbrow_t &commit = *i; - if(commit["sessionid"] == sessionid && commit["status"] != "committed") { - commit["status"] = active?"active":"idle"; + if(commit["uid"] == sessionid && commit["status"] != "committed") { + commit["status"] = idle?"idle":"active"; + } + i++; + } +} + +void PracroDAOTest::commit(std::string sessionid) +{ + dbtable_t::iterator i = data.commits.begin(); + while(i != data.commits.end()) { + dbrow_t &commit = *i; + if(commit["uid"] == sessionid && commit["status"] != "committed") { + commit["status"] = "committed"; + return; + } + i++; + } +} + +void PracroDAOTest::nocommit(std::string sessionid) +{ + dbtable_t::iterator i = data.commits.begin(); + while(i != data.commits.end()) { + dbrow_t &commit = *i; + if(commit["uid"] == sessionid && commit["status"] != "committed") { + commit["status"] = "idle"; + return; + } + i++; + } +} + +void PracroDAOTest::discard(std::string sessionid) +{ + dbtable_t::iterator i = data.commits.begin(); + while(i != data.commits.end()) { + dbrow_t &commit = *i; + if(commit["uid"] == sessionid && commit["status"] != "committed") { + data.commits.erase(i); + return; } i++; } @@ -282,6 +372,8 @@ static bool vectorFind(std::vector<Fieldname> fs, TEST_BEGIN; +debug_parse("+all"); + Data data; PracroDAOTest db(data); @@ -328,6 +420,44 @@ TEST_EQUAL_INT(vals.size(), 1, "One value"); TEST_NOTEQUAL(vals.find("field1"), vals.end(), "find value"); +{ + std::string sid = db.newSessionId(); + db.commitTransaction(sid, transaction, commit, macro, now); + TEST_FALSE(db.idle(sid), "Session should not be idle."); + + db.setIdle(sid, true); + TEST_TRUE(db.idle(sid), "Session should be idle."); + + db.setIdle(sid, false); + TEST_FALSE(db.idle(sid), "Session1 should not be idle."); +} + +{ + std::string sid = db.newSessionId(); + db.commitTransaction(sid, transaction, commit, macro, now); + TEST_FALSE(db.idle(sid), "Session should not be idle."); + db.commit(sid); + TEST_FALSE(db.idle(sid), "Session is not idle (since committed != idle)."); +} + +{ + std::string sid = db.newSessionId(); + db.commitTransaction(sid, transaction, commit, macro, now); + TEST_FALSE(db.idle(sid), "Session should not be idle."); + db.nocommit(sid); + TEST_TRUE(db.idle(sid), "Session is idle."); +} + +{ + std::string sid = db.newSessionId(); + db.commitTransaction(sid, transaction, commit, macro, now); + TEST_FALSE(db.idle(sid), "Session should not be idle."); + db.discard(sid); + TEST_FALSE(db.idle(sid), "Session not idle (it doesn't exist)."); +} + +TEST_FALSE(db.idle("no such session"), "Missing session is not idle."); + /* time_t now = time(NULL); |