summaryrefslogtreecommitdiff
path: root/server/src/sessionserialiser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/sessionserialiser.cc')
-rw-r--r--server/src/sessionserialiser.cc132
1 files changed, 116 insertions, 16 deletions
diff --git a/server/src/sessionserialiser.cc b/server/src/sessionserialiser.cc
index 36d0a0d..6288ddd 100644
--- a/server/src/sessionserialiser.cc
+++ b/server/src/sessionserialiser.cc
@@ -34,6 +34,7 @@
#include "journal.h"
#include "sessionparser.h"
+#include "sessionheaderparser.h"
#include "database.h"
#include "xml_encode_decode.h"
@@ -88,7 +89,8 @@ Session *SessionSerialiser::loadStr(const std::string &xml)
j->setPatientID(XDEC(parser.patientid));
std::vector<SessionParser::Entry>::iterator i = parser.entries.begin();
while(i != parser.entries.end()) {
- j->addEntry(XDEC(i->resume), XDEC(i->macro), XDEC(i->user), i->index);
+ j->addEntry(XDEC(i->resume), XDEC(i->macro), XDEC(i->user), i->index,
+ i->oncommit);
i++;
}
@@ -122,6 +124,50 @@ std::string SessionSerialiser::saveStr(Session *session)
" macro=\"" + XENC(i->second.macro) + "\""
" user=\"" + XENC(i->second.user) + "\">\n";
xml += " <resume>" + XENC(i->second.resume) + "</resume>\n";
+ LUAOnCommit *oncommit = i->second.oncommit;
+ if(oncommit != NULL) {
+ xml += " <oncommit>\n";
+
+ xml += " <envs>\n";
+ std::map<LUAScript::env_t, std::string>::iterator ei =
+ oncommit->_env.begin();
+ while(ei != oncommit->_env.end()) {
+ std::string id;
+ switch(ei->first) {
+ case LUAScript::ENV_PATIENTID: id = "ENV_PATIENTID"; break;
+ case LUAScript::ENV_TEMPLATE: id = "ENV_TEMPLATE"; break;
+ case LUAScript::ENV_MACRO: id = "ENV_MACRO"; break;
+ case LUAScript::ENV_USER: id = "ENV_USER"; break;
+ }
+
+ xml += " <env id=\"" + XENC(id) + "\">"+
+ XENC(ei->second) + "</env>\n";
+ ei++;
+ }
+ xml += " </envs>\n";
+
+ xml += " <values>\n";
+ std::map<std::string, std::string>::iterator vi =
+ oncommit->values.begin();
+ while(vi != oncommit->values.end()) {
+ xml += " <value name=\"" + XENC(vi->first) + "\">"+
+ XENC(vi->second) + "</value>\n";
+ vi++;
+ }
+ xml += " </values>\n";
+
+ xml += " <scripts>\n";
+ std::vector<std::pair<std::string, std::string> >::iterator si =
+ oncommit->scripts.begin();
+ while(si != oncommit->scripts.end()) {
+ xml += " <script name=\"" + XENC(si->second) + "\">"+
+ XENC(si->first) + "</script>\n";
+ si++;
+ }
+ xml += " </scripts>\n";
+
+ xml += " </oncommit>\n";
+ }
xml += " </entry>\n";
i++;
@@ -170,6 +216,11 @@ void SessionSerialiser::save(Session *session)
// write xml to file
FILE *fp = fopen(filename.c_str(), "w");
+ if(!fp) {
+ ERR(sessionserialiser, "Could not write session to file %s\n",
+ filename.c_str());
+ return;
+ }
fwrite(xml.data(), xml.size(), 1, fp);
fclose(fp);
}
@@ -210,25 +261,34 @@ Session *SessionSerialiser::findFromTupple(const std::string &patientid,
DEBUG(sessionserialiser, "Is xml file\n");
- // Load session file
- FILE *fp = fopen(filename.c_str(), "r");
- std::string xml;
- while(!feof(fp)) {
- char str[64];
- memset(str, 0, sizeof(str));
- fread(str, sizeof(str) - 1, 1, fp);
- xml += str;
+ SessionHeaderParser::Header header;
+
+ SessionHeaderParser p(filename);
+ try {
+ p.parse();
+ header = p.getHeader();
+ } catch( ... ) {
+ continue;
}
- fclose(fp);
- Session *session = loadStr(xml);
+ if(header.patientid == patientid && header.templ == templ) {
+ // Load session file
+ FILE *fp = fopen(filename.c_str(), "r");
+ std::string xml;
+ while(!feof(fp)) {
+ char str[64];
+ memset(str, 0, sizeof(str));
+ fread(str, sizeof(str) - 1, 1, fp);
+ xml += str;
+ }
+ fclose(fp);
+
+ Session *session = loadStr(xml);
- DEBUG(sessionserialiser, "PatientID %s - Template %s\n",
- session->patientid.c_str(),
- session->templ.c_str());
+ DEBUG(sessionserialiser, "PatientID %s - Template %s\n",
+ session->patientid.c_str(),
+ session->templ.c_str());
- if(session->patientid == patientid &&
- session->templ == templ) {
closedir(dir);
unlink(filename.c_str());
return session;
@@ -241,6 +301,46 @@ Session *SessionSerialiser::findFromTupple(const std::string &patientid,
return NULL;
}
+std::map<std::string, SessionHeaderParser::Header>
+SessionSerialiser::sessionFiles()
+{
+ std::map<std::string, SessionHeaderParser::Header> list;
+
+ DIR *dir = opendir(path.c_str());
+ if(!dir) {
+ ERR(sessionserialiser, "Could not open directory: %s - %s\n",
+ path.c_str(), strerror(errno));
+ return list;
+ }
+
+ struct dirent *dirent;
+ while( (dirent = readdir(dir)) != NULL ) {
+
+ std::string filename = path+"/"+dirent->d_name;
+
+ if(isxmlfile(filename)) {
+
+ SessionHeaderParser::Header header;
+
+ SessionHeaderParser p(filename);
+ try {
+ p.parse();
+ header = p.getHeader();
+ } catch( ... ) {
+ continue;
+ }
+
+ list[filename] = header;
+ }
+ }
+
+ closedir(dir);
+
+ return list;
+
+}
+
+
#ifdef TEST_SESSIONSERIALISER
//deps: session.cc journal.cc debug.cc configuration.cc mutex.cc journal_commit.cc sessionparser.cc saxparser.cc xml_encode_decode.cc database.cc pracrodaopgsql.cc pracrodaotest.cc pracrodao.cc journal_uploadserver.cc log.cc environment.cc semaphore.cc artefact.cc macrolist.cc templatelist.cc entitylist.cc inotify.cc versionstr.cc exception.cc macroheaderparser.cc templateheaderparser.cc
//cflags: -I.. $(PTHREAD_CFLAGS) $(EXPAT_CFLAGS) $(PQXX_CFLAGS) -DWITHOUT_ARTEFACT