1 #include <Poco/DOM/DOMParser.h>
2 #include <Poco/DOM/DOMWriter.h>
3 #include <Poco/DOM/Document.h>
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 #include <Poco/DOM/Attr.h>
11 #include <Poco/SharedPtr.h>
12 #include <Poco/AutoPtr.h>
25 :sourceSchema(istrSchema), sourceDocument(istrDocument),
errorMsg(
""), _IsError(false), maxDocId(0)
33 void SphinxDataSource::save(Poco::XML::Node* pNode, std::ostream& os)
35 Poco::XML::DOMWriter writer;
36 writer.setNewLine(
"\n");
37 writer.setOptions(Poco::XML::XMLWriter::PRETTY_PRINT | Poco::XML::XMLWriter::WRITE_XML_DECLARATION);
38 writer.writeNode(os, pNode);
48 Poco::AutoPtr<Poco::XML::Document> pOutDoc =
new Poco::XML::Document;
50 pOutDoc->appendChild(pRoot);
52 Poco::XML::DOMParser parser;
53 Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&sourceSchema);
54 Poco::XML::NodeIterator it_schema(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
55 Poco::XML::Node* pNode = it_schema.nextNode();
56 Poco::XML::Node* schemaNode = pNode;
66 pNode = it_schema.nextNode();
69 Poco::AutoPtr<Poco::XML::Element> pSchema =
static_cast<Poco::XML::Element*
>(pOutDoc->importNode(schemaNode,
true));
70 pRoot->appendChild(pSchema);
72 pDoc = parser.parse(&sourceDocument);
73 Poco::XML::NodeIterator it(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
74 pNode = it.nextNode();
77 unsigned long long foundMaxDocId = 0;
82 Poco::AutoPtr<Poco::XML::Element> pDocument =
static_cast<Poco::XML::Element*
>(pOutDoc->importNode(pNode,
true));
83 pRoot->appendChild(pDocument);
87 Poco::AutoPtr<Poco::XML::NamedNodeMap> pMap = pNode->attributes();
90 for (
size_t i=0;i<pMap->length();++i)
96 foundMaxDocId = std::stoull(pMap->item(i)->nodeValue());
105 if (maxDocId < foundMaxDocId)
106 maxDocId = foundMaxDocId;
108 pNode = it.nextNode();
112 pRoot->appendChild(pHceParameters);
115 pHceParameters->appendChild(pHceDocs);
119 Poco::XML::Attr* pAttrOld = pHceDocs->addAttributeNodeNP(0, pAttrMaxDocId.get());
121 pHceDocs->addAttributeNodeNP(pAttrOld, pAttrDocuments.get());
123 Poco::AutoPtr<Poco::XML::NamedNodeMap> pMap = pHceDocs->attributes();
126 for (
size_t i=0;i<pMap->length();++i)
129 pMap->item(i)->setNodeValue(std::to_string(maxDocId));
131 pMap->item(i)->setNodeValue(std::to_string(documents));
138 catch(Poco::Exception& e)
140 errorMsg = e.displayText();
143 catch(std::exception& e)
153 std::stringstream out;
155 if (dataSource.isError())
156 throw Poco::Exception(dataSource.getErrorMsg());
158 return os << out.str();