summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordeva <deva>2009-11-13 13:51:08 +0000
committerdeva <deva>2009-11-13 13:51:08 +0000
commitd536b969ed2739c467b19ba73cc32e0c9e73645d (patch)
treec9d8ca38f13116be4e6b2077db08c0622a575a29
parentd7c7c961e8c35c2d8587ec7f60aac5e309284a97 (diff)
JournalWriter now works with sessions, i.e. just like in the old days before microhttpd.
-rw-r--r--server/src/server.cc73
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 &macrolist,
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);