diff options
Diffstat (limited to 'server/src/queryparser.cc')
| -rw-r--r-- | server/src/queryparser.cc | 112 | 
1 files changed, 112 insertions, 0 deletions
| diff --git a/server/src/queryparser.cc b/server/src/queryparser.cc new file mode 100644 index 0000000..38e3037 --- /dev/null +++ b/server/src/queryparser.cc @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            queryparser.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 "queryparser.h" + +QueryParser::QueryParser(std::string document) +{ +  this->document = document; +  p = 0; +  stack.push_back(&result); +} + +void QueryParser::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 QueryParser::endTag(std::string name) +{ +  if(name == "group") stack.pop_back(); +} + +// FIXME: This is *not* the optimal way to do this. +int QueryParser::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() +{ +  QueryParser e(xml); +  e.parse(); + +  printf("%s\n", loadresultstring(e.result).c_str()); + +  return 0; +} + +#endif | 
