diff options
Diffstat (limited to 'server/src')
34 files changed, 529 insertions, 178 deletions
| diff --git a/server/src/Makefile.am b/server/src/Makefile.am index ccbc63b..2697fed 100644 --- a/server/src/Makefile.am +++ b/server/src/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = macrotool +SUBDIRS =  bin_PROGRAMS = pracrod @@ -34,6 +34,7 @@ pracrod_SOURCES = \  	journal.cc \  	journal_uploadserver.cc \  	log.cc \ +	luapraxisd.cc \  	luaquerymapper.cc \  	luaresume.cc \  	luautil.cc \ @@ -92,6 +93,7 @@ EXTRA_DIST = \  	journal.h \  	journal_uploadserver.h \  	log.h \ +	luapraxisd.h \  	luaquerymapper.h \  	luaresume.h \  	luautil.h \ diff --git a/server/src/database.h b/server/src/database.h index 8876ae7..27169fe 100644 --- a/server/src/database.h +++ b/server/src/database.h @@ -67,7 +67,7 @@ public:      mutex.lock();      DEBUG(db, "%s, %s, %s,...\n",            transaction.user.c_str(), transaction.cpr.c_str(), -          macro.attributes["name"].c_str()); +          macro.name.c_str());      dao->commitTransaction(sessionid, transaction, commit, macro, now);      mutex.unlock();    } @@ -76,7 +76,7 @@ public:    Values getValues(std::string patientid,                     Fieldnames &fieldnames,                     std::string sessionid, -                   time_t oldest = 0) +                   time_t oldest)    {      if(!dao) return Values();      mutex.lock(); @@ -92,7 +92,7 @@ public:    bool checkMacro(std::string patientid,                    std::string macro,                    std::string sessionid, -                  time_t oldest = 0) +                  time_t oldest)    {      DEBUG(db, "%s, %s, %ld\n",            patientid.c_str(), macro.c_str(), oldest); @@ -108,7 +108,7 @@ public:                          time_t oldest, std::string sessionid)    {      DEBUG(db, "%s, %s, %ld\n", -          patientid.c_str(), macro.attributes["name"].c_str(), oldest); +          patientid.c_str(), macro.name.c_str(), oldest);      if(!dao) return "";      Fieldnames fn;      fn.push_back("journal.resume"); diff --git a/server/src/fieldnamescanner.cc b/server/src/fieldnamescanner.cc index 585657b..5418bb4 100644 --- a/server/src/fieldnamescanner.cc +++ b/server/src/fieldnamescanner.cc @@ -81,7 +81,7 @@ templates_t scanfieldnames(std::set<std::string> &filter)        std::vector<Macro>::iterator ms = t->macros.begin();        while(ms != t->macros.end()) {          if(ms->isHeader == false) { -          std::string macro = ms->attributes["name"]; +          std::string macro = ms->name;            DEBUG(scanner, "Name '%s'\n", macro.c_str());            std::string macrofile = macrolist.getLatestVersion(macro);            DEBUG(scanner, "File '%s'\n", macrofile.c_str()); diff --git a/server/src/journal.cc b/server/src/journal.cc index b9f5c82..c38246f 100644 --- a/server/src/journal.cc +++ b/server/src/journal.cc @@ -38,19 +38,19 @@ void Journal::addEntry(Transaction &transaction, Commit &commit,    std::vector< Macro >::iterator i = templ->macros.begin();    while(i != templ->macros.end()) {      Macro &m = *i; -    if(commit.macro == m.attributes["name"]) break; +    if(commit.macro == m.name) break;      index++;      i++;    }    if(index >= templ->macros.size()) {      ERR(journal, "Could not find macro %s in template %s\n", -        commit.macro.c_str(), templ->attributes["name"].c_str()); +        commit.macro.c_str(), templ->name.c_str());      //      return;    } else {      DEBUG(journal, "Found macro %s as index %u in template %s\n",            commit.macro.c_str(), index, -          templ->attributes["name"].c_str()); +          templ->name.c_str());    }    if(entrylist.size() == 0) { @@ -59,7 +59,7 @@ void Journal::addEntry(Transaction &transaction, Commit &commit,    }    DEBUG(journal, "addEntry: template(%s)\n", -        templ->attributes["name"].c_str()); +        templ->name.c_str());    // Test if the username or the cpr has changed...     // if so, commit and clear the list. diff --git a/server/src/luapraxisd.cc b/server/src/luapraxisd.cc new file mode 100644 index 0000000..6025aa5 --- /dev/null +++ b/server/src/luapraxisd.cc @@ -0,0 +1,241 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + *            luapraxisd.cc + * + *  Wed Apr 27 11:59:53 CEST 2011 + *  Copyright 2011 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 "luapraxisd.h" + +#include "praxisd.h" + +#include <lauxlib.h> +#include <strings.h> + +#include "debug.h" + +#define luaL_checkbool(L, i) \ +  (lua_isboolean(L,i) ? lua_toboolean(L,i) : luaL_checkint(L,i)) + +typedef struct px_userdata { +  Praxisd *px; +} px_userdata; + +static int px_addcave(lua_State *L) +{ +  px_userdata *pxu; +  pxu = (px_userdata *)luaL_checkudata(L, 1, "Praxisd"); +  luaL_argcheck(L, pxu, 1, "Praxisd expected"); + +  const char *cpr = luaL_checkstring(L, 2); +  const char *cave = luaL_checkstring(L, 3); + +  std::string sogeord; +  std::string sogetxt; + +  std::vector<Praxisd::cave_t> cavelist = pxu->px->diverse_get_cave(""); +  std::vector<Praxisd::cave_t>::iterator i = cavelist.begin(); +  while(i != cavelist.end()) { +    Praxisd::cave_t &c = *i; +    if(strcasecmp(cave, c.cave.c_str()) == 0) { +      pxu->px->add_sogeord(cpr, c.sogenr, ""); +      return 0; +    } +    i++; +  } + +  pxu->px->add_sogeord(cpr, "CA0003", cave); // CA0003 == 'ANDET' + +  return 0; +} + +static int px_getcave(lua_State *L) +{ +  px_userdata *pxu; +  pxu = (px_userdata *)luaL_checkudata(L, 1, "Praxisd"); +  luaL_argcheck(L, pxu, 1, "Praxisd expected"); + +  const char *cpr = luaL_checkstring(L, 2); + +  std::vector<Praxisd::cave_t> cavelist; + +  Praxisd::patient_t pat = pxu->px->patient_get_by_cpr(cpr); +  std::vector<Praxisd::sogeord_t>::iterator i = pat.sogeord.begin(); +  while(i != pat.sogeord.end()) { +    Praxisd::sogeord_t &s = *i; +    if(s.sogenr[0] == 'C') { +      std::string csogenr = s.sogenr.substr(1, s.sogenr.length() - 1); +      std::vector<Praxisd::cave_t> cl = pxu->px->diverse_get_cave(csogenr); +      if(cl.size() == 1) { +        if(cl[0].cave == "ANDET") cl[0].cave = s.sogetxt; +        cavelist.push_back(cl[0]); +      } +    } + +    i++; +  } + +  lua_createtable(L, 0, cavelist.size()); +  int top = lua_gettop(L); + +  for(size_t i = 0; i < cavelist.size(); i++) { +    lua_pushstring(L, cavelist[i].cave.c_str()); +    lua_rawseti(L, top, i); +  } + +  return 1; +} + +static int px_cavelist(lua_State *L) +{ +  px_userdata *pxu; +  pxu = (px_userdata *)luaL_checkudata(L, 1, "Praxisd"); +  luaL_argcheck(L, pxu, 1, "Praxisd expected"); + +  const char *sogenr = luaL_checkstring(L, 2); + +  std::vector<Praxisd::cave_t> cavelist = pxu->px->diverse_get_cave(sogenr); + +  lua_createtable(L, 0, cavelist.size()); +  int top = lua_gettop(L); + +  for(size_t i = 0; i < cavelist.size(); i++) { +    lua_pushstring(L, cavelist[i].cave.c_str()); +    lua_rawseti(L, top, i); +  } + +  return 1; +} + +static int px_new(lua_State *L) +{ +  const char *host = luaL_checkstring(L, 1); +  int port = luaL_checknumber(L, 2); + +  px_userdata *pxu; +  pxu = (px_userdata *)lua_newuserdata(L, sizeof(px_userdata)); + +  luaL_getmetatable(L, "Praxisd"); +  lua_setmetatable(L, -2); + +  pxu->px = new Praxisd(host, port); + +  return 1; +} + +static int px_gc(lua_State *L) +{ +  px_userdata *pxu; + +  pxu = (px_userdata *)luaL_checkudata(L, 1, "Praxisd"); +  luaL_argcheck(L, pxu, 1, "Praxisd expected"); + +  delete pxu->px; + +  return 0; +} + +static const struct luaL_Reg px_meths[] = { +  {"__gc" ,px_gc}, +  {"cavelist", px_cavelist}, +  {"getcave", px_getcave}, +  {"addcave", px_addcave}, +  {NULL, NULL} +}; + +static const struct luaL_reg px_funcs[] = { +  {"new", px_new}, +  {NULL, NULL} +}; + +void register_praxisd(lua_State *L) +{ +  luaL_newmetatable(L, "Praxisd"); +  lua_pushliteral(L, "__index"); +  lua_pushvalue(L, -2); +  lua_rawset(L, -3); +  luaL_register(L, NULL, px_meths); +  luaL_openlib (L, "Praxisd", px_funcs, 0); +} + +#ifdef TEST_LUAPRAXISD +//deps: praxisd.cc debug.cc saxparser.cc log.cc +//cflags: -I.. $(LUA_CFLAGS) $(CURL_CFLAGS) $(EXPAT_CFLAGS) +//libs: $(LUA_LIBS) $(CURL_LIBS) $(EXPAT_LIBS) +#include "test.h" + +TEST_BEGIN; + +lua_State *L = luaL_newstate(); +if(L == NULL) { +  ERR(luaresume, "Could not create LUA state.\n"); +} + +luaL_openlibs(L);                + +register_praxisd(L); + +///// +std::string program = +  "px = Praxisd.new('localhost', 10000)\n" +  "cl = px:cavelist('')\n" +  "for i=1,#cl do\n" +  "  print(cl[i])\n" +  "end\n" +  "\n" +  "--pcl = px:addcave('1505050505', 'LUMIGAN')\n" +  "\n" +  "pcl = px:addcave('1505050505', os.date('%H%M%S'))\n" +  "\n" +  "pcl = px:getcave('1505050505')\n" +  "for i=1,#pcl do\n" +  "  print('p: ' .. pcl[i])\n" +  "end\n" +  ; + +//int top = lua_gettop(L); + +if(luaL_loadbuffer(L, program.c_str(), program.size(), "luapraxisd test")) { +  ERR(luaresume, "loadbufer: %s\n", lua_tostring(L, lua_gettop(L))); +} + +if(lua_pcall(L, 0, LUA_MULTRET, 0)) { +  ERR(luaresume, "pcall: %s\n" , lua_tostring(L, lua_gettop(L))); +} +/* +if(top != lua_gettop(L) - 1) { +  ERR(luaresume, "Program did not return a single value.\n"); +} + +if(lua_isstring(L, lua_gettop(L)) == false) { +  ERR(luaresume, "Program did not return a string value.\n"); +} + +std::string res = lua_tostring(L, lua_gettop(L)); +lua_pop(L, 1); +*/ +lua_close(L); + +TEST_END; + +#endif/*TEST_LUAPRAXISD*/ diff --git a/server/src/luapraxisd.h b/server/src/luapraxisd.h new file mode 100644 index 0000000..2ab9ab5 --- /dev/null +++ b/server/src/luapraxisd.h @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + *            luapraxisd.h + * + *  Wed Apr 27 11:59:53 CEST 2011 + *  Copyright 2011 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_LUAPRAXISD_H__ +#define __PRACRO_LUAPRAXISD_H__ + +#include <lua.hpp> + +void register_praxisd(lua_State *L); + +#endif/*__PRACRO_LUAPRAXISD_H__*/ diff --git a/server/src/luaresume.cc b/server/src/luaresume.cc index 9202c27..d3597ad 100644 --- a/server/src/luaresume.cc +++ b/server/src/luaresume.cc @@ -27,6 +27,7 @@  #include "luaresume.h"  #include "luautil.h" +#include "luapraxisd.h"  #include "debug.h" @@ -72,6 +73,8 @@ LUAResume::LUAResume(Commit &c)    lua_setglobal(L, GLOBAL_POINTER); // Assign it to a global lua var.    lua_register(L, "value", _value); + +  register_praxisd(L);  }  LUAResume::~LUAResume() diff --git a/server/src/macroheaderparser.cc b/server/src/macroheaderparser.cc index c8d5fb2..3262888 100644 --- a/server/src/macroheaderparser.cc +++ b/server/src/macroheaderparser.cc @@ -92,13 +92,15 @@ MacroHeaderParser::~MacroHeaderParser()    if(m) delete m;  } -void MacroHeaderParser::startTag(std::string name, std::map< std::string, std::string> attributes) +void MacroHeaderParser::startTag(std::string name, attributes_t &attr)  {    if(m) return;    if(name == "macro") {      m = new Macro(); -    m->attributes = attributes; +    if(attr.find("name") != attr.end()) m->name = attr["name"]; +    if(attr.find("version") != attr.end()) m->version = attr["version"]; +    } else {      throw Exception("Missing root tag 'macro' - found '" + name + "'");    } diff --git a/server/src/macroheaderparser.h b/server/src/macroheaderparser.h index a4bb8bc..9b41d0c 100644 --- a/server/src/macroheaderparser.h +++ b/server/src/macroheaderparser.h @@ -60,7 +60,7 @@ public:    /**     * Overloaded parser callback method.     */ -  void startTag(std::string name, std::map< std::string, std::string> attributes); +  void startTag(std::string name, attributes_t &attr);    /**     * Overloaded parser callback method. diff --git a/server/src/macrolist.cc b/server/src/macrolist.cc index fc54ce9..935c403 100644 --- a/server/src/macrolist.cc +++ b/server/src/macrolist.cc @@ -52,9 +52,7 @@ void MacroList::addFile(std::string file)    try {      parser.parse();      Macro *macro = parser.getMacro(); -    insertEntity(macro->attributes["name"], -                 macro->attributes["version"], -                 file); +    insertEntity(macro->name, macro->version, file);    } catch(Exception &e) {      WARN(macrolist, "Skipping %s: %s\n", file.c_str(), e.what());    } diff --git a/server/src/macroparser.cc b/server/src/macroparser.cc index bf6ff13..d1604b2 100644 --- a/server/src/macroparser.cc +++ b/server/src/macroparser.cc @@ -118,8 +118,7 @@ void MacroParser::characterData(std::string &data)    }  } -void MacroParser::startTag(std::string name, -                           std::map< std::string, std::string> attributes) +void MacroParser::startTag(std::string name, attributes_t &attr)  {    // Create macro and enable parsing of queries, maps and widgets    if(name == "macro") { @@ -129,7 +128,9 @@ void MacroParser::startTag(std::string name,      assert(!m); // A Macro has already been allocated, cannot create macro!      m = new Macro(); -    m->attributes = attributes; + +    if(attr.find("name") != attr.end()) m->name = attr["name"]; +    if(attr.find("version") != attr.end()) m->version = attr["version"];      return;    } @@ -139,7 +140,7 @@ void MacroParser::startTag(std::string name,      if(state != MACRO) error("resume found outside macro.");      state = RESUME; -    m->resume.attributes = attributes; +    m->resume.attributes = attr;      assert(m); // No macro is currently available, cannot create resume! @@ -164,7 +165,7 @@ void MacroParser::startTag(std::string name,      assert(m); // No macro is currently available, cannot create query!      Query q; -    q.attributes = attributes; +    q.attributes = attr;      m->queries.push_back(q);      return; @@ -188,7 +189,7 @@ void MacroParser::startTag(std::string name,      assert(m); // No macro is currently available, cannot create map!      Map map; -    map.attributes = attributes; +    map.attributes = attr;      m->maps.push_back(map);      current_map = &(m->maps.back()); @@ -216,7 +217,7 @@ void MacroParser::startTag(std::string name,          state = SCRIPT;          Script s; -        s.attributes = attributes; +        s.attributes = attr;          m->scripts.push_back(s);          current_script = &(m->scripts.back());        } @@ -226,7 +227,7 @@ void MacroParser::startTag(std::string name,          state = RESUME_SCRIPT;          Script s; -        s.attributes = attributes; +        s.attributes = attr;          m->resume_scripts.push_back(s);          current_resume_script = &(m->resume_scripts.back());        } @@ -246,7 +247,7 @@ void MacroParser::startTag(std::string name,      assert(m); // No macro is currently available, cannot create widgets! -    m->widgets.attributes = attributes; +    m->widgets.attributes = attr;      m->widgets.attributes["tagname"] = name;      Widget *current = &(m->widgets); @@ -262,7 +263,7 @@ void MacroParser::startTag(std::string name,      assert(widgetstack.size()); // Widget stack is empty, cannot create!      Widget w; -    w.attributes = attributes; +    w.attributes = attr;      w.attributes["tagname"] = name;      Widget *parent = widgetstack.back(); diff --git a/server/src/macroparser.h b/server/src/macroparser.h index eaa5638..71ef911 100644 --- a/server/src/macroparser.h +++ b/server/src/macroparser.h @@ -50,7 +50,7 @@ public:    ~MacroParser();    void characterData(std::string &data); -  void startTag(std::string name, std::map< std::string, std::string> attributes); +  void startTag(std::string name, attributes_t &attr);    void endTag(std::string name);    void parseError(const char *buf, size_t len, std::string error, int lineno); diff --git a/server/src/macrotool/dump.cc b/server/src/macrotool/dump.cc index b567768..3d28181 100644 --- a/server/src/macrotool/dump.cc +++ b/server/src/macrotool/dump.cc @@ -104,12 +104,12 @@ static std::map<std::string, struct _macro> macroList()        parser.parse();        Macro *macro = parser.getMacro(); -      std::string key = macro->attributes["name"];// + "-" + macro->attributes["version"]; -      macros[key].name = macro->attributes["name"]; +      std::string key = macro->name;// + "-" + macro->version; +      macros[key].name = macro->name;        macros[key].file = *mfs;        macros[key].title = macro->widgets.attributes["caption"];        macros[key].fields = getFields(macro->widgets); -      macros[key].version = macro->attributes["version"]; +      macros[key].version = macro->version;      } catch( Exception &e ) {        printf("Skipping: %s: %s\n", mfs->c_str(), e.what());      } @@ -127,8 +127,7 @@ static std::map<std::string, struct _macro> macroList()        Template *t = parser.getTemplate();        std::vector<Macro>::iterator ms = t->macros.begin();        while(ms != t->macros.end()) { -        if(ms->attributes.find("header") == ms->attributes.end()) -          macros[ms->attributes["name"]].templates.insert(templ); +        if(ms->isHeader) macros[ms->name].templates.insert(templ);          ms++;        }      } catch( Exception &e ) { @@ -234,17 +233,16 @@ static std::map<std::string, struct _template> templateList()        parser.parse();        Template *t = parser.getTemplate(); -      std::string key = t->attributes["name"]; +      std::string key = t->name;        templates[key].file = *tfs; -      templates[key].name = t->attributes["name"]; -      templates[key].title = t->attributes["title"]; -      templates[key].version = t->attributes["version"]; +      templates[key].name = t->name; +      templates[key].title = t->title; +      templates[key].version = t->version;        std::vector<Macro>::iterator ms = t->macros.begin();        while(ms != t->macros.end()) { -        if(ms->attributes.find("header") == ms->attributes.end()) -          templates[key].macros.push_back(ms->attributes["name"]); +        if(ms->isHeader) templates[key].macros.push_back(ms->name);          ms++;        }      } catch( Exception &e ) { diff --git a/server/src/macrotool/filehandler.cc b/server/src/macrotool/filehandler.cc index 3c80a1c..738b687 100644 --- a/server/src/macrotool/filehandler.cc +++ b/server/src/macrotool/filehandler.cc @@ -74,11 +74,11 @@ static bool check(std::string file, std::string *name, std::string *version)      }      printf("Parsing of %s was succesful.\n", file.c_str()); -    printf("Name:    %s\n", macro->attributes["name"].c_str()); -    printf("Version: %s\n", macro->attributes["version"].c_str()); +    printf("Name:    %s\n", macro->name.c_str()); +    printf("Version: %s\n", macro->version.c_str()); -    if(name) *name = macro->attributes["name"]; -    if(version) *version = macro->attributes["version"]; +    if(name) *name = macro->name; +    if(version) *version = macro->version;    } catch( std::exception &e ) {      printf("%s\n", e.what()); @@ -102,8 +102,7 @@ static bool macro_exists(std::string name, std::string version, std::string &cla      parser.parse();      Macro *macro = parser.getMacro(); -    if(name == macro->attributes["name"] && -       version == macro->attributes["version"]) { +    if(name == macro->name && version == macro->version) {        clashfile = *mfs;        return true;      } diff --git a/server/src/pracrodaopgsql.cc b/server/src/pracrodaopgsql.cc index 774fb0c..c1a0c93 100644 --- a/server/src/pracrodaopgsql.cc +++ b/server/src/pracrodaopgsql.cc @@ -108,7 +108,7 @@ void PracroDAOPgsql::commitTransaction(std::string sessionid,  {    DEBUG(db, "commitTransaction (%s, %s, %s, <%u fields>, %ld)\n",          transaction.user.c_str(), transaction.cpr.c_str(), -        _macro.attributes["name"].c_str(), +        _macro.name.c_str(),          commit.fields.size(), now);    if(!conn) { @@ -120,8 +120,8 @@ void PracroDAOPgsql::commitTransaction(std::string sessionid,    pqxx::work W(*conn); -  std::string version = _macro.attributes["version"]; -  std::string macro = _macro.attributes["name"]; +  std::string version = _macro.version; +  std::string macro = _macro.name;    std::stringstream timestamp; timestamp << now;    std::string ts; @@ -245,7 +245,7 @@ Values PracroDAOPgsql::getLatestValues(std::string sessionid,    DEBUG(db, "(%s, %s, <%u fieldnames>, %ld)\n",          patientid.c_str(), -        macro ? macro->attributes["name"].c_str() : "(null)", +        macro ? macro->name.c_str() : "(null)",          fieldnames.size(), oldest);    std::string query; @@ -278,16 +278,18 @@ Values PracroDAOPgsql::getLatestValues(std::string sessionid,        " (SELECT f.name, MAX(t.timestamp) AS ts "        "   FROM commits c, fields f, transactions t "        "   WHERE "; -    //if(!uncom) query += "(c.status='committed' OR c.uid="+sessionid+") AND "; -    if(!uncom) query += "((c.status='committed' AND t.timestamp >= " + soldest.str() + ") OR c.uid="+sessionid+") AND "; +    if(!uncom) { +      query += "((c.status='committed' AND t.timestamp >= " + soldest.str() + +        ") OR c.uid="+sessionid+") AND "; +    }      query += "c.uid = t.cid AND t.uid = f.transaction"        // " AND t.timestamp >= " + soldest.str() +        " AND c.patientid = '" + W.esc(patientid) + "' "        + namecond;      if(macro) { -      query += " AND t.macro = '" + macro->attributes["name"] + "'"; -      if(macro->attributes["version"].size() > 0) -        query += " AND t.version = '" + macro->attributes["version"] + "'"; +      query += " AND t.macro = '" + macro->name + "'"; +      if(macro->version != "") +        query += " AND t.version = '" + macro->version + "'";      }      query += " GROUP BY f.name) xx, "      // End inner query @@ -301,9 +303,9 @@ Values PracroDAOPgsql::getLatestValues(std::string sessionid,        "   AND cc.patientid = '" + W.esc(patientid) + "' "        ;      if(macro) { -      query += " AND tt.macro = '" + macro->attributes["name"] + "'"; -      if(macro->attributes["version"].size() > 0) -        query += " AND tt.version = '" + macro->attributes["version"] + "'"; +      query += " AND tt.macro = '" + macro->name + "'"; +      if(macro->version != "") +        query += " AND tt.version = '" + macro->version + "'";      }      DEBUG(sql, "Query: %s\n", query.c_str()); diff --git a/server/src/pracrodaotest.cc b/server/src/pracrodaotest.cc index dd62016..532877b 100644 --- a/server/src/pracrodaotest.cc +++ b/server/src/pracrodaotest.cc @@ -72,13 +72,13 @@ void PracroDAOTest::commitTransaction(std::string sessionid,    DEBUG(db, "(%s, %s, %s, <%u fields>, %ld)\n",          transaction.user.c_str(),          transaction.cpr.c_str(), -        _macro.attributes["name"].c_str(), +        _macro.name.c_str(),          commit.fields.size(),          now);    if(commit.fields.size() == 0) return; -  std::string version = _macro.attributes["version"]; -  std::string macro = _macro.attributes["name"]; +  std::string version = _macro.version; +  std::string macro = _macro.name;    std::stringstream timestamp; timestamp << now;    dbtable_t::iterator ci = select(data.commits, "uid", sessionid); @@ -153,7 +153,7 @@ Values PracroDAOTest::getLatestValues(std::string sessionid,                                        std::string patientid, Macro *macro,                                        Fieldnames &fieldnames, time_t oldest)  { -  std::string macro_name = macro ? macro->attributes["name"].c_str() : "(null)"; +  std::string macro_name = macro ? macro->name.c_str() : "(null)";    DEBUG(db, "(%s, %s, <%u fieldnames>, %ld)\n",          patientid.c_str(),          macro_name.c_str(), fieldnames.size(), diff --git a/server/src/praxisd.cc b/server/src/praxisd.cc index 4a9c2f1..d814b54 100644 --- a/server/src/praxisd.cc +++ b/server/src/praxisd.cc @@ -246,7 +246,7 @@ public:      }    } -  void endTag(std::string name) +  void endTag(std::string)    {      str = NULL;    } @@ -304,7 +304,7 @@ class AdresseParser : public SAXParser {  public:    AdresseParser(std::vector<Praxisd::adresse_t> &al) : div(al) { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_adresse") { @@ -340,7 +340,7 @@ public:    BehandlingParser(std::vector<Praxisd::behandling_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_behandling") { @@ -374,7 +374,7 @@ public:    CaveParser(std::vector<Praxisd::cave_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_cave") { @@ -407,7 +407,7 @@ public:    DiagnoseParser(std::vector<Praxisd::diagnose_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_diagnose") { @@ -440,7 +440,7 @@ public:    FraseParser(std::vector<Praxisd::frase_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_frase") { @@ -473,7 +473,7 @@ public:    GrafikParser(std::vector<Praxisd::grafik_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_grafik") { @@ -504,7 +504,7 @@ public:    IndholdstofParser(std::vector<Praxisd::indholdstof_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_indholdstof") { @@ -539,7 +539,7 @@ public:    KlageParser(std::vector<Praxisd::klage_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_klage") { @@ -572,7 +572,7 @@ public:    OversigtParser(std::vector<Praxisd::oversigt_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_oversigt") { @@ -604,7 +604,7 @@ public:    PostnummerParser(std::vector<Praxisd::postnummer_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_postnummer") { @@ -641,7 +641,7 @@ public:    TypeParser(std::vector<Praxisd::type_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_type") { @@ -675,7 +675,7 @@ public:    UndersoegelseParser(std::vector<Praxisd::undersoegelse_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_undersoegelse") { @@ -708,7 +708,7 @@ public:    YdelseParser(std::vector<Praxisd::ydelse_t> &d) : div(d)    { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "div_ydelse") { @@ -745,7 +745,7 @@ class AftaleParser : public SAXParser {  public:    AftaleParser(std::vector<Praxisd::aftale_t> &a) : div(a) { str = NULL; }    void characterData(std::string &data) { if(str) *str += data; } -  void endTag(std::string name) { str = NULL; } +  void endTag(std::string) { str = NULL; }    void startTag(std::string name, std::map<std::string, std::string> attr)    {      if(name == "aftale") { @@ -877,6 +877,17 @@ TEST_EQUAL_STR(exp, j2, "Did we correctly append to the journal?");  p.add_sogeord(CPR, "CA0003", "Nolder"); +{ +  std::vector<Praxisd::cave_t> cave = p.diverse_get_cave("A0001"); +  TEST_EQUAL_INT(cave.size(), 1, "Precicely one result."); +  TEST_EQUAL_STR(cave[0].cave, "AZOPT", "The correct one?"); +} + +{ +  std::vector<Praxisd::cave_t> cave = p.diverse_get_cave(""); +  TEST_EQUAL_INT(cave.size(), 25, "Get them all."); +} +  TEST_END;  #endif/*TEST_PRAXISD*/ diff --git a/server/src/queryparser.cc b/server/src/queryparser.cc index 3d228f6..138b7ab 100644 --- a/server/src/queryparser.cc +++ b/server/src/queryparser.cc @@ -36,7 +36,7 @@ QueryParser::QueryParser()    stack.push_back(&result);  } -void QueryParser::startTag(std::string name, std::map< std::string, std::string> attributes) +void QueryParser::startTag(std::string name, attributes_t &attr)  {    if(name == "results") { @@ -44,24 +44,24 @@ void QueryParser::startTag(std::string name, std::map< std::string, std::string>    }    if(name == "result") { -    this->timestamp = atol(attributes["timestamp"].c_str()); +    this->timestamp = atol(attr["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"]]); +    stack.back()->groups[attr["class"]] = q; +    stack.push_back(&stack.back()->groups[attr["class"]]);    }    if(name == "group") {      QueryResult q;      q.timestamp = this->timestamp; -    stack.back()->groups[attributes["name"]] = q; -    stack.push_back(&stack.back()->groups[attributes["name"]]); +    stack.back()->groups[attr["name"]] = q; +    stack.push_back(&stack.back()->groups[attr["name"]]);    }    if(name == "value") { -    stack.back()->values[attributes["name"]] = utf8.decode(attributes["value"]); +    stack.back()->values[attr["name"]] = utf8.decode(attr["value"]);    }  } diff --git a/server/src/queryparser.h b/server/src/queryparser.h index f901d2c..80a51e1 100644 --- a/server/src/queryparser.h +++ b/server/src/queryparser.h @@ -57,7 +57,7 @@ public:    /**     * Private parser callback.     */ -  void startTag(std::string name, std::map< std::string, std::string> attributes); +  void startTag(std::string name, attributes_t &attr);    /**     * Private parser callback. diff --git a/server/src/saxparser.cc b/server/src/saxparser.cc index 72f0fe4..597b853 100644 --- a/server/src/saxparser.cc +++ b/server/src/saxparser.cc @@ -155,8 +155,10 @@ bool SAXParser::parse(const char *data, size_t size)      }    } -  if(done) DEBUG(sax, "Got END_OF_DOCUMENT [%s] at %ld\n", -                 outertag.c_str(), XML_GetCurrentByteIndex(p)); +  if(done) { +    DEBUG(sax, "Got END_OF_DOCUMENT [%s] at %ld\n", +          outertag.c_str(), XML_GetCurrentByteIndex(p)); +  }    return done;  } @@ -176,6 +178,22 @@ unsigned int SAXParser::usedBytes()    return bufferbytes + (XML_GetCurrentByteIndex(p) - totalbytes);  } +int SAXParser::readData(char *, size_t) +{ +  return 0; +} + +void SAXParser::endTag(std::string) +{ +} + +void SAXParser::startTag(std::string, attributes_t &) +{ +} + +void SAXParser::characterData(std::string &) +{ +}  #ifdef TEST_SAXPARSER  //deps: log.cc debug.cc exception.cc diff --git a/server/src/saxparser.h b/server/src/saxparser.h index 265727f..c303d41 100644 --- a/server/src/saxparser.h +++ b/server/src/saxparser.h @@ -31,6 +31,8 @@  #include <map>  #include <expat.h> +typedef std::map< std::string, std::string> attributes_t; +  /**   * This class implements a SAX Parser, utilising the eXpat XML parser library.   * It uses virtual methods for the callbacks, and transforms tagnames and @@ -61,11 +63,11 @@ public:    /**     * Character data callback method.     * Reimplement this to get character callbacks. -   * This callback might be called several times, if a character block is big. In -   * that cae it might be nessecary to buffer to received bytes. +   * This callback might be called several times, if a character block is big. +   * In that cae it might be nessecary to buffer to received bytes.     * @param data A std::string containing the character data.     */ -  virtual void characterData(std::string &data) {} +  virtual void characterData(std::string &data);    /**     * Start tag callback mehtod. @@ -75,7 +77,7 @@ public:     * @param attributes A std::map of std::string to std::string containing all     * attributes for the tag.     */ -  virtual void startTag(std::string name, std::map< std::string, std::string> attributes) {} +  virtual void startTag(std::string name, attributes_t &attr);    /**     * End tag callback mehtod. @@ -83,19 +85,22 @@ public:     * It is called each time an end tag is seen.     * @param name A std::string containing the tag name.     */ -  virtual void endTag(std::string name) {} +  virtual void endTag(std::string name);    /**     * Error callback method.     * Reimplement this to handle error messages. -   * A default implementation prints out the current buffer, linenumber and error -   * message to the screen. +   * A default implementation prints out the current buffer, linenumber and +   * error message to the screen.     * @param buf A char* containing the current buffer being parsed. -   * @param len A size_t containing the length of the current buffer being parsed. +   * @param len A size_t containing the length of the current buffer being +   * parsed.     * @param error A std::string containing the error message. -   * @param lineno An integer containing the line number on which the error occurred. +   * @param lineno An integer containing the line number on which the error +   * occurred.     */ -  virtual void parseError(const char *buf, size_t len, std::string error, int lineno); +  virtual void parseError(const char *buf, size_t len, std::string error, +                          int lineno);    /**     * Buffer parse method. @@ -111,10 +116,11 @@ public:    /**     * Get the number of bytes used from the last buffer. -   * If the buffer parse method is used, and the buffer comes from a stream of xml -   * doxuments, this method can be used to figure out how many bytes from the stream -   * should be replayed, to another parser. -   * @return an integer containing the number of bytes used from the last buffer. +   * If the buffer parse method is used, and the buffer comes from a stream of +   * xml doxuments, this method can be used to figure out how many bytes from +   * the stream should be replayed, to another parser. +   * @return an integer containing the number of bytes used from the last +   * buffer.     * @see bool parse(char *buf, size_t size)     */    unsigned int usedBytes(); @@ -129,13 +135,13 @@ protected:     * This method is used when the parse() method is used.     * It can be used to connect the parser with eg. a file.     * @param data A char* containing the buffer to be filled. -   * @param size A size_t containing the maximum number of bytes to be filled (ie. -   * the size of data) -   * @return An integer contaning the actual number of bytes filled. 0 if no more -   * bytes are available. +   * @param size A size_t containing the maximum number of bytes to be filled +   * (ie. the size of data) +   * @return An integer contaning the actual number of bytes filled. 0 if no +   * more bytes are available.     * @see int parse()     */  -  virtual int readData(char *data, size_t size) { return 0; } +  virtual int readData(char *data, size_t size);    XML_Parser p; diff --git a/server/src/sessionparser.cc b/server/src/sessionparser.cc index 17cc4fb..6b3653e 100644 --- a/server/src/sessionparser.cc +++ b/server/src/sessionparser.cc @@ -54,33 +54,32 @@ void SessionParser::characterData(std::string &data)    }  } -void SessionParser::startTag(std::string name, -                             std::map<std::string, std::string> attributes) +void SessionParser::startTag(std::string name, attributes_t &attr)  {    DEBUG(sessionparser, "<%s>\n", name.c_str());    if(name == "session") { -    patientid = attributes["patientid"]; -    sessionid = attributes["id"]; -    templ = attributes["template"]; -    status = attributes["status"]; +    patientid = attr["patientid"]; +    sessionid = attr["id"]; +    templ = attr["template"]; +    status = attr["status"];    }    if(name == "journal") { -    //    patientid = attributes["patientid"]; -    //    userid = attributes["userid"]; +    //    patientid = attr["patientid"]; +    //    userid = attr["userid"];    }    if(name == "database") { -    dbtype = attributes["type"]; +    dbtype = attr["type"];      indatabase = true;    }    if(name == "entry") {      Entry e; -    e.index = atoi(attributes["index"].c_str()); -    e.macro = attributes["macro"]; -    e.user = attributes["user"]; +    e.index = atoi(attr["index"].c_str()); +    e.macro = attr["macro"]; +    e.user = attr["user"];      entries.push_back(e);    } diff --git a/server/src/sessionparser.h b/server/src/sessionparser.h index 229ae10..df32b06 100644 --- a/server/src/sessionparser.h +++ b/server/src/sessionparser.h @@ -39,8 +39,7 @@ public:    ~SessionParser();    void characterData(std::string &data); -  void startTag(std::string name, -                std::map< std::string, std::string> attributes); +  void startTag(std::string name, attributes_t &attr);    void endTag(std::string name);    void parseError(const char *buf, size_t len, std::string error, int lineno); diff --git a/server/src/template.h b/server/src/template.h index 479e6ee..a069cff 100644 --- a/server/src/template.h +++ b/server/src/template.h @@ -68,15 +68,36 @@ public:    std::vector< Script > scripts;    std::vector< Script > resume_scripts;    Widget widgets; -  attr_t attributes;    Resume resume; +    bool isHeader; +  bool isStatic; +  bool isCompact; +  bool isImportant; + +  std::string name; +  std::string version; +  std::string caption; +  std::string requires; +  std::string ttl;  };  class Template {  public:    std::vector< Macro > macros; -  attr_t attributes; + +  std::string name; +  std::string title; +  std::string version; +}; + +class Course { +public: +  std::vector< Template > templates; + +  std::string name; +  std::string title; +  std::string version;  };  #endif/*__PRACRO_TEMPLATE_H__*/ diff --git a/server/src/templateheaderparser.cc b/server/src/templateheaderparser.cc index e549035..57b0a4e 100644 --- a/server/src/templateheaderparser.cc +++ b/server/src/templateheaderparser.cc @@ -92,13 +92,17 @@ TemplateHeaderParser::~TemplateHeaderParser()    if(t) delete t;  } -void TemplateHeaderParser::startTag(std::string name, std::map< std::string, std::string> attributes) +void TemplateHeaderParser::startTag(std::string name, attributes_t &attr)  {    if(t) return;    if(name == "template") {      t = new Template(); -    t->attributes = attributes; + +    if(attr.find("name") != attr.end()) t->name = attr["name"]; +    if(attr.find("title") != attr.end()) t->title = attr["title"]; +    if(attr.find("version") != attr.end()) t->version = attr["version"]; +    } else {      throw Exception("Missing root tag 'template' - found '" + name + "'");    } diff --git a/server/src/templateheaderparser.h b/server/src/templateheaderparser.h index ce63180..6c51912 100644 --- a/server/src/templateheaderparser.h +++ b/server/src/templateheaderparser.h @@ -60,7 +60,7 @@ public:    /**     * Overloaded parser callback method.     */ -  void startTag(std::string name, std::map< std::string, std::string> attributes); +  void startTag(std::string name, attributes_t &attr);    /**     * Overloaded parser callback method. diff --git a/server/src/templatelist.cc b/server/src/templatelist.cc index 7d19bfb..48dbab5 100644 --- a/server/src/templatelist.cc +++ b/server/src/templatelist.cc @@ -49,8 +49,8 @@ void TemplateList::addFile(std::string file)    try {      parser.parse();      Template *templ = parser.getTemplate(); -    insertEntity(templ->attributes["name"], -                 templ->attributes["version"], +    insertEntity(templ->name, +                 templ->version,                   file);    } catch(Exception &e) {      WARN(templatelist, "Skipping %s: %s\n", file.c_str(), e.what()); diff --git a/server/src/templateparser.cc b/server/src/templateparser.cc index 20270c6..b9c65f5 100644 --- a/server/src/templateparser.cc +++ b/server/src/templateparser.cc @@ -83,7 +83,7 @@ void TemplateParser::characterData(std::string &data)  {  } -void TemplateParser::startTag(std::string name, std::map< std::string, std::string> attributes) +void TemplateParser::startTag(std::string name, attributes_t &attr)  {    // Enable macro parsing    if(name == "template") { @@ -92,7 +92,9 @@ void TemplateParser::startTag(std::string name, std::map< std::string, std::stri      assert(t); // A Template has not yet been allocated, cannot create template! -    t->attributes = attributes; +    if(attr.find("name") != attr.end()) t->name = attr["name"]; +    if(attr.find("title") != attr.end()) t->title = attr["title"]; +    if(attr.find("version") != attr.end()) t->version = attr["version"];      return;    } @@ -105,7 +107,19 @@ void TemplateParser::startTag(std::string name, std::map< std::string, std::stri      assert(t); // A Template has not yet been allocated, cannot create macro!      Macro m; -    m.attributes = attributes; + +    if(attr.find("name") != attr.end()) m.name = attr["name"]; +    if(attr.find("version") != attr.end()) m.version = attr["version"]; +    if(attr.find("caption") != attr.end()) m.caption = attr["caption"]; +    if(attr.find("requires") != attr.end()) m.requires = attr["requires"]; +    if(attr.find("ttl") != attr.end()) m.ttl = attr["ttl"]; + +    m.isImportant = attr.find("important") != attr.end() && +      attr["important"] == "true"; +    m.isStatic = attr.find("static") != attr.end() && attr["static"] == "true"; +    m.isCompact = attr.find("compact") != attr.end() && +      attr["compact"] == "true"; +      m.isHeader = name == "header";      t->macros.push_back(m);      current_macro = &(t->macros.back()); @@ -139,7 +153,8 @@ int TemplateParser::readData(char *data, size_t size)    return r;  } -void TemplateParser::parseError(const char *buf, size_t len, std::string error, int lineno) +void TemplateParser::parseError(const char *buf, size_t len, std::string error, +                                int lineno)  {    fprintf(stderr, "TemplateParser[%s] error at line %d: %s\n",            file.c_str(), lineno, error.c_str()); diff --git a/server/src/templateparser.h b/server/src/templateparser.h index 51e24a7..5b8302f 100644 --- a/server/src/templateparser.h +++ b/server/src/templateparser.h @@ -42,7 +42,7 @@ public:    ~TemplateParser();    void characterData(std::string &data); -  void startTag(std::string name, std::map< std::string, std::string> attributes); +  void startTag(std::string name, attributes_t &attr);    void endTag(std::string name);    void parseError(const char *buf, size_t len, std::string error, int lineno); diff --git a/server/src/transactionhandler.cc b/server/src/transactionhandler.cc index bcdd638..4b4e7ca 100644 --- a/server/src/transactionhandler.cc +++ b/server/src/transactionhandler.cc @@ -107,11 +107,8 @@ static std::string handleRequest(Transaction &transaction, Environment &env,        Template *templ = tp.getTemplate(); -      answer += "  <template name=\""; -      answer += templ->attributes["name"]; -      answer += "\" title=\""; -      answer += templ->attributes["title"]; -      answer += "\">\n"; +      answer += "  <template name=\"" + templ->name + "\" title=\"" + +        templ->title + "\">\n";        bool foundmacro = false; @@ -121,37 +118,42 @@ static std::string handleRequest(Transaction &transaction, Environment &env,          Macro ¯o = (*mi2);          if(macro.isHeader) { -          answer += "    <header caption=\"" + macro.attributes["caption"] + -            "\"/>\n"; +          answer += "    <header caption=\"" + macro.caption + "\"/>\n";            mi2++;            continue;          } -        bool completed = db->checkMacro(transaction.cpr, -                                        macro.attributes["name"], -                                        session.id(), -                                        time(NULL)-Conf::db_max_ttl); +        size_t oldest = time(NULL) - Conf::db_max_ttl; +        if(macro.ttl != "") oldest = time(NULL) - atoi(macro.ttl.c_str()); + +        bool completed = +          db->checkMacro(transaction.cpr, macro.name, session.id(), oldest);          answer += "    <macro uid=\"42\" completed=";          if(completed) answer += "\"true\"";          else answer += "\"false\""; -        std::map< std::string, std::string >::iterator ai = -          macro.attributes.begin(); -        while(ai != macro.attributes.end()) { +        attributes_t attr; +        attr["name"] = macro.name; +        attr["version"] = macro.version; +        if(macro.caption != "") attr["caption"] = macro.caption; +        if(macro.requires != "") attr["requires"] = macro.requires; +        attr["static"] = macro.isStatic?"true":"false"; +        attr["compact"] = macro.isCompact?"true":"false"; +        attr["important"] = macro.isImportant?"true":"false"; + +        attributes_t::iterator ai = attr.begin(); +        while(ai != attr.end()) {            std::string name = ai->first;            std::string value = ai->second;            answer += " "+name+"=\"" + value + "\"";            ai++;          } -        if(macro.attributes["name"] == request.macro ||  -           (macro.attributes.find("static") != macro.attributes.end() && -            macro.attributes["static"] == "true") -           ) { +        if(macro.name == request.macro || macro.isStatic) {            foundmacro = true; -          MacroParser mp(env.macrolist.getLatestVersion(macro.attributes["name"])); +          MacroParser mp(env.macrolist.getLatestVersion(macro.name));            mp.parse();            Macro *m = mp.getMacro();            answer += " caption=\"" + m->widgets.attributes["caption"] + "\""; @@ -225,11 +227,11 @@ static std::string handleRequest(Transaction &transaction, Environment &env,              answer += "      </scripts>\n";            } -          answer += widgetgenerator(transaction.cpr, session.id(), -                                    *m, lqm, *db); +          answer += widgetgenerator(transaction.cpr, session.id(), *m, lqm, +                                    *db, oldest);          } else {            // only find macro title -          MacroParser mp(env.macrolist.getLatestVersion(macro.attributes["name"])); +          MacroParser mp(env.macrolist.getLatestVersion(macro.name));            mp.parse();            Macro *m = mp.getMacro();            answer += " caption=\"" + m->widgets.attributes["caption"] + "\""; @@ -238,15 +240,12 @@ static std::string handleRequest(Transaction &transaction, Environment &env,          }          if(completed) { -          std::string jresume = -            session.journal()->getEntry(macro.attributes["name"]); +          std::string jresume = session.journal()->getEntry(macro.name);            std::string state = "old"; -          std::string resume = db->getResume(transaction.cpr, -                                             macro, -                                             time(NULL) - Conf::db_max_ttl, +          std::string resume = db->getResume(transaction.cpr, macro, oldest,                                               session.id()); -          if(session.journal()->dirty(macro.attributes["name"])) { +          if(session.journal()->dirty(macro.name)) {              state = "dirty";            } else {              if(resume == jresume) { @@ -254,7 +253,7 @@ static std::string handleRequest(Transaction &transaction, Environment &env,              } else {                if(jresume != "") {                  state = "dirty"; -                session.journal()->setDirty(macro.attributes["name"]); +                session.journal()->setDirty(macro.name);                } else {                  state = "old";                } diff --git a/server/src/transactionparser.cc b/server/src/transactionparser.cc index f78e562..142b95f 100644 --- a/server/src/transactionparser.cc +++ b/server/src/transactionparser.cc @@ -43,29 +43,28 @@ TransactionParser::TransactionParser(Transaction *transaction)    totalbytes = 0;  } -void TransactionParser::startTag(std::string name, -                                 std::map<std::string, std::string> attributes) +void TransactionParser::startTag(std::string name, attributes_t &attr)  {    DEBUG(transactionparser, "<%s>\n", name.c_str());    if(name == "pracro") { -    transaction->user = attributes["user"]; -    transaction->cpr = attributes["cpr"]; -    transaction->version = attributes["version"]; +    transaction->user = attr["user"]; +    transaction->cpr = attr["cpr"]; +    transaction->version = attr["version"];    }    if(name == "request") {      Request r; -    r.templ = attributes["template"]; -    r.macro = attributes["macro"]; +    r.templ = attr["template"]; +    r.macro = attr["macro"];      transaction->requests.push_back(r);    }    if(name == "commit") {      Commit c; -    c.templ = attributes["template"]; -    c.macro = attributes["macro"]; -    c.version = attributes["version"]; +    c.templ = attr["template"]; +    c.macro = attr["macro"]; +    c.version = attr["version"];      transaction->commits.push_back(c);    } @@ -75,18 +74,17 @@ void TransactionParser::startTag(std::string name,        throw std::exception();      } -    if(attributes.find("name") == attributes.end()) { +    if(attr.find("name") == attr.end()) {        ERR(transactionparser, "Field is missing 'name' attribute");        throw std::exception();      } -    if(attributes.find("value") == attributes.end()) { +    if(attr.find("value") == attr.end()) {        ERR(transactionparser, "Field is missing 'value' attribute");        throw std::exception();      } -    transaction->commits.back().fields[attributes["name"]] = -      attributes["value"]; +    transaction->commits.back().fields[attr["name"]] = attr["value"];    }  } diff --git a/server/src/transactionparser.h b/server/src/transactionparser.h index 4d54a5a..6eefaac 100644 --- a/server/src/transactionparser.h +++ b/server/src/transactionparser.h @@ -51,7 +51,7 @@ public:    /**     * Start tag callback method.     */ -  void startTag(std::string name, std::map< std::string, std::string> attributes); +  void startTag(std::string name, attributes_t &attr);    /**     * Parser error callback method. Unlike its parent class, this method throws diff --git a/server/src/widgetgenerator.cc b/server/src/widgetgenerator.cc index 0c24999..7f8e8c4 100644 --- a/server/src/widgetgenerator.cc +++ b/server/src/widgetgenerator.cc @@ -91,13 +91,13 @@ static void get_fields(Widget &widget, Fieldnames &fields)  }  std::string widgetgenerator(std::string cpr, std::string sessionid, -                            Macro ¯o, -                            LUAQueryMapper &mapper, Database &db) +                            Macro ¯o, LUAQueryMapper &mapper, Database &db, +                            time_t oldest)  {    Fieldnames fields;    get_fields(macro.widgets, fields); -  Values values = db.getValues(cpr, fields, sessionid); +  Values values = db.getValues(cpr, fields, sessionid, oldest);    return getWidgetString(macro, macro.widgets, "      ", mapper, values);  } diff --git a/server/src/widgetgenerator.h b/server/src/widgetgenerator.h index 0e87cac..459f21a 100644 --- a/server/src/widgetgenerator.h +++ b/server/src/widgetgenerator.h @@ -53,6 +53,6 @@ std::string widgetgenerator(std::string cpr,                              std::string sessionid,                              Macro ¯o,                              LUAQueryMapper &mapper, -                            Database &db); +                            Database &db, time_t oldest);  #endif/*__PRACRO_WIDGETGENERATOR_H__*/ | 
