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 /server/src | |
| parent | 2f0bf2d0af5b9b749e6e195829fb7093fc8ab930 (diff) | |
Moved transaction handling out of server.cc
Diffstat (limited to 'server/src')
| -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__*/ | 
