summaryrefslogtreecommitdiff
path: root/server/src/macrotool/fieldnames.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/macrotool/fieldnames.cc')
-rw-r--r--server/src/macrotool/fieldnames.cc208
1 files changed, 208 insertions, 0 deletions
diff --git a/server/src/macrotool/fieldnames.cc b/server/src/macrotool/fieldnames.cc
new file mode 100644
index 0000000..f348ef4
--- /dev/null
+++ b/server/src/macrotool/fieldnames.cc
@@ -0,0 +1,208 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * macrotool_fieldnames.cc
+ *
+ * Mon Jul 6 14:15:05 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 "fieldnames.h"
+
+#include <string.h>
+#include <stdio.h>
+
+#include "util.h"
+#include "macroparser.h"
+
+#include "debug.h"
+
+#include "database.h"
+#include "configuration.h"
+
+static const char usage_str[] =
+" help Prints this helptext.\n"
+" add name desc Add a field called 'name', described as 'desc'\n"
+" del name Delete a field called 'name'\n"
+" list List all fieldnames as well as their macro references.\n"
+;
+
+static void add(std::string name, std::string desc)
+{
+ Database db("pgsql", Conf::database_addr, "", Conf::database_user, Conf::database_passwd, "");
+ db.addFieldname(name, desc);
+}
+
+static void del(std::string name)
+{
+ Database db("pgsql", Conf::database_addr, "", Conf::database_user, Conf::database_passwd, "");
+ db.delFieldname(name);
+}
+
+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(Conf::xml_basedir + "/macros/" + *mfs);
+ parser.parse();
+ Macro *macro = parser.getMacro();
+
+ std::string key = name;
+ reflist[key] = getWidgetNames(macro->widgets);
+
+ 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) {
+ printf("%s", usage_str);
+ return;
+ }
+
+ 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("%s", usage_str);
+ return;
+ }
+ list();
+ return;
+ }
+
+ if(params[0] == "add") {
+ if(params.size() != 3) {
+ printf("The command 'add' needs 2 parameters.\n");
+ printf("%s", usage_str);
+ return;
+ }
+ add(params[1], params[2]);
+ return;
+ }
+
+ if(params[0] == "del") {
+ if(params.size() != 2) {
+ printf("The command 'del' needs 1 parameter.\n");
+ printf("%s", usage_str);
+ return;
+ }
+ del(params[1]);
+ return;
+ }
+
+ if(params[0] == "help") {
+ printf("%s", usage_str);
+ return;
+ }
+
+ printf("Unknown command '%s'\n", params[0].c_str());
+ printf("%s", usage_str);
+ return;
+}