diff options
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/server.cc | 73 | 
1 files changed, 46 insertions, 27 deletions
| diff --git a/server/src/server.cc b/server/src/server.cc index d1104c4..a3c7667 100644 --- a/server/src/server.cc +++ b/server/src/server.cc @@ -59,13 +59,18 @@  #include "macrolist.h"  #include "templatelist.h"  #include "versionstr.h" +#include "mutex.h"  typedef long long unsigned int sessionid_t; +typedef struct { +  JournalWriter *journalwriter; +} session_t; +  struct conn_t {    Database *db; -  sessionid_t sessionid; -  bool commit; +  Mutex mutex; +  std::map<sessionid_t, session_t> sessions;  };  static std::string error_box(std::string message) @@ -91,8 +96,7 @@ public:  }; -static std::string handleCommits(sessionid_t sessiondid, -                                 Transaction *transaction, Database &db,  +static std::string handleCommits(Transaction *transaction, Database &db,                                    JournalWriter &journalwriter, MacroList ¯olist,                                   TemplateList &templatelist)  { @@ -270,8 +274,7 @@ static std::string handleRequest(Transaction *transaction,    return answer;  } -static std::string handleTransaction(sessionid_t sessionid, -                                     Transaction *transaction, +static std::string handleTransaction(Transaction *transaction,                                       TCPSocket &pentominos_socket,                                       Database &db,                                       JournalWriter &journalwriter, @@ -283,7 +286,7 @@ static std::string handleTransaction(sessionid_t sessionid,    answer += "<pracro version=\"1.0\">\n";    try { -    answer += handleCommits(sessionid, transaction, db, +    answer += handleCommits(transaction, db,                              journalwriter, macrolist, templatelist);    } catch( std::exception &e ) {      PRACRO_ERR(server, "Commit error: %s\n", e.what()); @@ -304,18 +307,26 @@ static std::string handleTransaction(sessionid_t sessionid,    return answer;  } - -static std::string handleConnection(const char *buf, size_t size, struct conn_t *conn) +static std::string handleConnection(const char *buf, size_t size, struct conn_t *conn, +                                    sessionid_t sid, bool commitsession)  { +  /*    if(size == 0)       return error_box(xml_encode("Empty document received.")); - +  */    TCPSocket pentominos_socket;  #ifndef WITHOUT_PENTOMINOS    pentominos_socket.connect(Conf::pentominos_addr, Conf::pentominos_port);  #endif/*WITHOUT_PENTOMINOS*/ -  JournalWriter journalwriter(Conf::journal_commit_addr.c_str(), Conf::journal_commit_port); +  JournalWriter *journalwriter = NULL; +  conn->mutex.lock(); +  if(conn->sessions.find(sid) == conn->sessions.end()) { +    conn->sessions[sid].journalwriter = +      new JournalWriter(Conf::journal_commit_addr.c_str(), Conf::journal_commit_port); +  } +  journalwriter = conn->sessions[sid].journalwriter; +  conn->mutex.unlock();    MacroList macrolist(Conf::xml_basedir + "/macros");    TemplateList templatelist(Conf::xml_basedir + "/templates"); @@ -325,18 +336,26 @@ static std::string handleConnection(const char *buf, size_t size, struct conn_t    PRACRO_DEBUG(server, "Read %d bytes from network\n", size); +  std::string res;    if(parser.parse(buf, size)) {      PRACRO_DEBUG(server, "Got complete XML document, %d bytes in current buffer.\n", size); -    std::string res = handleTransaction(conn->sessionid, &transaction, pentominos_socket, -                                        *conn->db, journalwriter, macrolist, templatelist); -    journalwriter.commit(); +    res = handleTransaction(&transaction, pentominos_socket, +                                        *conn->db, *journalwriter, macrolist, templatelist); +  } else { +    PRACRO_ERR(server, "Failed to parse data!\n"); +    res = error_box(xml_encode("XML Parse error.")); +  } -    return res; +  if(commitsession) { +    journalwriter->commit(); +    delete journalwriter; +    conn->mutex.lock(); +    conn->sessions.erase(sid); +    conn->mutex.unlock();    } -  PRACRO_ERR(server, "Failed to parse data!\n"); -  return error_box(xml_encode("XML Parse error.")); +  return res;  }  static sessionid_t newSessionID() @@ -360,28 +379,28 @@ static int handle_request(void *cls,                 "handle_request(url=\"%s\", method=\"%s\","                 " version=\"%s\", data_size=\"%d\")\n",                 url, method, version, *data_size); - +  sessionid_t sessionid; +  bool commitsession = false; +      const char *sessionids = MHD_lookup_connection_value(con, MHD_HEADER_KIND, "SessionID"); -  if(sessionids == NULL) conn->sessionid = newSessionID(); -  else conn->sessionid = atoll(sessionids); -  printf("SessionID: %llu\n", conn->sessionid); +  if(sessionids == NULL) sessionid = newSessionID(); +  else sessionid = atoll(sessionids); +  printf("SessionID: %llu\n", sessionid);    const char *session_commit = MHD_lookup_connection_value(con, MHD_HEADER_KIND, "SessionCommit");    if(session_commit) { -    printf("COMMIT: sessionid %llu\n", conn->sessionid); -    conn->commit = true; -  } else { -    conn->commit = false; +    printf("COMMIT: sessionid %llu\n", sessionid); +    commitsession = true;    } -  std::string reply = handleConnection(data, *data_size, conn); +  std::string reply = handleConnection(data, *data_size, conn, sessionid, commitsession);    struct MHD_Response *rsp;    rsp = MHD_create_response_from_data(reply.length(), (char*)reply.c_str(), MHD_NO, MHD_YES);    MHD_add_response_header(rsp, MHD_HTTP_HEADER_CONTENT_TYPE, "text/plain; charset=UTF-8");    char idbuf[32]; -  snprintf(idbuf, sizeof(idbuf), "%llu", conn->sessionid); +  snprintf(idbuf, sizeof(idbuf), "%llu", sessionid);    MHD_add_response_header(rsp, "SessionID", idbuf);    int ret = MHD_queue_response(con, MHD_HTTP_OK, rsp); | 
