From c1bb76eeda86b16e8f00c5cb7ad2d31a1d94fe46 Mon Sep 17 00:00:00 2001
From: deva <deva>
Date: Tue, 6 May 2008 15:27:40 +0000
Subject: Added experimental parser of the external data query XML results.

---
 server/src/externaldataqueryparser.cc | 112 ++++++++++++++++++++++++++++++++++
 server/src/externaldataqueryparser.h  |  58 ++++++++++++++++++
 2 files changed, 170 insertions(+)
 create mode 100644 server/src/externaldataqueryparser.cc
 create mode 100644 server/src/externaldataqueryparser.h

(limited to 'server/src')

diff --git a/server/src/externaldataqueryparser.cc b/server/src/externaldataqueryparser.cc
new file mode 100644
index 0000000..2de7fba
--- /dev/null
+++ b/server/src/externaldataqueryparser.cc
@@ -0,0 +1,112 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ *            externaldataqueryparser.cc
+ *
+ *  Tue May  6 17:02:37 CEST 2008
+ *  Copyright 2008 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup
+ *  deva@aasimon.org, elsenator@gmail.com and piparum@piparum.dk
+ ****************************************************************************/
+
+/*
+ *  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 "externaldataqueryparser.h"
+
+ExternalDataQueryParser::ExternalDataQueryParser(std::string document)
+{
+  this->document = document;
+  p = 0;
+  stack.push_back(&result);
+}
+
+void ExternalDataQueryParser::startTag(std::string name, std::map< std::string, std::string> attributes)
+{
+
+  if(name == "group") {
+    QueryResult q;
+    stack.back()->groups[attributes["name"]] = q;
+    stack.push_back(&stack.back()->groups[attributes["name"]]);
+  }
+
+  if(name == "value") {
+    stack.back()->values[attributes["name"]] = attributes["value"];
+  }
+
+}
+
+void ExternalDataQueryParser::endTag(std::string name)
+{
+  if(name == "group") stack.pop_back();
+}
+
+// FIXME: This is *not* the optimal way to do this.
+int ExternalDataQueryParser::readData(char *data, size_t size)
+{
+  size_t len = document.size() - p < size ? document.size() - p : size;
+  strncpy(data, document.c_str() + p, len);
+  p += len;
+  return len;
+}
+
+#ifdef TEST_EXTERNALDATAQUERYPARSER
+
+static std::string loadresultstring(QueryResult &res, std::string group = "")
+{
+  std::string s;
+
+  std::map< std::string, std::string >::iterator v = res.values.begin();
+  while(v != res.values.end()) {
+    s += group + (*v).first + " = \"" + (*v).second + "\"\n";
+    v++;
+  }
+
+  std::map< std::string, QueryResult >::iterator g = res.groups.begin();
+  while(g != res.groups.end()) {
+    s += group + (*g).first + " = {}\n";
+    s += loadresultstring((*g).second, group + (*g).first + ".");
+    g++;
+  }
+
+  return s;
+}
+
+char xml[] =
+  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+  "<group name=\"dims\">\n"
+  "  <value name=\"fisk\" value=\"42\"/>"
+  "  <value name=\"futte\" value=\"bamse\"/>"
+  "  <group name=\"dims2\">\n"
+  "    <value name=\"fisk2\" value=\"42\"/>"
+  "    <value name=\"futte2\" value=\"bamse\"/>"
+  "  </group>\n"
+  "  <group name=\"dims3\">\n"
+  "    <value name=\"fisk3\" value=\"42\"/>"
+  "    <value name=\"futte3\" value=\"bamse\"/>"
+  "  </group>\n"
+  "</group>\n";
+
+int main()
+{
+  ExternalDataQueryParser e(xml);
+  e.parse();
+
+  printf("%s\n", loadresultstring(e.result).c_str());
+
+  return 0;
+}
+
+#endif
diff --git a/server/src/externaldataqueryparser.h b/server/src/externaldataqueryparser.h
new file mode 100644
index 0000000..1b760de
--- /dev/null
+++ b/server/src/externaldataqueryparser.h
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ *            externaldataqueryparser.h
+ *
+ *  Tue May  6 17:02:36 CEST 2008
+ *  Copyright 2008 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup
+ *  deva@aasimon.org, elsenator@gmail.com and piparum@piparum.dk
+ ****************************************************************************/
+
+/*
+ *  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_EXTERNALDATAQUERYPARSER_H__
+#define __PRACRO_EXTERNALDATAQUERYPARSER_H__
+
+#include "queryresult.h"
+#include "sax_parser.h"
+
+#include <vector>
+
+/**
+ * This class parses xml entyties into a QueryResult structure.
+ */
+class ExternalDataQueryParser : public SAXParser {
+public:
+  ExternalDataQueryParser(std::string document);
+
+  void startTag(std::string name, std::map< std::string, std::string> attributes);
+  void endTag(std::string name);
+
+  QueryResult result;
+
+protected:
+  int readData(char *data, size_t size);
+
+private:
+  // For read
+  int p;
+  std::string document;
+
+  std::vector< QueryResult * > stack;
+};
+
+#endif/*__PRACRO_EXTERNALDATAQUERYPARSER_H__*/
-- 
cgit v1.2.3