diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/Makefile.am | 2 | ||||
| -rw-r--r-- | server/src/database.h | 21 | ||||
| -rw-r--r-- | server/src/dbtypes.h | 7 | ||||
| -rw-r--r-- | server/src/macrotool_dump.cc | 48 | ||||
| -rw-r--r-- | server/src/macrotool_fieldnames.cc | 119 | ||||
| -rw-r--r-- | server/src/macrotool_util.cc | 77 | ||||
| -rw-r--r-- | server/src/macrotool_util.h | 40 | ||||
| -rw-r--r-- | server/src/pracrodao.h | 5 | ||||
| -rw-r--r-- | server/src/pracrodaopgsql.cc | 35 | ||||
| -rw-r--r-- | server/src/pracrodaopgsql.h | 12 | 
10 files changed, 312 insertions, 54 deletions
| diff --git a/server/src/Makefile.am b/server/src/Makefile.am index c1ba9e4..f8f6e21 100644 --- a/server/src/Makefile.am +++ b/server/src/Makefile.am @@ -48,6 +48,7 @@ macrotool_SOURCES = \  	macroparser.cc \  	macrotool_dump.cc \  	macrotool_fieldnames.cc \ +	macrotool_util.cc \  	pracrodao.cc \  	pracrodaopgsql.cc \  	saxparser.cc \ @@ -72,6 +73,7 @@ EXTRA_DIST = \  	macroparser.h \  	macrotool_dump.h \  	macrotool_fieldnames.h \ +	macrotool_util.h \  	pracrodao.h \  	pracrodaopgsql.h \  	resumeparser.h \ diff --git a/server/src/database.h b/server/src/database.h index 5a82d67..396dda4 100644 --- a/server/src/database.h +++ b/server/src/database.h @@ -72,6 +72,27 @@ public:      else return "";    } +  void addFieldname(std::string name, std::string description) +  { +    if(!dao) return; +    dao->addFieldname(name, description); +  } + +  void delFieldname(std::string name) +  { +    if(!dao) return; +    dao->delFieldname(name); +  } +   +  std::vector<Fieldname> getFieldnames() +  { +    if(!dao) { +      std::vector<Fieldname> fieldnames; +      return fieldnames; +    } +    return dao->getFieldnames(); +  } +  private:    PracroDAO *dao;  }; diff --git a/server/src/dbtypes.h b/server/src/dbtypes.h index 79ac629..04db0bd 100644 --- a/server/src/dbtypes.h +++ b/server/src/dbtypes.h @@ -38,4 +38,11 @@ typedef std::map< std::string, Value > Values;  typedef std::vector< std::string > Fieldnames; +class Fieldname { +public: +  std::string name; +  std::string description; +  time_t timestamp; +}; +  #endif diff --git a/server/src/macrotool_dump.cc b/server/src/macrotool_dump.cc index 9248d03..370397a 100644 --- a/server/src/macrotool_dump.cc +++ b/server/src/macrotool_dump.cc @@ -27,6 +27,8 @@   */  #include "macrotool_dump.h" +#include "macrotool_util.h" +  #include "debug.h"  #include "macroparser.h" @@ -36,9 +38,6 @@  #include <map>  #include <set> -#include <sys/types.h> -#include <dirent.h> -  #include <config.h>  #include "configuration.h" @@ -65,49 +64,6 @@ static const char usage_str[] =  "  templates   Writes template names, versions, filenames, titles and macro references to stdout.\n"  ; - -static std::vector<std::string> listdir(std::string path) -{ -  std::vector<std::string> files; - -  DIR* dir = opendir(path.c_str()); -  if(!dir) { -    PRACRO_ERR(dump, "Could not open directory: %s\n", path.c_str()); -    return files; -  } - -  struct dirent *d; -  while((d = readdir(dir)) != 0) { -    //if(d->d_type == DT_DIR) { -    std::string name = d->d_name; -    if(name.length() >= 4 && name.substr(name.length() - 4) == ".xml") -      files.push_back(name); -    //} -  } -  closedir(dir); - -  return files; -} - -static std::vector<std::string> getMacros() -{ -  std::vector<std::string> macros = listdir(Conf::xml_basedir + "/macros"); -  return macros; -} - -static std::vector<std::string> getTemplates() -{ -  std::vector<std::string> templates = listdir(Conf::xml_basedir + "/templates"); -  return templates; -} - -static void printcolumn(std::string text, size_t width) -{ -  printf(text.c_str()); -  for(size_t i = text.length(); i < width; i++) printf(" "); -  printf("\t"); -} -  static std::map<std::string, struct _macro> macroList()  {    std::map<std::string, struct _macro> macros; diff --git a/server/src/macrotool_fieldnames.cc b/server/src/macrotool_fieldnames.cc index f2475f2..eeed648 100644 --- a/server/src/macrotool_fieldnames.cc +++ b/server/src/macrotool_fieldnames.cc @@ -27,9 +27,12 @@   */  #include "macrotool_fieldnames.h" +#include "macrotool_util.h" +#include "macroparser.h" +  #include "debug.h" -#include "pracrodaopgsql.h" +#include "database.h"  #include "configuration.h"  static const char usage_str[] = @@ -41,15 +44,113 @@ static void add(std::string name, std::string desc)  {  #ifndef WITHOUT_DB    PRACRO_DEBUG("SET (name: %s - desc: %s)\n", name.c_str(), desc.c_str()); -  PracroDAOPgsql sql(Conf::database_addr, "", -                     Conf::database_user, -                     Conf::database_passwd, "");  #else /*WITHOUT_DB*/    printf("Project not compiled with db spport.")  #endif/*WITHOUT_DB*/  } +static std::vector<std::string> getWidgetNames(Widget &w) +{ +  std::vector<std::string> v; +  if(w.attributes.find("name") != w.attributes.end()) v.push_back(w.attributes["name"]); + +  std::vector< Widget >::iterator i = w.widgets.begin(); +  while(i != w.widgets.end()) { +    std::vector<std::string> _v = getWidgetNames(*i); +    v.insert(v.end(), _v.begin(), _v.end()); +    i++; +  } + +  return v; +} + +static std::map<std::string, std::vector<std::string> > getMacroRefsList() +{ +  std::map<std::string, std::vector<std::string> > reflist; + +  std::vector<std::string> macrofiles = getMacros(); +  std::vector<std::string>::iterator mfs = macrofiles.begin(); +  while(mfs != macrofiles.end()) { +    std::string name = mfs->substr(0, mfs->length() - 4); + +    MacroParser parser(name); +    parser.parse(); +    Macro *macro = parser.getMacro(); + +    std::string key = name; +    reflist[key] = getWidgetNames(macro->window); + +    mfs++; +  } + +  return reflist; +} + +static std::vector<std::string> getMacroRefs(std::map<std::string, std::vector<std::string> > reflist, std::string name) +{ +  std::vector<std::string> macros; +  std::map<std::string, std::vector<std::string> >::iterator macro = reflist.begin(); +  while(macro != reflist.end()) { +    std::vector<std::string>::iterator field = macro->second.begin(); +    while(field != macro->second.end()) { +      if(*field == name) macros.push_back(macro->first); +      field++; +    } +    macro++; +  } +  return macros; +} + +static void list() +{ +  Database db("pgsql", Conf::database_addr, "", Conf::database_user, Conf::database_passwd, ""); + +  std::vector<Fieldname> fieldnames = db.getFieldnames(); + +  std::map<std::string, std::vector<std::string> > reflist = getMacroRefsList(); +   +  size_t name_sz = 0; +  size_t desc_sz = 0; +  size_t time_sz = 0; + +  std::vector<Fieldname>::iterator i = fieldnames.begin(); +  while(i != fieldnames.end()) { +    if(i->name.length() > name_sz) name_sz = i->name.length(); +    if(i->description.length() > desc_sz) desc_sz = i->description.length(); +    char ts[32]; +    sprintf(ts, "%u", (unsigned int)i->timestamp); +    if(strlen(ts) > time_sz) time_sz = strlen(ts); +    i++; +  } + +  printcolumn("Name:", name_sz); +  printcolumn("Description:", desc_sz); +  printcolumn("Timestamp:", time_sz); +  printf("Macros:"); +  printf("\n"); + +  i = fieldnames.begin(); +  while(i != fieldnames.end()) { +    printcolumn(i->name, name_sz); +    printcolumn(i->description, desc_sz); +    char ts[32]; +    sprintf(ts, "%u", (unsigned int)i->timestamp); +    printcolumn(ts, time_sz); + +    std::vector<std::string> macros = getMacroRefs(reflist, i->name); +    std::vector<std::string>::iterator j = macros.begin(); +    while(j != macros.end()) { +      if(j != macros.begin()) printf(", "); +      printf("%s", j->c_str()); +      j++; +    } + +    printf("\n"); +    i++; +  } +} +  void macrotool_fieldnames(std::vector<std::string> params)  {    if(params.size() < 1) { @@ -59,6 +160,16 @@ void macrotool_fieldnames(std::vector<std::string> params)    PRACRO_DEBUG(fieldnames, "fieldnames: %s\n", params[0].c_str()); +  if(params[0] == "list") { +    if(params.size() != 1) { +      printf("The command 'list' does not need any parameters.\n"); +      printf(usage_str); +      return; +    } +    list(); +    return; +  } +    if(params[0] == "set") {      if(params.size() != 3) {        printf("The command 'set' needs 2 parameters.\n"); diff --git a/server/src/macrotool_util.cc b/server/src/macrotool_util.cc new file mode 100644 index 0000000..fa066aa --- /dev/null +++ b/server/src/macrotool_util.cc @@ -0,0 +1,77 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + *            macrotool_util.cc + * + *  Fri Jul 10 09:11:28 CEST 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 "macrotool_util.h" + +#include "debug.h" + +#include <sys/types.h> +#include <dirent.h> + +#include "configuration.h" + +std::vector<std::string> listdir(std::string path) +{ +  std::vector<std::string> files; + +  DIR* dir = opendir(path.c_str()); +  if(!dir) { +    PRACRO_ERR(dump, "Could not open directory: %s\n", path.c_str()); +    return files; +  } + +  struct dirent *d; +  while((d = readdir(dir)) != 0) { +    //if(d->d_type == DT_DIR) { +    std::string name = d->d_name; +    if(name.length() >= 4 && name.substr(name.length() - 4) == ".xml") +      files.push_back(name); +    //} +  } +  closedir(dir); + +  return files; +} + +std::vector<std::string> getMacros() +{ +  std::vector<std::string> macros = listdir(Conf::xml_basedir + "/macros"); +  return macros; +} + +std::vector<std::string> getTemplates() +{ +  std::vector<std::string> templates = listdir(Conf::xml_basedir + "/templates"); +  return templates; +} + +void printcolumn(std::string text, size_t width) +{ +  printf(text.c_str()); +  for(size_t i = text.length(); i < width; i++) printf(" "); +  printf("\t"); +} diff --git a/server/src/macrotool_util.h b/server/src/macrotool_util.h new file mode 100644 index 0000000..1725f23 --- /dev/null +++ b/server/src/macrotool_util.h @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + *            macrotool_util.h + * + *  Fri Jul 10 09:11:28 CEST 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_MACROTOOL_UTIL_H__ +#define __PRACRO_MACROTOOL_UTIL_H__ + +#include <vector> +#include <string> + +std::vector<std::string> listdir(std::string path); +std::vector<std::string> getMacros(); +std::vector<std::string> getTemplates(); + +void printcolumn(std::string text, size_t width); + +#endif/*__PRACRO_MACROTOOL_UTIL_H__*/ diff --git a/server/src/pracrodao.h b/server/src/pracrodao.h index 7924d3d..1ef9686 100644 --- a/server/src/pracrodao.h +++ b/server/src/pracrodao.h @@ -29,6 +29,7 @@  #define __PRACRO_PRACRODAO_H__  #include <string> +#include <vector>  #include "dbtypes.h"  #include "template.h" @@ -44,6 +45,10 @@ public:    virtual Values getLatestValues(std::string patientid, Macro *macro, Fieldnames &fieldnames, time_t oldest) = 0;    virtual unsigned nrOfCommits(std::string patientid, std::string macroname, time_t oldest) = 0; +  virtual void addFieldname(std::string name, std::string description) = 0; +  virtual void delFieldname(std::string name) = 0; +  virtual std::vector<Fieldname> getFieldnames() = 0; +  protected:    std::string host;    std::string port; diff --git a/server/src/pracrodaopgsql.cc b/server/src/pracrodaopgsql.cc index e48e549..683fe85 100644 --- a/server/src/pracrodaopgsql.cc +++ b/server/src/pracrodaopgsql.cc @@ -242,4 +242,39 @@ unsigned PracroDAOPgsql::nrOfCommits(std::string patientid, std::string macronam    return 0;  } +void PracroDAOPgsql::addFieldname(std::string name, std::string description) +{ +} + +void PracroDAOPgsql::delFieldname(std::string name) +{ +} + +std::vector<Fieldname> PracroDAOPgsql::getFieldnames() +{ +  if(!conn) PRACRO_DEBUG(db, "No pgsql connection\n"); +  std::vector<Fieldname> fieldnames; + +  std::string query; +  try { +    pqxx::work W(*conn); +    query = "SELECT * FROM fieldnames"; +    PRACRO_DEBUG(sql, "Query: %s\n", query.c_str()); +    pqxx::result R = W.exec(query); +    pqxx::result::const_iterator ri = R.begin(); +    while(ri != R.end()) { +      Fieldname f; +      f.name = (*ri)[0].c_str(); +      f.description = (*ri)[1].c_str(); +      f.timestamp = atol((*ri)[2].c_str()); +      fieldnames.push_back(f); +      ri++; +    } +  } catch (std::exception &e) { +    PRACRO_ERR_LOG(db, "Query failed: %s: %s\n", e.what(), query.c_str()); +  } + +  return fieldnames; +} +  #endif/*WITHOUT_DB*/ diff --git a/server/src/pracrodaopgsql.h b/server/src/pracrodaopgsql.h index 303db28..b226cfd 100644 --- a/server/src/pracrodaopgsql.h +++ b/server/src/pracrodaopgsql.h @@ -39,11 +39,15 @@ class PracroDAOPgsql : public PracroDAO  {  public:    PracroDAOPgsql(std::string _host, std::string _port, std::string _user, std::string _passwd, std::string _dbname); -  virtual ~PracroDAOPgsql(); +  ~PracroDAOPgsql(); -  virtual void commitTransaction(std::string user, std::string patientid, Macro ¯o, Fields &fields, time_t now); -  virtual Values getLatestValues(std::string patientid, Macro *macro, Fieldnames &fieldnames, time_t oldest); -  virtual unsigned nrOfCommits(std::string patientid, std::string macroname, time_t oldest); +  void commitTransaction(std::string user, std::string patientid, Macro ¯o, Fields &fields, time_t now); +  Values getLatestValues(std::string patientid, Macro *macro, Fieldnames &fieldnames, time_t oldest); +  unsigned nrOfCommits(std::string patientid, std::string macroname, time_t oldest); + +  void addFieldname(std::string name, std::string description); +  void delFieldname(std::string name); +  std::vector<Fieldname> getFieldnames();  private:    pqxx::connection  *conn; | 
