summaryrefslogtreecommitdiff
path: root/service/apiImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'service/apiImpl.cpp')
-rw-r--r--service/apiImpl.cpp70
1 files changed, 40 insertions, 30 deletions
diff --git a/service/apiImpl.cpp b/service/apiImpl.cpp
index 5a1e7a6..01f06c7 100644
--- a/service/apiImpl.cpp
+++ b/service/apiImpl.cpp
@@ -1,51 +1,53 @@
#include "apiImpl.h"
#include "uptr.h"
-#include <sql/getServices.sql.h>
#include <buffer.h>
#include <compileTimeFormatter.h>
+#include <sql/getServices.sql.h>
-#include <libxml/xpath.h>
-#include <libxml/xpathInternals.h>
+#include <curl/curl.h>
#include <libxml/HTMLparser.h>
#include <libxml/HTMLtree.h>
-#include <curl/curl.h>
+#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
#define CESSO(curl, opt, expr) \
BOOST_VERIFY_MSG(CURLE_OK == curl_easy_setopt(curl.get(), opt, expr), "Failed setting option " #opt);
namespace MirrorSearch {
SearchImpl::SearchImpl(const DB::ConnectionPoolPtr & db) :
- IceTray::AbstractDatabaseClient(db),
- log(LOGMANAGER()->getLogger<SearchImpl>())
+ IceTray::AbstractDatabaseClient(db), log(LOGMANAGER()->getLogger<SearchImpl>())
{
}
- SearchServices SearchImpl::getServices(const ::Ice::Current&)
+ SearchServices
+ SearchImpl::getServices(const ::Ice::Current &)
{
return fetch<SearchServices>(sql::getServices);
}
- template<typename Fmt, typename ... P>
+ template<typename Fmt, typename... P>
void
- libxmlErrorHandler(const std::string & fn, const P & ... p)
+ libxmlErrorHandler(const std::string & fn, const P &... p)
{
throw XmlError(Fmt::get(fn, xmlGetLastError()->message, p...));
}
- template<typename Fmt, typename ... P>
- auto lEHB(const P & ... p)
+ template<typename Fmt, typename... P>
+ auto
+ lEHB(const P &... p)
{
return std::bind(&libxmlErrorHandler<Fmt, P...>, std::placeholders::_1, p...);
}
- template<typename Fmt, typename ... P>
+ template<typename Fmt, typename... P>
void
- curlErrorHandler(const std::string & fn, const char * errbuf, const P & ... p)
+ curlErrorHandler(const std::string & fn, const char * errbuf, const P &... p)
{
throw CurlError(Fmt::get(fn, errbuf, p...));
}
- template<typename Fmt, typename ... P>
- auto cEHB(const char * errbuf, const P & ... p)
+ template<typename Fmt, typename... P>
+ auto
+ cEHB(const char * errbuf, const P &... p)
{
return std::bind(&curlErrorHandler<Fmt, P...>, std::placeholders::_1, errbuf, p...);
}
@@ -57,18 +59,21 @@ namespace MirrorSearch {
typedef std::function<size_t(const char *, size_t)> CurlWriteCallback;
- static size_t write_callback(char * ptr, size_t size, size_t nmemb, void * userdata)
+ static size_t
+ write_callback(char * ptr, size_t size, size_t nmemb, void * userdata)
{
return (*(MirrorSearch::CurlWriteCallback *)(userdata))(ptr, size * nmemb);
}
AdHocFormatter(Read, "Failed to read in %? (%?) [%?]");
- UPtr<xmlDoc> getDoc(const SearchServicePtr & ss, const std::string & fn) {
+ UPtr<xmlDoc>
+ getDoc(const SearchServicePtr & ss, const std::string & fn)
+ {
auto fmt = AdHoc::Buffer::getFormat(ss->baseurl);
auto url = (fmt % fn).str();
char errbuf[CURL_ERROR_SIZE] = "";
- xmlParserCtxtSPtr ctx { nullptr, nullptr };
+ xmlParserCtxtSPtr ctx {nullptr, nullptr};
auto curl = make_unique(curl_easy_init, curl_easy_cleanup, cEHB<Read>(errbuf, url));
BOOST_ASSERT(curl);
@@ -76,8 +81,8 @@ namespace MirrorSearch {
CESSO(curl, CURLOPT_WRITEFUNCTION, write_callback);
CurlWriteCallback cb = [&ctx, &url, &ss](auto data, auto size) {
if (!ctx) {
- ctx = make_unique(htmlCreatePushParserCtxt, htmlFreeParserCtxt, lEHB<Read>(url),
- (xmlSAXHandlerPtr)NULL, (void*)NULL, data, size, url.c_str(), XML_CHAR_ENCODING_NONE);
+ ctx = make_unique(htmlCreatePushParserCtxt, htmlFreeParserCtxt, lEHB<Read>(url), (xmlSAXHandlerPtr)NULL,
+ (void *)NULL, data, size, url.c_str(), XML_CHAR_ENCODING_NONE);
htmlCtxtUseOptions(ctx.get(), ss->parserflags);
}
else {
@@ -99,7 +104,7 @@ namespace MirrorSearch {
CESSO(curl, CURLOPT_TCP_FASTOPEN, 1L);
CESSO(curl, CURLOPT_FAILONERROR, 1L);
if (curl_easy_perform(curl.get()) != CURLE_OK) {
- curlErrorHandler<Read>(failingFunction((void*)&curl_easy_perform), errbuf, url);
+ curlErrorHandler<Read>(failingFunction((void *)&curl_easy_perform), errbuf, url);
}
if (!ctx) {
throw CurlError("Did not retrieve any data.");
@@ -109,27 +114,31 @@ namespace MirrorSearch {
throw XmlError("Could not construct a document.");
}
- UPtr<xmlDoc> doc = { ctx->myDoc, xmlFreeDoc };
+ UPtr<xmlDoc> doc = {ctx->myDoc, xmlFreeDoc};
return doc;
}
AdHocFormatter(XPathCtx, "Failed to create xpath context in %? (%?)");
- static auto getXPathCxt(const xmlDocSPtr & doc)
+ static auto
+ getXPathCxt(const xmlDocSPtr & doc)
{
return make_unique(xmlXPathNewContext, xmlXPathFreeContext, lEHB<XPathCtx>(), doc.get());
}
AdHocFormatter(XPathEval, "Failed to evaluate xpath in %? (%?) [%?]");
- static auto getXPathObj(const ::std::string & xpath, const xmlXPathContextSPtr & ctx, xmlXPathObjectType type)
+ static auto
+ getXPathObj(const ::std::string & xpath, const xmlXPathContextSPtr & ctx, xmlXPathObjectType type)
{
- auto xpathObj = make_unique(xmlXPathEvalExpression, xmlXPathFreeObject, lEHB<XPathEval>(xpath), BAD_CAST xpath.c_str(), ctx.get());
+ auto xpathObj = make_unique(
+ xmlXPathEvalExpression, xmlXPathFreeObject, lEHB<XPathEval>(xpath), BAD_CAST xpath.c_str(), ctx.get());
if (xpathObj->type != type) {
throw XmlError("Xpath evaluates to wrong type " + xpath);
}
return xpathObj;
}
- void SearchImpl::callService(const ::std::string & fn, const SearchServicePtr & s, SearchHits & sh) const
+ void
+ SearchImpl::callService(const ::std::string & fn, const SearchServicePtr & s, SearchHits & sh) const
{
auto doc = getDoc(s, fn);
auto xpathCtx = getXPathCxt(doc);
@@ -142,12 +151,13 @@ namespace MirrorSearch {
xpathCtx->node = xpathObj->nodesetval->nodeTab[row];
auto xpathObjI = getXPathObj(s->urlxpath, xpathCtx, xmlXPathObjectType::XPATH_STRING);
if (xpathObjI->stringval && *xpathObjI->stringval) {
- sh.push_back(std::make_shared<SearchHit>(0, s->id, (const char *) xpathObjI->stringval));
+ sh.push_back(std::make_shared<SearchHit>(0, s->id, (const char *)xpathObjI->stringval));
}
}
}
- SearchHits SearchImpl::getMatches(const ::std::string fn, const ::Ice::Current & c)
+ SearchHits
+ SearchImpl::getMatches(const ::std::string fn, const ::Ice::Current & c)
{
SearchHits sh;
for (const auto & s : getServices(c)) {
@@ -156,7 +166,8 @@ namespace MirrorSearch {
return sh;
}
- ::IceUtil::Optional<::std::string> SearchImpl::feelingLucky(const ::std::string fn, const ::Ice::Current & c)
+ ::IceUtil::Optional<::std::string>
+ SearchImpl::feelingLucky(const ::std::string fn, const ::Ice::Current & c)
{
const auto ms = getMatches(fn, c);
if (ms.empty())
@@ -164,4 +175,3 @@ namespace MirrorSearch {
return ms.front()->url;
}
}
-