diff options
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/widgetgenerator.cc | 136 | ||||
-rw-r--r-- | server/src/widgetvalue.cc | 354 | ||||
-rw-r--r-- | server/src/widgetvalue.h | 41 |
3 files changed, 414 insertions, 117 deletions
diff --git a/server/src/widgetgenerator.cc b/server/src/widgetgenerator.cc index 425c71e..f257228 100644 --- a/server/src/widgetgenerator.cc +++ b/server/src/widgetgenerator.cc @@ -24,131 +24,33 @@ * 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 "widgetgenerator.h" -#include "configuration.h" -#include "xml_encode_decode.h" - -static std::string automap(std::string name) -{ - std::string group; - std::string groupcheck = "if("; - - for(size_t i = 0; i < name.length(); i++) { - group += name[i]; - if(name[i] == '.') groupcheck += " and " + group; - else groupcheck += name[i]; - } - 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, source\n"; +#include "widgetvalue.h" - PRACRO_DEBUG(widget, "Automap:\n%s\n", automapstring.c_str()); - - return automapstring; -} +#include "xml_encode_decode.h" -static std::string send_macro_widget(Macro ¯o, - Widget &widget, - std::string tabs, - LUAQueryMapper &mapper, - Values &values) +static std::string getWidgetString(Macro ¯o, + Widget &widget, + std::string tabs, + LUAQueryMapper &mapper, + Values &values) { std::string result; - std::string prefilled; - time_t timestamp = 0; - time_t now = time(NULL); - result = tabs + "<" + widget.attributes["tagname"]; - std::map< std::string, std::string >::iterator p = widget.attributes.begin(); + attr_t::iterator p = widget.attributes.begin(); - PRACRO_DEBUG(prefill, "%s: %s\n", + PRACRO_DEBUG(prefill, "TAG: %s - NAME: %s\n", widget.attributes["tagname"].c_str(), widget.attributes["name"].c_str()); - PRACRO_DEBUG(prefill, "0: (%s, %s, %d)\n", - prefilled.c_str(), - widget.attributes["value"].c_str(), - (int)timestamp); - - // Check if the field has a map, and fill in the value if it has... - if(widget.attributes.find("map") != widget.attributes.end()) { - std::string luamap; - - std::vector< Map >::iterator li = macro.maps.begin(); - while(li != macro.maps.end()) { - Map &map = *li; - if(map.attributes["name"] == widget.attributes["map"]) { - luamap = map.attributes["lua"]; - } - li++; - } - - // Check to see if we should automap - if(luamap == "") { - luamap = automap(widget.attributes["map"]); - } - - // printf("LUAMAP: %s\n", luamap.c_str()); fflush(stdout); - - if(luamap != "") { - Value value = mapper.map(luamap); - if(value.timestamp > now - Conf::pentominos_max_ttl) { - widget.attributes["value"] = value.value; - timestamp = value.timestamp; - prefilled = value.source; - } - - PRACRO_DEBUG(prefill, "map: (%s, %d)\n", - value.value.c_str(), - (int)value.timestamp); - - } - - // widget.attributes.erase(widget.attributes.find("map")); + Value value; + if(getValue(value, widget.attributes, macro.maps, mapper, values)) { + widget.attributes["value"] = value.value; + if(value.source != "") widget.attributes["prefilled"] = value.source; } - PRACRO_DEBUG(prefill, "1: (%s, %s, %d)\n", - prefilled.c_str(), - widget.attributes["value"].c_str(), - (int)timestamp); - - // Check if there is a previously stored value in the db... - if(values.find(widget.attributes["name"]) != values.end()) { - - PRACRO_DEBUG(prefill, "db: (%s, %d)\n", - values[widget.attributes["name"]].value.c_str(), - (int)values[widget.attributes["name"]].timestamp); - - if(values[widget.attributes["name"]].timestamp > timestamp) { - if(values[widget.attributes["name"]].timestamp > now - Conf::db_max_ttl) { - widget.attributes["value"] = values[widget.attributes["name"]].value; - timestamp = values[widget.attributes["name"]].timestamp; - prefilled = "pracro"; - } - } - } - - PRACRO_DEBUG(prefill, "2: (%s, %s, %d)\n", - prefilled.c_str(), - widget.attributes["value"].c_str(), - (int)timestamp); - while(p != widget.attributes.end()) { if(p->first != "tagname" && p->first != "map") { if( ! (p->first == "name" && p->second == "") ) @@ -157,8 +59,6 @@ static std::string send_macro_widget(Macro ¯o, p++; } - if(prefilled != "") result += " prefilled=\"" + prefilled + "\""; - if(widget.widgets.size() == 0) { // If node is empty, use short tag form result += "/>\n"; return result; @@ -168,7 +68,7 @@ static std::string send_macro_widget(Macro ¯o, std::vector< Widget >::iterator w = widget.widgets.begin(); while(w != widget.widgets.end()) { - result += send_macro_widget(macro, *w, tabs + " ", mapper, values); + result += getWidgetString(macro, *w, tabs + " ", mapper, values); w++; } result += tabs + "</" + widget.attributes["tagname"] + ">\n"; @@ -179,7 +79,8 @@ static std::string send_macro_widget(Macro ¯o, static void get_fields(Widget &widget, Fieldnames &fields) { if(widget.attributes.find("value") != widget.attributes.end()) { - if(widget.attributes["name"] != "") fields.push_back(widget.attributes["name"]); + if(widget.attributes["name"] != "") + fields.push_back(widget.attributes["name"]); } std::vector< Widget >::iterator w = widget.widgets.begin(); @@ -189,14 +90,15 @@ static void get_fields(Widget &widget, Fieldnames &fields) } } -std::string widgetgenerator(std::string cpr, Macro ¯o, LUAQueryMapper &mapper, Database &db) +std::string widgetgenerator(std::string cpr, Macro ¯o, + LUAQueryMapper &mapper, Database &db) { Fieldnames fields; get_fields(macro.widgets, fields); Values values = db.getValues(cpr, fields); - return send_macro_widget(macro, macro.widgets, " ", mapper, values); + return getWidgetString(macro, macro.widgets, " ", mapper, values); } #ifdef TEST_WIDGETGENERATOR diff --git a/server/src/widgetvalue.cc b/server/src/widgetvalue.cc new file mode 100644 index 0000000..ddb0e9c --- /dev/null +++ b/server/src/widgetvalue.cc @@ -0,0 +1,354 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * widgetvalue.cc + * + * Fri Jul 2 11:40:12 CEST 2010 + * Copyright 2010 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 "widgetvalue.h" + +#include "debug.h" +#include "configuration.h" + +static bool getMapValue(Value &value, + maps_t &maps, + std::string map, + LUAQueryMapper &mapper) +{ + std::string luamap; + + maps_t::iterator li = maps.begin(); + while(li != maps.end()) { + Map &_map = *li; + if(_map.attributes["name"] == map) { + luamap = _map.attributes["lua"]; + } + li++; + } + + // Check to see if we should automap + if(luamap == "") { + luamap = mapper.automap(map); + } + + // printf("LUAMAP: %s\n", luamap.c_str()); fflush(stdout); + + if(luamap != "") { + value = mapper.map(luamap); + + // Value too old? + if(value.timestamp < time(NULL) - Conf::pentominos_max_ttl) return false; + + PRACRO_DEBUG(prefill, "map: (%s, %d)\n", + value.value.c_str(), + (int)value.timestamp); + + } + + return true; +} + +static bool getDBValue(Value &value, + attr_t &attr, + Values &values) +{ + if(attr.find("name") == attr.end()) return false; + + // Check if there is a previously stored value in the db... + if(values.find(attr["name"]) == values.end()) return false; + + value = values[attr["name"]]; + + // Value too old? + if(value.timestamp < time(NULL) - Conf::db_max_ttl) return false; + + value.source = "pracro"; + + return true; +} + +bool getValue(Value &value, + attr_t &attr, + maps_t &maps, + LUAQueryMapper &mapper, + Values &values) +{ + std::map<time_t, Value> prio; + + // Value of value-tag. + if(attr.find("value") != attr.end()) { + Value v; + v.timestamp = 0; + v.source = ""; + v.value = attr["value"]; + prio[v.timestamp] = v; + } + + // Value from query map + if(attr.find("map") != attr.end()) { + Value v; + if(getMapValue(v, maps, attr["map"], mapper)) { + prio[v.timestamp] = v; + } + } + + // Value from database + { + Value v; + if(getDBValue(v, attr, values)) { + prio[v.timestamp] = v; + } + } + + if(prio.size() != 0) { + value = prio.rbegin()->second; + } + + std::map<time_t, Value>::iterator i = prio.begin(); + while(i != prio.end()) { + PRACRO_DEBUG(prefill, "% 11ld - \"%s\" (src: '%s')\n", + i->second.timestamp, + i->second.value.c_str(), + i->second.source.c_str()); + i++; + } + + return prio.size() != 0; +} + + +#ifdef TEST_WIDGETVALUE +//deps: debug.cc exception.cc log.cc configuration.cc luaquerymapper.cc +//cflags: -I.. $(LUA_CXXFLAGS) +//libs: $(LUA_LIBS) +#include "test.h" + +TEST_BEGIN; + +pracro_debug_init(); +pracro_debug_parse("+all"); + +time_t now = time(NULL); + +{ + Value value; + attr_t attr; + maps_t maps; + LUAQueryMapper mapper; + Values values; + TEST_FALSE(getValue(value, attr, maps, mapper, values), "Empty values"); +} + +{ + Value value; + attr_t attr; + attr["value"] = "hello"; + maps_t maps; + LUAQueryMapper mapper; + Values values; + TEST_TRUE(getValue(value, attr, maps, mapper, values), "Got value?"); + TEST_EQUAL_STR(attr["value"], value.value, "Got the right value?"); + TEST_EQUAL_INT(value.timestamp, 0, "Got the right timestamp?"); + TEST_EQUAL_STR(value.source, "", "Got the right source?"); +} + +{ + Conf::db_max_ttl = 1000; + + Value value; + + attr_t attr; + attr["name"] = "foo"; + attr["value"] = "hello"; + + maps_t maps; + LUAQueryMapper mapper; + + Values values; + Value v; + v.value = "world"; + v.source = "pracro"; + v.timestamp = now - (Conf::db_max_ttl * 2); + values["foo"] = v; + + TEST_TRUE(getValue(value, attr, maps, mapper, values), "Got value?"); + TEST_EQUAL_STR(attr["value"], value.value, "Got the right value?"); + TEST_EQUAL_INT(value.timestamp, 0, "Got the right timestamp?"); + TEST_EQUAL_STR(value.source, "", "Got the right source?"); +} + +{ + Conf::db_max_ttl = 1000; + + Value value; + + attr_t attr; + attr["name"] = "foo"; + attr["value"] = "hello"; + + maps_t maps; + LUAQueryMapper mapper; + + Values values; + Value v; + v.value = "world"; + v.source = "pracro"; + v.timestamp = now; + values["foo"] = v; + + TEST_TRUE(getValue(value, attr, maps, mapper, values), "Got value?"); + TEST_EQUAL_STR(v.value, value.value, "Got the right value?"); + TEST_EQUAL_INT(value.timestamp, v.timestamp, "Got the right timestamp?"); + TEST_EQUAL_STR(value.source, v.source, "Got the right source?"); +} + +{ + Conf::db_max_ttl = 1000; + Conf::pentominos_max_ttl = 500; + + Value value; + + attr_t attr; + attr["name"] = "foo"; + attr["value"] = "hello"; + attr["map"] = "bar"; + + maps_t maps; + Map m; + char tbuf[32]; sprintf(tbuf, "%ld", now); + std::string val = "le valu"; + m.attributes["name"] = "bar"; + m.attributes["lua"] = "return '"+val+"', "+tbuf+", 'artefact'"; + maps.push_back(m); + LUAQueryMapper mapper; + + Values values; + + TEST_TRUE(getValue(value, attr, maps, mapper, values), "Got value?"); + TEST_EQUAL_STR(value.value, val, "Got the right value?"); + TEST_EQUAL_INT(value.timestamp, now, "Got the right timestamp?"); + TEST_EQUAL_STR(value.source, "artefact", "Got the right source?"); +} + +{ + Conf::db_max_ttl = 1000; + Conf::pentominos_max_ttl = 500; + + Value value; + + attr_t attr; + attr["name"] = "foo"; + attr["value"] = "hello"; + attr["map"] = "bar"; + + maps_t maps; + Map m; + char tbuf[32]; sprintf(tbuf, "%ld", now - (Conf::pentominos_max_ttl * 2)); + std::string val = "le valu"; + m.attributes["name"] = "bar"; + m.attributes["lua"] = "return '"+val+"', "+tbuf+", 'artefact'"; + maps.push_back(m); + LUAQueryMapper mapper; + + Values values; + Value v; + v.value = "world"; + v.source = "pracro"; + v.timestamp = now; + values["foo"] = v; + + TEST_TRUE(getValue(value, attr, maps, mapper, values), "Got value?"); + TEST_EQUAL_STR(v.value, value.value, "Got the right value?"); + TEST_EQUAL_INT(value.timestamp, v.timestamp, "Got the right timestamp?"); + TEST_EQUAL_STR(value.source, v.source, "Got the right source?"); +} + +{ + Conf::db_max_ttl = 1000; + Conf::pentominos_max_ttl = 500; + + Value value; + + attr_t attr; + attr["name"] = "foo"; + attr["value"] = "hello"; + attr["map"] = "bar"; + + maps_t maps; + Map m; + char tbuf[32]; sprintf(tbuf, "%ld", now); + std::string val = "le valu"; + m.attributes["name"] = "bar"; + m.attributes["lua"] = "return '"+val+"', "+tbuf+", 'artefact'"; + maps.push_back(m); + LUAQueryMapper mapper; + + Values values; + Value v; + v.value = "world"; + v.source = "pracro"; + v.timestamp = now - 1; + values["foo"] = v; + + TEST_TRUE(getValue(value, attr, maps, mapper, values), "Got value?"); + TEST_EQUAL_STR(value.value, val, "Got the right value?"); + TEST_EQUAL_INT(value.timestamp, now, "Got the right timestamp?"); + TEST_EQUAL_STR(value.source, "artefact", "Got the right source?"); +} + +{ + Conf::db_max_ttl = 1000; + Conf::pentominos_max_ttl = 500; + + Value value; + + attr_t attr; + attr["name"] = "foo"; + attr["value"] = "hello"; + attr["map"] = "bar"; + + maps_t maps; + Map m; + char tbuf[32]; sprintf(tbuf, "%ld", now - 1); + std::string val = "le valu"; + m.attributes["name"] = "bar"; + m.attributes["lua"] = "return '"+val+"', "+tbuf+", 'artefact'"; + maps.push_back(m); + LUAQueryMapper mapper; + + Values values; + Value v; + v.value = "world"; + v.source = "pracro"; + v.timestamp = now ; + values["foo"] = v; + + TEST_TRUE(getValue(value, attr, maps, mapper, values), "Got value?"); + TEST_EQUAL_STR(value.value, v.value, "Got the right value?"); + TEST_EQUAL_INT(value.timestamp, v.timestamp, "Got the right timestamp?"); + TEST_EQUAL_STR(value.source, v.source, "Got the right source?"); +} + +TEST_END; + +#endif/*TEST_WIDGETVALUE*/ diff --git a/server/src/widgetvalue.h b/server/src/widgetvalue.h new file mode 100644 index 0000000..eb5e9a6 --- /dev/null +++ b/server/src/widgetvalue.h @@ -0,0 +1,41 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * widgetvalue.h + * + * Fri Jul 2 11:40:12 CEST 2010 + * Copyright 2010 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_WIDGETVALUE_H__ +#define __PRACRO_WIDGETVALUE_H__ + +#include "template.h" +#include "dbtypes.h" +#include "luaquerymapper.h" + +bool getValue(Value &value, + attr_t &attr, + maps_t &maps, + LUAQueryMapper &mapper, + Values &values); + +#endif/*__PRACRO_WIDGETVALUE_H__*/ |