From 98b90925d863531c3a6c75de15fb686b1fb1891f Mon Sep 17 00:00:00 2001 From: deva Date: Mon, 4 Aug 2008 10:31:45 +0000 Subject: Made server able to run (compile-time) without postgres and the uploadserver. Fixed problems in the exclusion of pentominos support. Fixed bug in db query field iteration. --- server/configure.in | 26 +++++++++++++++++- server/src/database.cc | 32 ++++++++++++++++++++-- server/src/database.h | 2 ++ server/src/journal_commit.cc | 11 ++++---- server/src/queryhandler.cc | 28 +++++++++++++++++-- server/src/server.cc | 63 ++++++++++++++++++++----------------------- server/src/widgetgenerator.cc | 2 +- 7 files changed, 119 insertions(+), 45 deletions(-) diff --git a/server/configure.in b/server/configure.in index 79a14e1..9d6b803 100644 --- a/server/configure.in +++ b/server/configure.in @@ -19,7 +19,7 @@ dnl ====================== dnl Compile without pentominos support dnl ====================== AC_ARG_WITH(pentominos, - [ --with-pentominos build without pentominos support (default=yes)], + [ --with-pentominos build with pentominos support (default=yes)], [], [with_pentominos=yes]) if test x$with_pentominos == xno; then @@ -27,6 +27,30 @@ if test x$with_pentominos == xno; then CXXFLAGS="$CXXFLAGS -DWITHOUT_PENTOMINOS" fi +dnl ====================== +dnl Compile without uploadserver support +dnl ====================== +AC_ARG_WITH(uploadserver, + [ --with-uploadserver build with uploadserver support (default=yes)], + [], + [with_uploadserver=yes]) +if test x$with_uploadserver == xno; then + AC_MSG_WARN([*** Building without uploadserver support!]) + CXXFLAGS="$CXXFLAGS -DWITHOUT_UPLOADSERVER" +fi + +dnl ====================== +dnl Compile without db support +dnl ====================== +AC_ARG_WITH(db, + [ --with-db build with db support (default=yes)], + [], + [with_db=yes]) +if test x$with_db == xno; then + AC_MSG_WARN([*** Building without db support!]) + CXXFLAGS="$CXXFLAGS -DWITHOUT_DB" +fi + AC_PROG_CXX AC_PROG_LIBTOOL diff --git a/server/src/database.cc b/server/src/database.cc index 35d9214..2b8b83c 100644 --- a/server/src/database.cc +++ b/server/src/database.cc @@ -27,7 +27,9 @@ #include "database.h" Database::Database(std::string hostname, std::string user, std::string password) +#ifndef WITHOUT_DB : c("host=" + hostname + " user=" + user + " password=" + password + " dbname=pracro") +#endif/*WITHOUT_DB*/ { } @@ -57,15 +59,23 @@ void Database::commit(std::string user, std::string macro = _macro.attributes["name"]; std::stringstream timestamp; timestamp << now; +#ifndef WITHOUT_DB pqxx::work W(c); +#endif/*WITHOUT_DB*/ std::string ts = "INSERT INTO transactions" " VALUES('"+cpr+"', '"+macro+"', '"+version+"', '"+timestamp.str()+"', '"+user+"')"; - pqxx::result R = W.exec(ts); + std::stringstream oid; - std::stringstream oid; oid << R.inserted_oid(); +#ifndef WITHOUT_DB + pqxx::result R = W.exec(ts); + oid << R.inserted_oid(); +#else + oid << "###GENERATED_OID###"; + printf("%s\n", ts.c_str()); +#endif/*WITHOUT_DB*/ std::map< std::string, std::string >::iterator i = fields.begin(); while(i != fields.end()) { @@ -74,12 +84,18 @@ void Database::commit(std::string user, "INSERT INTO fields" " VALUES('"+oid.str()+"', '"+i->first+"', '"+i->second+"')"; +#ifndef WITHOUT_DB W.exec(fs); +#else + printf("%s\n", fs.c_str()); +#endif/*WITHOUT_DB*/ i++; } +#ifndef WITHOUT_DB W.commit(); +#endif/*WITHOUT_DB*/ #if 0 try { @@ -100,7 +116,9 @@ Values Database::getValues(std::string cpr, time_t oldest) { Values values; +#ifndef WITHOUT_DB pqxx::work W(c); +#endif/*WITHOUT_DB*/ std::stringstream query; query << "SELECT fields.name, fields.value, transactions.timestamp"; @@ -121,6 +139,7 @@ Values Database::getValues(std::string cpr, query << " ORDER BY transactions.timestamp"; +#ifndef WITHOUT_DB pqxx::result R = W.exec(query.str()); pqxx::result::const_iterator ri = R.begin(); @@ -139,6 +158,9 @@ Values Database::getValues(std::string cpr, ri++; } +#else + printf("%s\n", query.str().c_str()); +#endif/*WITHOUT_DB*/ return values; } @@ -147,7 +169,9 @@ bool Database::checkMacro(std::string cpr, std::string macro, time_t oldest) { +#ifndef WITHOUT_DB pqxx::work W(c); +#endif/*WITHOUT_DB*/ std::stringstream query; query << "SELECT oid"; @@ -157,6 +181,7 @@ bool Database::checkMacro(std::string cpr, query << " AND timestamp >= " << oldest; query << " ORDER BY timestamp"; +#ifndef WITHOUT_DB try { pqxx::result R = W.exec(query.str()); @@ -164,6 +189,9 @@ bool Database::checkMacro(std::string cpr, } catch( ... ) { return false; } +#else + return false; +#endif/*WITHOUT_DB*/ } /* diff --git a/server/src/database.h b/server/src/database.h index 85f8cd7..bd3139e 100644 --- a/server/src/database.h +++ b/server/src/database.h @@ -77,7 +77,9 @@ public: void disconnect() {} private: +#ifndef WITHOUT_DB pqxx::connection c; +#endif/*WITHOUT_DB*/ }; #endif/*__PRACRO_DATABASE_H__*/ diff --git a/server/src/journal_commit.cc b/server/src/journal_commit.cc index 95432b6..b1ae866 100644 --- a/server/src/journal_commit.cc +++ b/server/src/journal_commit.cc @@ -42,8 +42,6 @@ #include #include -//#define NO_NETWORK - static int mwrite(int sock, const char *fmt, ...) { int l = 0; @@ -69,10 +67,11 @@ int journal_commit(const char *cpr, const char *user, const char *addr, unsigned short int port, const char *buf, size_t size) { - struct sockaddr_in sin; int sock = 1; -#ifndef NO_NETWORK +#ifndef WITHOUT_UPLOADSERVER + struct sockaddr_in sin; + // Do DNS lookup char *ip; struct in_addr **addr_list; @@ -104,7 +103,7 @@ int journal_commit(const char *cpr, const char *user, perror(":"); return -1; } -#endif/*NO_NETWORK*/ +#endif/*WITHOUT_UPLOADSERVER*/ // send header mwrite(sock, "PUT JOURNAL PROTO1.0 \r\n"); @@ -121,8 +120,10 @@ int journal_commit(const char *cpr, const char *user, fprintf(stderr, "write did not write all the bytes in the buffer.\n"); } +#ifndef WITHOUT_UPLOADSERVER // close socket close(sock); +#endif/*WITHOUT_UPLOADSERVER*/ return 0; } diff --git a/server/src/queryhandler.cc b/server/src/queryhandler.cc index cd96b03..573ce3a 100644 --- a/server/src/queryhandler.cc +++ b/server/src/queryhandler.cc @@ -153,7 +153,11 @@ std::string QueryHandler::exec() " xmlns:pentominos=\"http://www.aasimon.org/pentominos\"\n" " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" " xsi:schemaLocation=\"http://www.aasimon.org/pentominos schema.xsd\">\n"; +#ifndef WITHOUT_PENTOMINOS socket->write(header, strlen(header)); +#else + printf(header); +#endif/*WITHOUT_PENTOMINOS*/ sprintf(buf, " \n", cpr.c_str(), +#ifndef WITHOUT_PENTOMINOS socket->srcaddr().c_str(), socket->dstaddr().c_str(), +#else + "127.0.0.1", + "127.0.0.1", +#endif/*WITHOUT_PENTOMINOS*/ (unsigned int)timestamp, uid.c_str()); +#ifndef WITHOUT_PENTOMINOS socket->write(buf, strlen(buf)); +#else + printf(buf); +#endif/*WITHOUT_PENTOMINOS*/ std::vector< Query >::iterator j = queries.begin(); while(j != queries.end()) { @@ -179,27 +192,38 @@ std::string QueryHandler::exec() query.attributes["class"].c_str(), query.attributes["class"].c_str()); +#ifndef WITHOUT_PENTOMINOS socket->write(buf, strlen(buf)); +#else + printf(buf); +#endif/*WITHOUT_PENTOMINOS*/ j++; } sprintf(buf, "\n"); - socket->write(buf, strlen(buf)); +#ifndef WITHOUT_PENTOMINOS + socket->write(buf, strlen(buf)); // Terminate char term[] = "\0"; socket->write(term, 1); +#else + printf(buf); +#endif/*WITHOUT_PENTOMINOS*/ + std::string answer; + +#ifndef WITHOUT_PENTOMINOS // Wait for answer char abuf[64]; int res; - std::string answer; do { memset(abuf, 0, sizeof(abuf)); res = socket->read(abuf, sizeof(abuf) - 1); answer += abuf; } while(res); +#endif/*WITHOUT_PENTOMINOS*/ return answer; } diff --git a/server/src/server.cc b/server/src/server.cc index 6f875b8..353708f 100644 --- a/server/src/server.cc +++ b/server/src/server.cc @@ -123,39 +123,6 @@ static void connection(TCPSocket &socket) Template *templ = tp.getTemplate(); -#ifndef WITHOUT_PENTOMINOS - // Send the queries to Pentominos (if any) - TCPSocket s; - s.connect(Conf::pentominos_addr, Conf::pentominos_port); - QueryHandler qh(&s, transaction.cpr); - - std::vector< Macro >::iterator mi = templ->course.macroes.begin(); - while(mi != templ->course.macroes.end()) { - Macro ¯o = (*mi); - if(macro.attributes["name"] == request.macro) { - - std::vector< Query >::iterator qi = m->queries.begin(); - while(qi != m->queries.end()) { - qh.addQuery(*qi); - qi++; - } - } - mi++; - } - std::string result = qh.exec(); - - printf("Got result: [%s]\n", result.c_str()); -#else - std::string result = ""; -#endif/*WITHOUT_PENTOMINOS*/ - - // Parse the result from the queries to pentominos - QueryParser qp(result); - qp.parse(); - - // Map the results - LUAQueryMapper lqm(qp.result); - answer += " course.attributes["name"]; answer += "\">\n"; @@ -172,6 +139,15 @@ static void connection(TCPSocket &socket) else answer += "\"false\""; answer += ">\n"; + /////////////////////////////// + // Send the queries to Pentominos (if any) + TCPSocket s; +#ifndef WITHOUT_PENTOMINOS + s.connect(Conf::pentominos_addr, Conf::pentominos_port); +#endif/*WITHOUT_PENTOMINOS*/ + QueryHandler qh(&s, transaction.cpr); + /////////////////////////////// + if(macro.attributes["name"] == request.macro) { foundmacro = true; @@ -180,7 +156,17 @@ static void connection(TCPSocket &socket) mp.parse(); Macro *m = mp.getMacro(); - // Handle lua programs + //////////////////////// + std::vector< Query >::iterator qi = m->queries.begin(); + while(qi != m->queries.end()) { + qh.addQuery(*qi); + qi++; + } + std::string result = qh.exec(); + printf("Got result: [%s]\n", result.c_str()); + ///////////////////////// + + // Handle scripts if(m->scripts.size()) { answer += " \n"; @@ -194,6 +180,15 @@ static void connection(TCPSocket &socket) } answer += " \n"; } + + ///////////////////////// + // Parse the result from the queries to pentominos + QueryParser qp(result); + qp.parse(); + // Map the results + LUAQueryMapper lqm(qp.result); + //////////////////////// + answer += widgetgenerator(*m, lqm, db); } answer += " \n"; diff --git a/server/src/widgetgenerator.cc b/server/src/widgetgenerator.cc index e9a8fee..ad9ffc6 100644 --- a/server/src/widgetgenerator.cc +++ b/server/src/widgetgenerator.cc @@ -106,7 +106,7 @@ static std::string send_macro_widget(Macro ¯o, static void get_fields(Widget &widget, Fieldnames &fields) { if(widget.attributes.find("value") != widget.attributes.end()) { - fields.push_back(widget.attributes["name"]); + if(widget.attributes["name"] != "") fields.push_back(widget.attributes["name"]); } std::vector< Widget >::iterator w = widget.widgets.begin(); -- cgit v1.2.3