summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordeva <deva>2009-02-11 07:14:22 +0000
committerdeva <deva>2009-02-11 07:14:22 +0000
commit4df8884f155f7558c07949426c248e066df7936f (patch)
tree61030bad443e366b8fb0e097200693ab56df01c4
parentbbe2b5f899a9c1bd7c99181f8702ec03c60f3028 (diff)
Added QueryHandler for both Pentominos and Pracro. Added source string to all values, and use these to set the prefill value in the macros.
-rw-r--r--server/src/Makefile.am15
-rw-r--r--server/src/database.h1
-rw-r--r--server/src/dbtypes.h1
-rw-r--r--server/src/journal_commit.cc1
-rw-r--r--server/src/luaquerymapper.cc21
-rw-r--r--server/src/queryhandler.h10
-rw-r--r--server/src/queryhandlerpentominos.cc (renamed from server/src/queryhandler.cc)42
-rw-r--r--server/src/queryhandlerpentominos.h54
-rw-r--r--server/src/queryhandlerpracro.cc58
-rw-r--r--server/src/queryhandlerpracro.h54
-rw-r--r--server/src/queryparser.cc1
-rw-r--r--server/src/queryresult.h17
-rw-r--r--server/src/server.cc27
-rw-r--r--server/src/widgetgenerator.cc8
14 files changed, 272 insertions, 38 deletions
diff --git a/server/src/Makefile.am b/server/src/Makefile.am
index a4f2fd7..086905a 100644
--- a/server/src/Makefile.am
+++ b/server/src/Makefile.am
@@ -13,7 +13,8 @@ pracrod_SOURCES = \
configurationparser.cc \
debug.cc \
exception.cc \
- queryhandler.cc \
+ queryhandlerpentominos.cc \
+ queryhandlerpracro.cc \
queryparser.cc \
journal_commit.cc \
log.cc \
@@ -40,6 +41,8 @@ EXTRA_DIST = \
debug.h \
exception.h \
queryhandler.h \
+ queryhandlerpentominos.h \
+ queryhandlerpracro.h \
queryparser.h \
journal_commit.h \
log.h \
@@ -59,7 +62,8 @@ EXTRA_DIST = \
TESTFILES = \
test_formattools \
- test_queryhandler \
+ test_queryhandlerpentominos \
+ test_queryhandlerpracro \
test_queryparser \
test_luaquerymapper \
test_templateparser \
@@ -84,8 +88,11 @@ test_mltokenizer: mltokenizer.cc
test_formattools: formattools.cc luaformatmapper.cc luaformatmapperutils.cc mltokenizer.cc
@../../tools/test formattools.cc luaformatmapper.cc mltokenizer.cc luaformatmapperutils.cc exception.cc log.cc $(LUA_LIBS)
-test_queryhandler: queryhandler.cc
- @../../tools/test queryhandler.cc tcpsocket.cc exception.cc log.cc
+test_queryhandlerpentominos: queryhandlerpentominos.cc
+ @../../tools/test queryhandlerpentominos.cc tcpsocket.cc exception.cc log.cc
+
+test_queryhandlerpracro: queryhandlerpracro.cc
+ @../../tools/test queryhandlerpracro.cc tcpsocket.cc exception.cc log.cc
test_queryparser: queryparser.cc
@../../tools/test queryparser.cc queryhandler.cc tcpsocket.cc exception.cc log.cc saxparser.cc -lexpat
diff --git a/server/src/database.h b/server/src/database.h
index 85d4cc4..a5bed81 100644
--- a/server/src/database.h
+++ b/server/src/database.h
@@ -32,6 +32,7 @@
#include "pracrodao.h"
#include "transaction.h"
#include "template.h"
+
#include "debug.h"
class Database {
diff --git a/server/src/dbtypes.h b/server/src/dbtypes.h
index fc12728..79ac629 100644
--- a/server/src/dbtypes.h
+++ b/server/src/dbtypes.h
@@ -31,6 +31,7 @@ class Value {
public:
Value() : value(""), timestamp(0) {}
std::string value;
+ std::string source;
time_t timestamp;
};
typedef std::map< std::string, Value > Values;
diff --git a/server/src/journal_commit.cc b/server/src/journal_commit.cc
index cb9769e..9800fb7 100644
--- a/server/src/journal_commit.cc
+++ b/server/src/journal_commit.cc
@@ -45,6 +45,7 @@
#include <stdarg.h>
#include <fcntl.h>
#include <time.h>
+#include <errno.h>
static int mwrite(int sock, const char *fmt, ...)
{
diff --git a/server/src/luaquerymapper.cc b/server/src/luaquerymapper.cc
index 9f8293d..6a7282f 100644
--- a/server/src/luaquerymapper.cc
+++ b/server/src/luaquerymapper.cc
@@ -40,6 +40,7 @@ static std::string loadresultstring(QueryResult &res, std::string group = "")
s += group + (*v).first + " = {}\n";
s += group + (*v).first + ".value = \"" + (*v).second + "\"\n";
s += group + (*v).first + ".timestamp = " + timestamp.str() + "\n";
+ s += group + (*v).first + ".source = \"" + res.source + "\"\n";
v++;
}
@@ -75,6 +76,9 @@ void LUAQueryMapper::addQueryResult(QueryResult &result)
{
std::string preload = loadresultstring(result);
+ printf("Preload:\n%s\n", preload.c_str());
+
+
if(luaL_loadbuffer(L, preload.c_str(), preload.size(), "preload")) {
error(lua_tostring(L, lua_gettop(L)));
return;
@@ -103,6 +107,8 @@ Value LUAQueryMapper::map(const std::string &mapper)
return v;
}
+ printf("Mapper: %s\n", mapper.c_str());
+
// Load the mapper
if(luaL_loadbuffer(L, mapper.c_str(), mapper.size(), "mapper")) {
error(lua_tostring(L, lua_gettop(L)) + std::string(" in ") + mapper);
@@ -116,12 +122,23 @@ Value LUAQueryMapper::map(const std::string &mapper)
}
// Check if app messed up the stack.
- if(lua_gettop(L) != clean_top + 2) {
+ if(lua_gettop(L) != clean_top + 3) {
error("Wrong number of return values in " + mapper);
lua_pop(L, lua_gettop(L) - clean_top);
return v;
}
+ // value, timestamp, source
+
+ // Check if the types are right
+ if(lua_isstring(L, lua_gettop(L)) == false) {
+ error("Source is not a string in " + mapper);
+ lua_pop(L, 3);
+ return v;
+ }
+ v.source = lua_tostring(L, lua_gettop(L));
+ lua_pop(L, 1);
+
// Check if the types are right
if(lua_isnumber(L, lua_gettop(L)) == false) {
error("Timestamp is not an integer in " + mapper);
@@ -140,6 +157,8 @@ Value LUAQueryMapper::map(const std::string &mapper)
v.value = lua_tostring(L, lua_gettop(L));
lua_pop(L, 1);
+ printf("Result: value=%s, src=%s, time=%d\n", v.value.c_str(), v.source.c_str(), (int)v.timestamp);
+
return v;
}
diff --git a/server/src/queryhandler.h b/server/src/queryhandler.h
index bb0be8f..e8f2d1b 100644
--- a/server/src/queryhandler.h
+++ b/server/src/queryhandler.h
@@ -27,7 +27,6 @@
#ifndef __PRACRO_QUERYHANDLER_H__
#define __PRACRO_QUERYHANDLER_H__
-#include "tcpsocket.h"
#include "template.h"
#include "queryresult.h"
@@ -39,15 +38,10 @@
*/
class QueryHandler {
public:
- QueryHandler(TCPSocket *socket, std::string cpr);
+ QueryHandler() {}
// Execute all queries.
- // std::string exec();
- QueryResult exec(Query &query);
-
-private:
- TCPSocket *socket;
- std::string cpr;
+ virtual QueryResult exec(Query &query) { return QueryResult(); }
};
#endif/*__PRACRO_QUERYHANDLER_H__*/
diff --git a/server/src/queryhandler.cc b/server/src/queryhandlerpentominos.cc
index 7077ab8..4b98768 100644
--- a/server/src/queryhandler.cc
+++ b/server/src/queryhandlerpentominos.cc
@@ -1,9 +1,9 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/***************************************************************************
- * queryhandler.cc
+ * queryhandlerpentominos.cc
*
- * Tue May 6 14:50:56 CEST 2008
- * Copyright 2008 Bent Bisballe Nyeng
+ * Thu Jan 15 11:35:31 CET 2009
+ * Copyright 2009 Bent Bisballe Nyeng
* deva@aasimon.org
****************************************************************************/
@@ -24,9 +24,7 @@
* along with Pracro; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-#include "debug.h"
-
-#include "queryhandler.h"
+#include "queryhandlerpentominos.h"
#include <config.h>
@@ -136,13 +134,14 @@ static std::string getUID(const char *interface)
}
-QueryHandler::QueryHandler(TCPSocket *socket, std::string cpr)
+QueryHandlerPentominos::QueryHandlerPentominos(TCPSocket *socket, std::string cpr)
+ : QueryHandler()
{
this->cpr = cpr;
this->socket = socket;
}
-QueryResult QueryHandler::exec(Query &query)
+QueryResult QueryHandlerPentominos::exec(Query &query)
{
time_t timestamp = time(NULL);
std::string uid = getUID("eth0");
@@ -158,7 +157,9 @@ QueryResult QueryHandler::exec(Query &query)
socket->write(header, strlen(header));
#endif/*WITHOUT_PENTOMINOS*/
- PRACRO_DEBUG(pentominos, header);
+#ifdef WITH_DEBUG
+ printf(header);
+#endif/*WITH_DEBUG*/
sprintf(buf, " <pentominos:entry cpr=\"%s\"\n"
" src_addr=\"%s\"\n"
@@ -179,7 +180,9 @@ QueryResult QueryHandler::exec(Query &query)
socket->write(buf, strlen(buf));
#endif/*WITHOUT_PENTOMINOS*/
- PRACRO_DEBUG(pentominos, buf);
+#ifdef WITH_DEBUG
+ printf(buf);
+#endif/*WITH_DEBUG*/
sprintf(buf, " <pentominos:query format=\"pracroxml\"\n"
" device_id=\"%s\"\n"
@@ -193,7 +196,9 @@ QueryResult QueryHandler::exec(Query &query)
socket->write(buf, strlen(buf));
#endif/*WITHOUT_PENTOMINOS*/
- PRACRO_DEBUG(pentominos, buf);
+#ifdef WITH_DEBUG
+ printf(buf);
+#endif/*WITH_DEBUG*/
sprintf(buf, "</artefact>");
@@ -201,10 +206,13 @@ QueryResult QueryHandler::exec(Query &query)
socket->write(buf, strlen(buf));
#endif/*WITHOUT_PENTOMINOS*/
- PRACRO_DEBUG(pentominos, buf);
+#ifdef WITH_DEBUG
+ printf(buf);
+ fflush(stdout);
+#endif/*WITH_DEBUG*/
QueryResult result;
-
+
#ifndef WITHOUT_PENTOMINOS
QueryParser parser;
@@ -219,7 +227,9 @@ QueryResult QueryHandler::exec(Query &query)
result = parser.result;
#endif/*WITHOUT_PENTOMINOS*/
- PRACRO_DEBUG(pentominos, "Done handling query\n");
+ printf("Done handling query\n");
+
+ result.print();
return result;
}
@@ -231,7 +241,7 @@ int main()
TCPSocket s;
s.connect("localhost", 11108);
- QueryHandler qh(&s, "2003791613");
+ QueryHandlerPentominos qh(&s, "2003791613");
Query q1;
q1.attributes["device_id"] = "lensmeter";
@@ -240,8 +250,6 @@ int main()
std::string res = qh.exec();
- printf("%s\n", res.c_str());
-
return 0;
}
diff --git a/server/src/queryhandlerpentominos.h b/server/src/queryhandlerpentominos.h
new file mode 100644
index 0000000..3d98b25
--- /dev/null
+++ b/server/src/queryhandlerpentominos.h
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * queryhandlerpentominos.h
+ *
+ * Thu Jan 15 11:35:31 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_QUERYHANDLERPENTOMINOS_H__
+#define __PRACRO_QUERYHANDLERPENTOMINOS_H__
+
+#include "queryhandler.h"
+
+#include "tcpsocket.h"
+#include "template.h"
+#include "queryresult.h"
+
+#include <vector>
+#include <string>
+
+/**
+ * This class handles the query of external data.
+ */
+class QueryHandlerPentominos : public QueryHandler {
+public:
+ QueryHandlerPentominos(TCPSocket *socket, std::string cpr);
+
+ // Execute all queries.
+ QueryResult exec(Query &query);
+
+private:
+ TCPSocket *socket;
+ std::string cpr;
+};
+
+#endif/*__PRACRO_QUERYHANDLERPENTOMINOS_H__*/
diff --git a/server/src/queryhandlerpracro.cc b/server/src/queryhandlerpracro.cc
new file mode 100644
index 0000000..99c31b3
--- /dev/null
+++ b/server/src/queryhandlerpracro.cc
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * queryhandlerpracro.cc
+ *
+ * Thu Jan 15 11:35:34 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 "queryhandlerpracro.h"
+
+QueryHandlerPracro::QueryHandlerPracro(Database *db, std::string cpr)
+{
+ this->cpr = cpr;
+ this->db = db;
+}
+
+QueryResult QueryHandlerPracro::exec(Query &query)
+{
+ QueryResult result;
+
+ std::string field = query.attributes["class"];
+ Fieldnames fields;
+ fields.push_back(field);
+
+ std::string ttl = query.attributes["ttl"];
+ time_t oldest = time(NULL) - atoi(ttl.c_str());
+
+ Values values = db->getValues(cpr, fields, oldest);
+
+ std::string value = values[field].value;
+ time_t timestamp = values[field].timestamp;
+
+ result.timestamp = timestamp;
+ result.values[field] = value;
+ result.source = "pracro";
+
+ printf("QHP: %s => %s (%lu)\n", field.c_str(), value.c_str(), timestamp);
+
+ return result;
+}
diff --git a/server/src/queryhandlerpracro.h b/server/src/queryhandlerpracro.h
new file mode 100644
index 0000000..8852868
--- /dev/null
+++ b/server/src/queryhandlerpracro.h
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * queryhandlerpracro.h
+ *
+ * Thu Jan 15 11:35:34 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_QUERYHANDLERPRACRO_H__
+#define __PRACRO_QUERYHANDLERPRACRO_H__
+
+#include "queryhandler.h"
+
+#include "database.h"
+#include "template.h"
+#include "queryresult.h"
+
+#include <vector>
+#include <string>
+
+/**
+ * This class handles the query of pracro data.
+ */
+class QueryHandlerPracro : public QueryHandler {
+public:
+ QueryHandlerPracro(Database *db, std::string cpr);
+
+ // Execute all queries.
+ QueryResult exec(Query &query);
+
+private:
+ Database *db;
+ std::string cpr;
+};
+
+#endif/*__PRACRO_QUERYHANDLERPRACRO_H__*/
diff --git a/server/src/queryparser.cc b/server/src/queryparser.cc
index abb41b5..287f71c 100644
--- a/server/src/queryparser.cc
+++ b/server/src/queryparser.cc
@@ -45,6 +45,7 @@ void QueryParser::startTag(std::string name, std::map< std::string, std::string>
this->timestamp = atol(attributes["timestamp"].c_str());
QueryResult q;
+ q.source = "pentominos";
q.timestamp = this->timestamp;
stack.back()->groups[attributes["class"]] = q;
stack.push_back(&stack.back()->groups[attributes["class"]]);
diff --git a/server/src/queryresult.h b/server/src/queryresult.h
index 617d957..649f975 100644
--- a/server/src/queryresult.h
+++ b/server/src/queryresult.h
@@ -34,8 +34,25 @@
class QueryResult {
public:
time_t timestamp;
+ std::string source;
std::map< std::string, std::string > values;
std::map< std::string, QueryResult > groups;
+
+ void print(std::string tabs = "") {
+ printf("%sTimestamp: %d\n", tabs.c_str(), (int)timestamp);
+ printf("%sSource: %s\n", tabs.c_str(), source.c_str());
+ printf("%sValues:\n", tabs.c_str());
+ for(std::map< std::string, std::string >::iterator i = values.begin(); i != values.end(); i++) {
+ printf("%s[%s] => [%s]\n", tabs.c_str(), i->first.c_str(), i->second.c_str());
+ }
+ printf("%s{\n", tabs.c_str());
+ for(std::map< std::string, QueryResult >::iterator i = groups.begin(); i != groups.end(); i++) {
+ printf("%s[%s] =>:\n", tabs.c_str(), i->first.c_str());
+ i->second.print(tabs +" ");
+ }
+ printf("%s}\n", tabs.c_str());
+
+ }
};
#endif/*__PRACRO_QUERYRESULT_H__*/
diff --git a/server/src/server.cc b/server/src/server.cc
index b49f5b2..1ea2020 100644
--- a/server/src/server.cc
+++ b/server/src/server.cc
@@ -41,7 +41,11 @@
#include "transactionparser.h"
#include "templateparser.h"
#include "macroparser.h"
+
#include "queryhandler.h"
+#include "queryhandlerpracro.h"
+#include "queryhandlerpentominos.h"
+
#include "queryparser.h"
#include "luaquerymapper.h"
#include "database.h"
@@ -179,12 +183,25 @@ static std::string handleTransaction(Transaction *transaction,
////////////////////////
std::vector< Query >::iterator qi = m->queries.begin();
while(qi != m->queries.end()) {
- ///////////////////////////////
- // Send the queries to Pentominos (if any)
- QueryHandler qh(pentominos_socket, transaction->cpr);
- QueryResult queryresult = qh.exec(*qi);
- lqm.addQueryResult(queryresult);
+ 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++;
}
diff --git a/server/src/widgetgenerator.cc b/server/src/widgetgenerator.cc
index 2e51b32..90d2b9e 100644
--- a/server/src/widgetgenerator.cc
+++ b/server/src/widgetgenerator.cc
@@ -40,20 +40,22 @@ static std::string automap(std::string name)
if(name[i] == '.') groupcheck += " and " + group;
else groupcheck += name[i];
}
- groupcheck += " and " + name + ".value and " + name + ".timestamp";
+ groupcheck += " and " + name + ".value and " + name + ".timestamp and " + name + ".source";
groupcheck += ")\n";
std::string automapstring =
"-- Returning 0, 0 invalidates the result\n"
"value = 0\n"
"timestamp = 0\n"
+ "source = 0\n"
"\n"
+ groupcheck +
"then\n"
" value = " + name + ".value\n"
" timestamp = " + name + ".timestamp\n"
+ " source = " + name + ".source\n"
"end\n"
- "return value, timestamp\n";
+ "return value, timestamp, source\n";
PRACRO_DEBUG(widget, "Automap:\n%s\n", automapstring.c_str());
@@ -99,7 +101,7 @@ static std::string send_macro_widget(Macro &macro,
if(value.timestamp > time(NULL) - Conf::pentominos_max_ttl) {
widget.attributes["value"] = xml_encode(value.value);
timestamp = value.timestamp;
- prefilled = "pentominos";
+ prefilled = xml_encode(value.source);
}
}
// widget.attributes.erase(widget.attributes.find("map"));