summaryrefslogtreecommitdiff
path: root/server/src/transactionhandler.cc
diff options
context:
space:
mode:
authordeva <deva>2011-08-02 08:00:20 +0000
committerdeva <deva>2011-08-02 08:00:20 +0000
commited9e290b441a6486c576c2e2e4baa69fa0f3ed37 (patch)
tree759ace8ca615e3a4167a5e783297cc761b89b992 /server/src/transactionhandler.cc
parent23f39df8b8edeacfa5821050abbdc855acb2edd6 (diff)
New 'open course' feature.
Diffstat (limited to 'server/src/transactionhandler.cc')
-rw-r--r--server/src/transactionhandler.cc364
1 files changed, 194 insertions, 170 deletions
diff --git a/server/src/transactionhandler.cc b/server/src/transactionhandler.cc
index 4b4e7ca..0821cef 100644
--- a/server/src/transactionhandler.cc
+++ b/server/src/transactionhandler.cc
@@ -30,6 +30,8 @@
#include "macroparser.h"
#include "resumeparser.h"
#include "templateparser.h"
+#include "templateheaderparser.h"
+#include "courseparser.h"
#include "configuration.h"
#include "luaquerymapper.h"
#include "queryhandlerpentominos.h"
@@ -83,206 +85,228 @@ static std::string handleCommits(Transaction &transaction, Environment &env,
return answer;
}
-static std::string handleRequest(Transaction &transaction, Environment &env,
+static std::string handleRequest(Request &request, Environment &env,
Session &session)
{
std::string answer;
- if(transaction.requests.size() > 0) {
+ if(request.course == "" && request.templ == "" && request.macro == "")
+ return "";
- AutoBorrower<Database*> borrower(env.dbpool);
- Database *db = borrower.get();
- // Database *db = session.database();
+ if(request.course != "" && request.templ == "" && request.macro == "") {
+ CourseParser cp(env.courselist.getLatestVersion(request.course));
+ cp.parse();
+ Course *course = cp.getCourse();
+ answer += " <course name=\"" + course->name + "\" title=\"" +
+ course->title + "\">\n";
- Requests::iterator i = transaction.requests.begin();
- while(i != transaction.requests.end()) {
- Request &request = *i;
+ std::vector< Template >::iterator ti = course->templates.begin();
+ while(ti != course->templates.end()) {
+ std::string tname = ti->name;
- DEBUG(server, "Handling request - macro: %s, template: %s\n",
- request.macro.c_str(), request.templ.c_str());
-
- // Read and parse the template file.
- TemplateParser tp(env.templatelist.getLatestVersion(request.templ));
+ TemplateHeaderParser tp(env.templatelist.getLatestVersion(tname));
tp.parse();
-
Template *templ = tp.getTemplate();
-
- answer += " <template name=\"" + templ->name + "\" title=\"" +
- templ->title + "\">\n";
-
- bool foundmacro = false;
-
- // Generate the macro and return it to the client
- std::vector< Macro >::iterator mi2 = templ->macros.begin();
- while(mi2 != templ->macros.end()) {
- Macro &macro = (*mi2);
- if(macro.isHeader) {
- answer += " <header caption=\"" + macro.caption + "\"/>\n";
- mi2++;
- continue;
- }
-
- size_t oldest = time(NULL) - Conf::db_max_ttl;
- if(macro.ttl != "") oldest = time(NULL) - atoi(macro.ttl.c_str());
-
- bool completed =
- db->checkMacro(transaction.cpr, macro.name, session.id(), oldest);
+ answer += " <template name=\"" + templ->name + "\" title=\"" +
+ templ->title + "\"/>\n";
- answer += " <macro uid=\"42\" completed=";
- if(completed) answer += "\"true\"";
- else answer += "\"false\"";
+ ti++;
+ }
+
+ answer += " </course>\n";
- attributes_t attr;
- attr["name"] = macro.name;
- attr["version"] = macro.version;
- if(macro.caption != "") attr["caption"] = macro.caption;
- if(macro.requires != "") attr["requires"] = macro.requires;
- attr["static"] = macro.isStatic?"true":"false";
- attr["compact"] = macro.isCompact?"true":"false";
- attr["important"] = macro.isImportant?"true":"false";
+ return answer;
+ }
- attributes_t::iterator ai = attr.begin();
- while(ai != attr.end()) {
- std::string name = ai->first;
- std::string value = ai->second;
- answer += " "+name+"=\"" + value + "\"";
- ai++;
+ AutoBorrower<Database*> borrower(env.dbpool);
+ Database *db = borrower.get();
+ // Database *db = session.database();
+
+ DEBUG(server, "Handling request - macro: %s, template: %s\n",
+ request.macro.c_str(), request.templ.c_str());
+
+ // Read and parse the template file.
+ TemplateParser tp(env.templatelist.getLatestVersion(request.templ));
+ tp.parse();
+
+ Template *templ = tp.getTemplate();
+
+ answer += " <template name=\"" + templ->name + "\" title=\"" +
+ templ->title + "\">\n";
+
+ bool foundmacro = false;
+
+ // Generate the macro and return it to the client
+ std::vector< Macro >::iterator mi2 = templ->macros.begin();
+ while(mi2 != templ->macros.end()) {
+ Macro &macro = (*mi2);
+
+ if(macro.isHeader) {
+ answer += " <header caption=\"" + macro.caption + "\"/>\n";
+ mi2++;
+ continue;
+ }
+
+ size_t oldest = time(NULL) - Conf::db_max_ttl;
+ if(macro.ttl != "") oldest = time(NULL) - atoi(macro.ttl.c_str());
+
+ bool completed =
+ db->checkMacro(request.patientid, macro.name, session.id(),
+ oldest);
+
+ answer += " <macro uid=\"42\" completed=";
+ if(completed) answer += "\"true\"";
+ else answer += "\"false\"";
+
+ attributes_t attr;
+ attr["name"] = macro.name;
+ attr["version"] = macro.version;
+ if(macro.caption != "") attr["caption"] = macro.caption;
+ if(macro.requires != "") attr["requires"] = macro.requires;
+ attr["static"] = macro.isStatic?"true":"false";
+ attr["compact"] = macro.isCompact?"true":"false";
+ attr["important"] = macro.isImportant?"true":"false";
+
+ attributes_t::iterator ai = attr.begin();
+ while(ai != attr.end()) {
+ std::string name = ai->first;
+ std::string value = ai->second;
+ answer += " "+name+"=\"" + value + "\"";
+ ai++;
+ }
+
+ if(macro.name == request.macro || macro.isStatic) {
+ foundmacro = true;
+
+ MacroParser mp(env.macrolist.getLatestVersion(macro.name));
+ mp.parse();
+ Macro *m = mp.getMacro();
+ answer += " caption=\"" + m->widgets.attributes["caption"] + "\"";
+ answer += ">\n";
+
+ AutoBorrower<Artefact*> borrower(env.atfpool);
+ Artefact *atf = borrower.get();
+
+ LUAQueryMapper lqm;
+
+ ////////////////////////
+ std::vector< Query >::iterator qi = m->queries.begin();
+ while(qi != m->queries.end()) {
+
+ Query &query = *qi;
+ std::string service = query.attributes["service"];
+
+ if(service == "pentominos") {
+ // Send the queries to Pentominos (if any)
+ QueryHandlerPentominos qh(*atf, request.patientid,
+ "pracrod"/*user*/);
+
+ QueryResult queryresult = qh.exec(*qi);
+ lqm.addQueryResult(queryresult);
}
-
- if(macro.name == request.macro || macro.isStatic) {
- foundmacro = true;
-
- MacroParser mp(env.macrolist.getLatestVersion(macro.name));
- mp.parse();
- Macro *m = mp.getMacro();
- answer += " caption=\"" + m->widgets.attributes["caption"] + "\"";
- answer += ">\n";
-
- AutoBorrower<Artefact*> borrower(env.atfpool);
- Artefact *atf = borrower.get();
-
- LUAQueryMapper lqm;
-
- ////////////////////////
- std::vector< Query >::iterator qi = m->queries.begin();
- while(qi != m->queries.end()) {
-
- Query &query = *qi;
- std::string service = query.attributes["service"];
-
- if(service == "pentominos") {
- // Send the queries to Pentominos (if any)
- QueryHandlerPentominos qh(*atf, transaction.cpr,
- "pracrod"/*user*/);
-
- QueryResult queryresult = qh.exec(*qi);
- lqm.addQueryResult(queryresult);
- }
-
- if(service == "pracro") {
- // Send the queries to Pentominos (if any)
- QueryHandlerPracro qh(*db, transaction.cpr);
-
- QueryResult queryresult = qh.exec(*qi);
- lqm.addQueryResult(queryresult);
- }
-
- qi++;
- }
-
- // Handle scripts
- if(m->scripts.size()) {
- answer += " <scripts>\n";
-
- std::vector< Script >::iterator spi = m->scripts.begin();
- while(spi != m->scripts.end()) {
- // answer += " <script language=\"" +
- // spi->attributes["language"] + "\">";
- answer += " <script>";
-
- if(spi->attributes.find("src") != spi->attributes.end()) {
- std::string file =
+
+ if(service == "pracro") {
+ // Send the queries to Pentominos (if any)
+ QueryHandlerPracro qh(*db, request.patientid);
+
+ QueryResult queryresult = qh.exec(*qi);
+ lqm.addQueryResult(queryresult);
+ }
+
+ qi++;
+ }
+
+ // Handle scripts
+ if(m->scripts.size()) {
+ answer += " <scripts>\n";
+
+ std::vector< Script >::iterator spi = m->scripts.begin();
+ while(spi != m->scripts.end()) {
+ // answer += " <script language=\"" +
+ // spi->attributes["language"] + "\">";
+ answer += " <script>";
+
+ if(spi->attributes.find("src") != spi->attributes.end()) {
+ std::string file =
Conf::xml_basedir + "/include/" + spi->attributes["src"];
- FILE *fp = fopen(file.c_str(), "r");
- if(fp) {
- char buf[64];
- size_t sz;
- std::string inc;
- while((sz = fread(buf, 1, sizeof(buf), fp)) != 0) {
- inc.append(buf, sz);
- }
- fclose(fp);
- answer += "\n-- BEGIN INCLUDE: '" + spi->attributes["src"] + "'\n";
- answer += xml_encode(inc);
- answer += "\n-- END INCLUDE: '" + spi->attributes["src"] + "'\n";
- }
- } else {
- answer += xml_encode(spi->attributes["code"]);
+ FILE *fp = fopen(file.c_str(), "r");
+ if(fp) {
+ char buf[64];
+ size_t sz;
+ std::string inc;
+ while((sz = fread(buf, 1, sizeof(buf), fp)) != 0) {
+ inc.append(buf, sz);
}
- answer += "</script>\n";
- spi++;
+ fclose(fp);
+ answer +="\n-- BEGIN INCLUDE: '"+spi->attributes["src"]+"'\n";
+ answer += xml_encode(inc);
+ answer +="\n-- END INCLUDE: '"+spi->attributes["src"]+"'\n";
}
-
- answer += " </scripts>\n";
+ } else {
+ answer += xml_encode(spi->attributes["code"]);
}
-
- answer += widgetgenerator(transaction.cpr, session.id(), *m, lqm,
- *db, oldest);
- } else {
- // only find macro title
- MacroParser mp(env.macrolist.getLatestVersion(macro.name));
- mp.parse();
- Macro *m = mp.getMacro();
- answer += " caption=\"" + m->widgets.attributes["caption"] + "\"";
- answer += ">\n";
-
+ answer += "</script>\n";
+ spi++;
}
-
- if(completed) {
- std::string jresume = session.journal()->getEntry(macro.name);
-
- std::string state = "old";
- std::string resume = db->getResume(transaction.cpr, macro, oldest,
- session.id());
- if(session.journal()->dirty(macro.name)) {
+
+ answer += " </scripts>\n";
+ }
+
+ answer += widgetgenerator(request.patientid, session.id(), *m,
+ lqm, *db, oldest);
+ } else {
+ // only find macro title
+ MacroParser mp(env.macrolist.getLatestVersion(macro.name));
+ mp.parse();
+ Macro *m = mp.getMacro();
+ answer += " caption=\"" + m->widgets.attributes["caption"] + "\"";
+ answer += ">\n";
+
+ }
+
+ if(completed) {
+ std::string jresume = session.journal()->getEntry(macro.name);
+
+ std::string state = "old";
+ std::string resume = db->getResume(request.patientid, macro,
+ oldest, session.id());
+ if(session.journal()->dirty(macro.name)) {
+ state = "dirty";
+ } else {
+ if(resume == jresume) {
+ state = "new";
+ } else {
+ if(jresume != "") {
state = "dirty";
+ session.journal()->setDirty(macro.name);
} else {
- if(resume == jresume) {
- state = "new";
- } else {
- if(jresume != "") {
- state = "dirty";
- session.journal()->setDirty(macro.name);
- } else {
- state = "old";
- }
- }
+ state = "old";
}
-
- answer += " <resume state=\""+state+"\">";
- answer += xml_encode(resume);
- answer += "</resume>\n";
}
-
- answer += " </macro>\n";
- mi2++;
-
}
- if(foundmacro == false && request.macro != "")
- throw NotFoundException(request);
-
- answer += " </template>\n";
-
- i++;
+ answer += " <resume state=\""+state+"\">";
+ answer += xml_encode(resume);
+ answer += "</resume>\n";
}
+
+ answer += " </macro>\n";
+ mi2++;
+
}
+
+ if(foundmacro == false && request.macro != "")
+ throw NotFoundException(request);
+
+ answer += " </template>\n";
return answer;
}
-std::string handleTransaction(Transaction &transaction, Environment &env,
+std::string handleTransaction(Request &request,
+ Transaction &transaction,
+ Environment &env,
Session &session)
{
std::string answer;
@@ -298,7 +322,7 @@ std::string handleTransaction(Transaction &transaction, Environment &env,
}
try {
- answer += handleRequest(transaction, env, session);
+ answer += handleRequest(request, env, session);
} catch( std::exception &e ) {
ERR(server, "Request error: %s\n", e.what());
return error_box(xml_encode(e.what()));