X-Git-Url: http://git.indexdata.com/?p=mp-sparql-moved-to-github.git;a=blobdiff_plain;f=src%2Ffilter_sparql.cpp;h=8aa9bab6bc72b9dae3bd0c3f9f9385704691dee1;hp=e5e3b12b87ad1c1df2dcb8f8a10c692199374b45;hb=fea72715438bf7e340fb08a22fbb97df31dd2ec8;hpb=88c86b8cb78ce5e9bfae8a64196bfdf2133265ff diff --git a/src/filter_sparql.cpp b/src/filter_sparql.cpp index e5e3b12..8aa9bab 100644 --- a/src/filter_sparql.cpp +++ b/src/filter_sparql.cpp @@ -269,26 +269,67 @@ static xmlNode *get_result(xmlDoc *doc, Odr_int *sz, Odr_int pos) { xmlNode *ptr = xmlDocGetRootElement(doc); Odr_int cur = 0; - for (; ptr; ptr = ptr->next) - if (ptr->type == XML_ELEMENT_NODE && - !strcmp((const char *) ptr->name, "sparql")) - break; - if (ptr) + + if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "RDF")) { - for (ptr = ptr->children; ptr; ptr = ptr->next) - if (ptr->type == XML_ELEMENT_NODE && - !strcmp((const char *) ptr->name, "results")) - break; + ptr = ptr->children; + + while (ptr && ptr->type != XML_ELEMENT_NODE) + ptr = ptr->next; + if (ptr && ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "Description")) + { + xmlNode *p = ptr->children; + + while (p && p->type != XML_ELEMENT_NODE) + p = p->next; + if (p && p->type == XML_ELEMENT_NODE && + !strcmp((const char *) p->name, "type")) + { /* SELECT RESULT */ + for (ptr = ptr->children; ptr; ptr = ptr->next) + if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "solution")) + { + if (cur++ == pos) + break; + } + } + else + { /* CONSTRUCT result */ + for (; ptr; ptr = ptr->next) + if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "Description")) + { + if (cur++ == pos) + break; + } + } + } } - if (ptr) + else { - for (ptr = ptr->children; ptr; ptr = ptr->next) + for (; ptr; ptr = ptr->next) if (ptr->type == XML_ELEMENT_NODE && - !strcmp((const char *) ptr->name, "result")) - { - if (cur++ == pos) + !strcmp((const char *) ptr->name, "sparql")) + break; + if (ptr) + { + for (ptr = ptr->children; ptr; ptr = ptr->next) + if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "results")) break; - } + } + if (ptr) + { + for (ptr = ptr->children; ptr; ptr = ptr->next) + if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "result")) + { + if (cur++ == pos) + break; + } + } } if (sz) *sz = cur; @@ -321,7 +362,6 @@ Z_Records *yf::SPARQL::Session::fetch( if (!node) break; assert(node->type == XML_ELEMENT_NODE); - assert(!strcmp((const char *) node->name, "result")); xmlNode *tmp = xmlCopyNode(node, 1); xmlBufferPtr buf = xmlBufferCreate(); xmlNodeDump(buf, tmp->doc, tmp, 0, 0); @@ -353,6 +393,8 @@ Z_APDU *yf::SPARQL::Session::run_sparql(mp::Package &package, z_HTTP_header_add(odr, &gdu->u.HTTP_Request->headers, "Content-Type", "application/x-www-form-urlencoded"); + z_HTTP_header_add(odr, &gdu->u.HTTP_Request->headers, + "Accept", "application/rdf+xml"); const char *names[2]; names[0] = "query"; names[1] = 0; @@ -371,7 +413,24 @@ Z_APDU *yf::SPARQL::Session::run_sparql(mp::Package &package, Z_GDU *gdu_resp = http_package.response().get(); Z_APDU *apdu_res = 0; - if (gdu_resp && gdu_resp->which == Z_GDU_HTTP_Response) + if (!gdu_resp || gdu_resp->which != Z_GDU_HTTP_Response) + { + yaz_log(YLOG_LOG, "sparql: no HTTP response"); + apdu_res = odr.create_searchResponse(apdu_req, + YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, + "no HTTP response from backend"); + } + else if (gdu_resp->u.HTTP_Response->code != 200) + { + mp::wrbuf w; + + wrbuf_printf(w, "sparql: HTTP error %d from backend", + gdu_resp->u.HTTP_Response->code); + apdu_res = odr.create_searchResponse(apdu_req, + YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, + w.c_str()); + } + else { Z_HTTP_Response *resp = gdu_resp->u.HTTP_Response; FrontendSetPtr fset(new FrontendSet); @@ -429,13 +488,6 @@ Z_APDU *yf::SPARQL::Session::run_sparql(mp::Package &package, } } } - else - { - yaz_log(YLOG_LOG, "sparql: no HTTP response"); - apdu_res = odr.create_searchResponse(apdu_req, - YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, - "no HTTP response from backend"); - } return apdu_res; }