diff options
| -rw-r--r-- | server/src/macrotool_dump.cc | 66 | 
1 files changed, 66 insertions, 0 deletions
| diff --git a/server/src/macrotool_dump.cc b/server/src/macrotool_dump.cc index f570a15..66b4ad7 100644 --- a/server/src/macrotool_dump.cc +++ b/server/src/macrotool_dump.cc @@ -44,10 +44,13 @@  #include "exception.h" +#include "database.h" +  struct _macro {    std::string name;    std::string title;    std::set<std::string>  templates; +  std::vector<std::string> fields;    std::string file;    std::string version;  }; @@ -64,8 +67,26 @@ static const char usage_str[] =  "  help        Prints this helptext.\n"  "  macros      Writes macro names, versions, filenames, titles and template references to stdout.\n"  "  templates   Writes template names, versions, filenames, titles and macro references to stdout.\n" +"  fields      Outputs all fields sorted by macro, with indication of those in the fieldnames table.\n"  ; +static std::vector<std::string> getFields(Widget &widget) +{ +  std::vector<std::string> fields; + +  std::vector< Widget >::iterator w = widget.widgets.begin(); +  while(w != widget.widgets.end()) { +    std::vector<std::string> fs = getFields(*w); +    fields.insert(fields.end(), fs.begin(), fs.end()); +    w++; +  } + +  if(widget.attributes.find("name") != widget.attributes.end()) +    fields.push_back(widget.attributes["name"]); + +  return fields; +} +  static std::map<std::string, struct _macro> macroList()  {    std::map<std::string, struct _macro> macros; @@ -84,6 +105,7 @@ static std::map<std::string, struct _macro> macroList()        macros[key].name = macro->attributes["name"];        macros[key].file = *mfs;        macros[key].title = macro->widgets.attributes["caption"]; +      macros[key].fields = getFields(macro->widgets);        macros[key].version = macro->attributes["version"];      } catch( Exception &e ) {        printf("Skipping: %s: %s\n", mfs->c_str(), e.what()); @@ -116,6 +138,40 @@ static std::map<std::string, struct _macro> macroList()    return macros;  } +static void dump_fields() +{ +  Database db("pgsql", Conf::database_addr, "", Conf::database_user, Conf::database_passwd, ""); +  std::vector<Fieldname> fieldnames = db.getFieldnames(); + +  std::map<std::string, struct _macro> macros = macroList(); +  std::map<std::string, struct _macro>::iterator ms = macros.begin(); +  while(ms != macros.end()) { +    printf("Macro: %s\n", ms->second.name.c_str()); + +    std::vector<std::string>::iterator ts = ms->second.fields.begin(); +    while(ts != ms->second.fields.end()) { +      bool reg = false; + +      std::vector<Fieldname>::iterator fs = fieldnames.begin(); +      while(fs != fieldnames.end()) { +        if(*ts == fs->name) { +          reg = true; +          break; +        } +        fs++; +      } +       +      printf("\t%s %s\n", reg?"(*)":"   ", ts->c_str()); +      ts++; +    } + +    printf("\n"); +    ms++; +  } + +  printf("----\n(*) Indicates that the field is registered in the fieldnames table.\n"); +} +  static void dump_macros()  {    std::map<std::string, struct _macro> macros = macroList(); @@ -242,6 +298,16 @@ void macrotool_dump(std::vector<std::string> params)    PRACRO_DEBUG(fieldnames, "dump: %s\n", params[0].c_str()); +  if(params[0] == "fields") { +    if(params.size() != 1) { +      printf("The command 'fields' doen't take any parameters.\n"); +      printf(usage_str); +      return; +    } +    dump_fields(); +    return; +  } +    if(params[0] == "macros") {      if(params.size() != 1) {        printf("The command 'macro' doen't take any parameters.\n"); | 
