HCE project C++ developers source code library  1.1.1
HCE project developer library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
SphinxSchemaFile.cpp
Go to the documentation of this file.
1 #include <Poco/DOM/DOMParser.h>
2 #include <Poco/DOM/DOMWriter.h>
3 
4 #include <Poco/DOM/NodeIterator.h>
5 #include <Poco/DOM/NodeFilter.h>
6 #include <Poco/DOM/AutoPtr.h>
7 #include <Poco/DOM/NamedNodeMap.h>
8 #include <Poco/XML/XMLWriter.h>
9 
10 #include <Poco/SharedPtr.h>
11 #include <Poco/AutoPtr.h>
12 
13 #include <fstream>
14 #include <sstream>
15 
16 #include "SphinxDataSource.hpp"
17 #include "SphinxSchemaFile.hpp"
18 
19 namespace HCE
20 {
21 namespace sphinx
22 {
23 //-----------------------------------------------------------------------------
24 SphinxSchemaFile::SphinxSchemaFile(std::istream& istrSchema)
25 :sourceSchema(istrSchema), errorMsg(""), _IsError(false), attributesCount(0)
26 {
27 }
28 //-----------------------------------------------------------------------------
29 bool SphinxSchemaFile::getFields(std::vector<std::pair<std::string, int> >& Vec)
30 {
31  errorMsg.clear();
32  Vec.clear();
33  try
34  {
35  Poco::XML::DOMParser parser;
36  Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&sourceSchema);
37  Poco::XML::NodeIterator it_doc(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
38  Poco::XML::Node* pNode = it_doc.nextNode();
39 
40  while (pNode)
41  {
42  if (pNode->nodeName() == sphinx_data_source_const::fieldTag)
43  {
44  Poco::AutoPtr<Poco::XML::NamedNodeMap> pMap = pNode->attributes();
45  if (!pMap.isNull())
46  {
47  std::string name;
48  int weight=0;
49  for (size_t i=0;i<pMap->length();++i)
50  {
51  if (pMap->item(i)->nodeName()==sphinx_data_source_const::nameAttrTag)
52  name = pMap->item(i)->nodeValue();
53  if (pMap->item(i)->nodeName()==sphinx_data_source_const::weightAttrTag)
54  {
55  try
56  {
57  weight = std::stoul(pMap->item(i)->nodeValue());
58  }
59  catch(std::exception& exc)
60  {
61  throw Poco::Exception("Attribute '"+name+"' have invalid_argument ("+exc.what()+")");
62  }
63  }
64  }
65  Vec.push_back(std::make_pair(name, weight));
66  }
67  }
68  pNode = it_doc.nextNode();
69  }
70  _IsError = false;
71  }
72  catch(Poco::Exception& e)
73  {
74  errorMsg = e.message();
75  _IsError = true;
76  }
77  return !_IsError;
78 }
79 //-----------------------------------------------------------------------------
80 bool SphinxSchemaFile::getNames(std::vector<std::string>& names)
81 {
82  errorMsg.clear();
83  names.clear();
84  attributesCount = 0;
85  try
86  {
87  Poco::XML::DOMParser parser;
88  Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&sourceSchema);
89  Poco::XML::NodeIterator it_doc(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
90  Poco::XML::Node* pNode = it_doc.nextNode();
91 
92  while (pNode)
93  {
94  if ((pNode->nodeName()==sphinx_data_source_const::fieldTag) || (pNode->nodeName()==sphinx_data_source_const::attrTag))
95  {
96  Poco::AutoPtr<Poco::XML::NamedNodeMap> pMap = pNode->attributes();
97  if (!pMap.isNull())
98  {
99  for (size_t i=0;i<pMap->length();++i)
100  if (pMap->item(i)->nodeName()==sphinx_data_source_const::nameAttrTag)
101  names.push_back(pMap->item(i)->nodeValue());
102  }
103  if (pNode->nodeName()==sphinx_data_source_const::attrTag)
104  ++attributesCount;
105  }
106  pNode = it_doc.nextNode();
107  }
108  _IsError = false;
109  }
110  catch(Poco::Exception& e)
111  {
112  errorMsg = e.message();
113  _IsError = true;
114  }
115  return !_IsError;
116 }
117 //-----------------------------------------------------------------------------
118 //-----------------------------------------------------------------------------
119 } // namespace sphinx
120 } // namespace HCE