diff options
author | deva <deva> | 2011-08-02 08:00:20 +0000 |
---|---|---|
committer | deva <deva> | 2011-08-02 08:00:20 +0000 |
commit | ed9e290b441a6486c576c2e2e4baa69fa0f3ed37 (patch) | |
tree | 759ace8ca615e3a4167a5e783297cc761b89b992 /server/src/transactionhandler.cc | |
parent | 23f39df8b8edeacfa5821050abbdc855acb2edd6 (diff) |
New 'open course' feature.
Diffstat (limited to 'server/src/transactionhandler.cc')
-rw-r--r-- | server/src/transactionhandler.cc | 364 |
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 ¯o = (*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 ¯o = (*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())); |