diff options
author | deva <deva> | 2009-12-18 09:11:24 +0000 |
---|---|---|
committer | deva <deva> | 2009-12-18 09:11:24 +0000 |
commit | 4861dce935bba282fe171e4b855216b6074962c5 (patch) | |
tree | ce4fd938f602f9e9b7899adac52bca7a16ad6f1d | |
parent | 2f0bf2d0af5b9b749e6e195829fb7093fc8ab930 (diff) |
Moved transaction handling out of server.cc
-rw-r--r-- | server/src/Makefile.am | 2 | ||||
-rw-r--r-- | server/src/server.cc | 220 | ||||
-rw-r--r-- | server/src/transactionhandler.cc | 276 | ||||
-rw-r--r-- | server/src/transactionhandler.h | 52 |
4 files changed, 332 insertions, 218 deletions
diff --git a/server/src/Makefile.am b/server/src/Makefile.am index 8f24e07..3d30adf 100644 --- a/server/src/Makefile.am +++ b/server/src/Makefile.am @@ -36,6 +36,7 @@ pracrod_SOURCES = \ templatelist.cc \ templateheaderparser.cc \ templateparser.cc \ + transactionhandler.cc \ transactionparser.cc \ tcpsocket.cc \ utf8.cc \ @@ -106,6 +107,7 @@ EXTRA_DIST = \ templatelist.h \ templateheaderparser.h \ templateparser.h \ + transactionhandler.h \ transactionparser.h \ tcpsocket.h \ utf8.h \ diff --git a/server/src/server.cc b/server/src/server.cc index b264426..747e88c 100644 --- a/server/src/server.cc +++ b/server/src/server.cc @@ -62,6 +62,8 @@ #include "mutex.h" #include "log.h" +#include "transactionhandler.h" + typedef long long unsigned int sessionid_t; typedef struct { @@ -84,224 +86,6 @@ static std::string error_box(std::string message) return errorbox; } -class NotFoundException : public Exception { -public: - NotFoundException(Request &r) - : Exception("Macro " + r.macro + " not found in template " + r.templ) {} -}; - - -static std::string handleCommits(Transaction *transaction, Database &db, - JournalWriter &journalwriter, MacroList ¯olist, - TemplateList &templatelist) -{ - std::string answer; - - Commits::iterator i = transaction->commits.begin(); - while(i != transaction->commits.end()) { - Commit &commit = *i; - - MacroParser mp(macrolist.getLatestVersion(commit.macro)); - mp.parse(); - Macro *macro = mp.getMacro(); - - std::string resume = resume_parser(macro->resume, commit); - commit.fields["journal.resume"] = resume; - db.commitTransaction(transaction->user, transaction->cpr, *macro, commit.fields); - - if(resume != "") { - - TemplateParser tp(templatelist.getLatestVersion(commit.templ)); - tp.parse(); - Template *templ = tp.getTemplate(); - - journalwriter.addEntry(*transaction, commit, resume, templ); - } - - i++; - } - - return answer; -} - - -static std::string handleRequest(Transaction *transaction, - TCPSocket &pentominos_socket, - Database &db, - MacroList ¯olist, - TemplateList &templatelist) -{ - std::string answer; - - Requests::iterator i = transaction->requests.begin(); - while(i != transaction->requests.end()) { - Request &request = *i; - - PRACRO_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(templatelist.getLatestVersion(request.templ)); - tp.parse(); - - Template *templ = tp.getTemplate(); - - answer += " <template name=\""; - answer += templ->attributes["name"]; - answer += "\" title=\""; - answer += templ->attributes["title"]; - answer += "\">\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.attributes["caption"] + "\"/>\n"; - mi2++; - continue; - } - - bool completed = db.checkMacro(transaction->cpr, - macro.attributes["name"], - time(NULL)-Conf::db_max_ttl); - - answer += " <macro uid=\"42\" completed="; - if(completed) answer += "\"true\""; - else answer += "\"false\""; - - std::map< std::string, std::string >::iterator ai = macro.attributes.begin(); - while(ai != macro.attributes.end()) { - std::string name = ai->first; - std::string value = ai->second; - answer += " "+name+"=\"" + value + "\""; - ai++; - } - - if(macro.attributes["name"] == request.macro || - (macro.attributes.find("static") != macro.attributes.end() && - macro.attributes["static"] == "true") - ) { - foundmacro = true; - - MacroParser mp(macrolist.getLatestVersion(macro.attributes["name"])); - mp.parse(); - Macro *m = mp.getMacro(); - answer += " caption=\"" + m->widgets.attributes["caption"] + "\""; - answer += ">\n"; - - 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(pentominos_socket, transaction->cpr); - - 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"] - + "\" name=\"" + spi->attributes["name"] + "\">\n"; - answer += xml_encode(spi->attributes["code"]); - answer += "\n </script>\n"; - spi++; - } - answer += " </scripts>\n"; - } - - answer += widgetgenerator(transaction->cpr, *m, lqm, db); - } else { - // only find macro title - MacroParser mp(macrolist.getLatestVersion(macro.attributes["name"])); - mp.parse(); - Macro *m = mp.getMacro(); - answer += " caption=\"" + m->widgets.attributes["caption"] + "\""; - answer += ">\n"; - - } - - if(completed) { - answer += " <resume>"; - answer += db.getResume(transaction->cpr, macro, time(NULL) - Conf::db_max_ttl); - answer += "</resume>\n"; - } - - answer += " </macro>\n"; - mi2++; - - } - - if(foundmacro == false && request.macro != "") - throw NotFoundException(request); - - answer += " </template>\n"; - - i++; - } - - return answer; -} - -static std::string handleTransaction(Transaction *transaction, - TCPSocket &pentominos_socket, - Database &db, - JournalWriter &journalwriter, - MacroList ¯olist, - TemplateList &templatelist) -{ - std::string answer; - answer += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; - answer += "<pracro version=\"1.0\">\n"; - - try { - answer += handleCommits(transaction, db, - journalwriter, macrolist, templatelist); - } catch( std::exception &e ) { - PRACRO_ERR(server, "Commit error: %s\n", e.what()); - return error_box(xml_encode(e.what())); - } - - try { - answer += handleRequest(transaction, pentominos_socket, db, macrolist, templatelist); - } catch( std::exception &e ) { - PRACRO_ERR(server, "Request error: %s\n", e.what()); - return error_box(xml_encode(e.what())); - } - - answer += "</pracro>\n"; - - PRACRO_DEBUG(server, "Done handling transaction\n"); - PRACRO_DEBUG(serverxml, "%s\n", answer.c_str()); - return answer; -} - static std::string handleConnection(const char *buf, size_t size, struct conn_t *conn, sessionid_t sid, bool commitsession) { diff --git a/server/src/transactionhandler.cc b/server/src/transactionhandler.cc new file mode 100644 index 0000000..fa7a419 --- /dev/null +++ b/server/src/transactionhandler.cc @@ -0,0 +1,276 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * transactionhandler.cc + * + * Fri Dec 18 10:00:50 CET 2009 + * Copyright 2009 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "transactionhandler.h" + +#include "macroparser.h" +#include "resumeparser.h" +#include "templateparser.h" +#include "configuration.h" +#include "luaquerymapper.h" +#include "queryhandlerpentominos.h" +#include "queryhandlerpracro.h" +#include "xml_encode_decode.h" +#include "widgetgenerator.h" + +static std::string error_box(std::string message) +{ + std::string errorbox = + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<pracro version=\"1.0\">\n" + " <error>" + message + "</error>\n" + "</pracro>\n"; + return errorbox; +} + +static std::string handleCommits(Transaction *transaction, Database &db, + JournalWriter &journalwriter, MacroList ¯olist, + TemplateList &templatelist) +{ + std::string answer; + + Commits::iterator i = transaction->commits.begin(); + while(i != transaction->commits.end()) { + Commit &commit = *i; + + MacroParser mp(macrolist.getLatestVersion(commit.macro)); + mp.parse(); + Macro *macro = mp.getMacro(); + + std::string resume = resume_parser(macro->resume, commit); + commit.fields["journal.resume"] = resume; + db.commitTransaction(transaction->user, transaction->cpr, *macro, commit.fields); + + if(resume != "") { + + TemplateParser tp(templatelist.getLatestVersion(commit.templ)); + tp.parse(); + Template *templ = tp.getTemplate(); + + journalwriter.addEntry(*transaction, commit, resume, templ); + } + + i++; + } + + return answer; +} + + +static std::string handleRequest(Transaction *transaction, + TCPSocket &pentominos_socket, + Database &db, + MacroList ¯olist, + TemplateList &templatelist) +{ + std::string answer; + + Requests::iterator i = transaction->requests.begin(); + while(i != transaction->requests.end()) { + Request &request = *i; + + PRACRO_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(templatelist.getLatestVersion(request.templ)); + tp.parse(); + + Template *templ = tp.getTemplate(); + + answer += " <template name=\""; + answer += templ->attributes["name"]; + answer += "\" title=\""; + answer += templ->attributes["title"]; + answer += "\">\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.attributes["caption"] + "\"/>\n"; + mi2++; + continue; + } + + bool completed = db.checkMacro(transaction->cpr, + macro.attributes["name"], + time(NULL)-Conf::db_max_ttl); + + answer += " <macro uid=\"42\" completed="; + if(completed) answer += "\"true\""; + else answer += "\"false\""; + + std::map< std::string, std::string >::iterator ai = macro.attributes.begin(); + while(ai != macro.attributes.end()) { + std::string name = ai->first; + std::string value = ai->second; + answer += " "+name+"=\"" + value + "\""; + ai++; + } + + if(macro.attributes["name"] == request.macro || + (macro.attributes.find("static") != macro.attributes.end() && + macro.attributes["static"] == "true") + ) { + foundmacro = true; + + MacroParser mp(macrolist.getLatestVersion(macro.attributes["name"])); + mp.parse(); + Macro *m = mp.getMacro(); + answer += " caption=\"" + m->widgets.attributes["caption"] + "\""; + answer += ">\n"; + + 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(pentominos_socket, transaction->cpr); + + 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"] + + "\" name=\"" + spi->attributes["name"] + "\">\n"; + answer += xml_encode(spi->attributes["code"]); + answer += "\n </script>\n"; + spi++; + } + answer += " </scripts>\n"; + } + + answer += widgetgenerator(transaction->cpr, *m, lqm, db); + } else { + // only find macro title + MacroParser mp(macrolist.getLatestVersion(macro.attributes["name"])); + mp.parse(); + Macro *m = mp.getMacro(); + answer += " caption=\"" + m->widgets.attributes["caption"] + "\""; + answer += ">\n"; + + } + + if(completed) { + answer += " <resume>"; + answer += db.getResume(transaction->cpr, macro, time(NULL) - Conf::db_max_ttl); + answer += "</resume>\n"; + } + + answer += " </macro>\n"; + mi2++; + + } + + if(foundmacro == false && request.macro != "") + throw NotFoundException(request); + + answer += " </template>\n"; + + i++; + } + + return answer; +} + +std::string handleTransaction(Transaction *transaction, + TCPSocket &pentominos_socket, + Database &db, + JournalWriter &journalwriter, + MacroList ¯olist, + TemplateList &templatelist) +{ + std::string answer; + answer += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + answer += "<pracro version=\"1.0\">\n"; + + try { + answer += handleCommits(transaction, db, + journalwriter, macrolist, templatelist); + } catch( std::exception &e ) { + PRACRO_ERR(server, "Commit error: %s\n", e.what()); + return error_box(xml_encode(e.what())); + } + + try { + answer += handleRequest(transaction, pentominos_socket, db, macrolist, templatelist); + } catch( std::exception &e ) { + PRACRO_ERR(server, "Request error: %s\n", e.what()); + return error_box(xml_encode(e.what())); + } + + answer += "</pracro>\n"; + + PRACRO_DEBUG(server, "Done handling transaction\n"); + PRACRO_DEBUG(serverxml, "%s\n", answer.c_str()); + return answer; +} + +#ifdef TEST_TRANSACTIONHANDLER +//Additional dependency files +//deps: +//Required cflags (autoconf vars may be used) +//cflags: +//Required link options (autoconf vars may be used) +//libs: +#include "test.h" + +TEST_BEGIN; + +// TODO: Put some testcode here (see test.h for usable macros). + +TEST_END; + +#endif/*TEST_TRANSACTIONHANDLER*/ diff --git a/server/src/transactionhandler.h b/server/src/transactionhandler.h new file mode 100644 index 0000000..9a2086a --- /dev/null +++ b/server/src/transactionhandler.h @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * transactionhandler.h + * + * Fri Dec 18 10:00:50 CET 2009 + * Copyright 2009 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __PRACRO_TRANSACTIONHANDLER_H__ +#define __PRACRO_TRANSACTIONHANDLER_H__ + +#include "exception.h" +#include "transaction.h" +#include "tcpsocket.h" +#include "database.h" +#include "journal_commit.h" +#include "macrolist.h" +#include "templatelist.h" + +class NotFoundException : public Exception { +public: + NotFoundException(Request &r) + : Exception("Macro " + r.macro + " not found in template " + r.templ) {} +}; + +std::string handleTransaction(Transaction *transaction, + TCPSocket &pentominos_socket, + Database &db, + JournalWriter &journalwriter, + MacroList ¯olist, + TemplateList &templatelist); + +#endif/*__PRACRO_TRANSACTIONHANDLER_H__*/ |