X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=d9a98f8eb89b47c00d16093b36e7cc4e40ac29e4;hp=e41c9f6eba48f8248822b8bd5347d8e10fe05a14;hb=2ad2651374674c895ad59b267da6fe2d8665fabd;hpb=1c256a41a684b68d2dea7c5bad34e02293a60de9 diff --git a/client/client.c b/client/client.c index e41c9f6..d9a98f8 100644 --- a/client/client.c +++ b/client/client.c @@ -80,7 +80,6 @@ static file_history_t file_history = 0; -static char webservice_type[10]; static char sru_method[10] = "soap"; static char sru_version[10] = "1.2"; static char *codeset = 0; /* character set for output */ @@ -1283,6 +1282,11 @@ static int send_srw_host_path(Z_SRW_PDU *sr, const char *host_port, { yaz_sru_soap_encode(gdu->u.HTTP_Request, sr, out, charset); } + else if (!yaz_matchstr(sru_method, "solr")) + { + yaz_solr_encode(gdu->u.HTTP_Request, sr, out, charset); + } + return send_gdu(gdu); } @@ -1410,43 +1414,6 @@ static int send_SRW_scanRequest(const char *arg, int pos, int num) return send_srw(sr); } -static void encode_SOLR_search(Z_HTTP_Request *hreq, ODR encode, - const char *query) -{ - char *path; - const char *name[10], *value[10]; - char *uri_args; - - name[0] = "q"; - value[0] = query; - name[1] = 0; - - yaz_array_to_uri(&uri_args, encode, (char **) name, (char **) value); - - path = (char *) - odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 4); - - hreq->method = "GET"; - - if (strchr(hreq->path, '?')) - sprintf(path, "%s&%s", hreq->path, uri_args); - else - sprintf(path, "%s?%s", hreq->path, uri_args); - hreq->path = path; -} - -static int send_SOLR_searchRequest(const char *arg) -{ - Z_GDU *gdu; - char *path = yaz_encode_sru_dbpath_odr(out, databaseNames[0]); - - gdu = z_get_HTTP_Request_host_path(out, cur_host, path); - - encode_SOLR_search(gdu->u.HTTP_Request, out, arg); - - return send_gdu(gdu); -} - static int send_SRW_searchRequest(const char *arg) { Z_SRW_PDU *sr = 0; @@ -2837,9 +2804,7 @@ static int cmd_sru(const char *arg) } else { - int r; - strcpy(webservice_type, "sru"); - r = sscanf(arg, "%9s %9s", sru_method, sru_version); + int r = sscanf(arg, "%9s %9s", sru_method, sru_version); if (r >= 1) { if (!yaz_matchstr(sru_method, "post")) @@ -2848,40 +2813,19 @@ static int cmd_sru(const char *arg) ; else if (!yaz_matchstr(sru_method, "soap")) ; + else if (!yaz_matchstr(sru_method, "solr")) + ; else { strcpy(sru_method, "soap"); printf("Unknown SRU method: %s\n", arg); - printf("Specify one of POST, GET, SOAP\n"); + printf("Specify one of POST, GET, SOAP, SOLR\n"); } } } return 0; } -static int cmd_webservice(const char *arg) -{ - if (!*arg) - { - printf("Webservice: %s\n", webservice_type); - } - else - { - if (!strcmp(arg, "sru")) - ; - else if (!strcmp(arg, "solr")) - ; - else - { - printf("Unknown webservice type\n"); - return 0; - } - strcpy(webservice_type, arg); - } - return 0; -} - - static int cmd_find(const char *arg) { if (!*arg) @@ -2896,16 +2840,8 @@ static int cmd_find(const char *arg) session_connect(cur_host); if (!conn) return 0; - if (!strcmp(webservice_type, "solr")) - { - if (!send_SOLR_searchRequest(arg)) - return 0; - } - else - { - if (!send_SRW_searchRequest(arg)) - return 0; - } + if (!send_SRW_searchRequest(arg)) + return 0; #else return 0; #endif @@ -4283,8 +4219,6 @@ static void initialize(const char *rc_file) exit(1); } - strcpy(webservice_type, "sru"); - setvbuf(stdout, 0, _IONBF, 0); if (apdu_file) odr_setprint(print, apdu_file); @@ -4417,97 +4351,11 @@ static void handle_srw_scan_response(Z_SRW_scanResponse *res) handle_srw_scan_term(res->terms + i); } -static int decode_SOLR_response(const char *content_buf, int content_len) -{ - xmlDocPtr doc = xmlParseMemory(content_buf, content_len); - int ret = 0; - xmlNodePtr ptr = 0; - Odr_int hits = 0; - Odr_int start = 0; - - if (!doc) - { - ret = -1; - } - if (doc) - { - xmlNodePtr root = xmlDocGetRootElement(doc); - if (!root) - { - ret = -1; - } - else if (strcmp((const char *) root->name, "response")) - { - ret = -1; - } - else - { - /** look for result node */ - for (ptr = root->children; ptr; ptr = ptr->next) - { - if (ptr->type == XML_ELEMENT_NODE && - !strcmp((const char *) ptr->name, "result")) - break; - } - if (!ptr) - { - ret = -1; - } - } - } - if (ptr) - { /* got result node */ - struct _xmlAttr *attr; - for (attr = ptr->properties; attr; attr = attr->next) - if (attr->children && attr->children->type == XML_TEXT_NODE) - { - if (!strcmp((const char *) attr->name, "numFound")) - { - hits = odr_atoi((const char *) attr->children->content); - } - else if (!strcmp((const char *) attr->name, "start")) - { - start = odr_atoi((const char *) attr->children->content); - } - } - printf("Number of hits: " ODR_INT_PRINTF "\n", hits); - } - if (ptr) - { - xmlNodePtr node; - int offset = 0; - - for (node = ptr->children; node; node = node->next) - { - if (node->type == XML_ELEMENT_NODE) - { - xmlBufferPtr buf = xmlBufferCreate(); - xmlNode *tmp = xmlCopyNode(node, 1); - - printf(ODR_INT_PRINTF "\n", start + offset); - - xmlNodeDump(buf, tmp->doc, tmp, 0, 0); - - xmlFreeNode(tmp); - - fwrite(buf->content, 1, buf->use, stdout); - xmlBufferFree(buf); - offset++; - printf("\n"); - } - } - } - if (doc) - xmlFreeDoc(doc); - return ret; -} - static void http_response(Z_HTTP_Response *hres) { int ret = -1; const char *connection_head = z_HTTP_header_lookup(hres->headers, "Connection"); - if (hres->code != 200) { printf("HTTP Error Status=%d\n", hres->code); @@ -4515,57 +4363,71 @@ static void http_response(Z_HTTP_Response *hres) if (!yaz_srw_check_content_type(hres)) printf("Content type does not appear to be XML\n"); - else if (!strcmp(webservice_type, "solr")) - { - decode_SOLR_response(hres->content_buf, hres->content_len); - } - else if (!strcmp(webservice_type, "sru")) - { - Z_SOAP *soap_package = 0; - ODR o = odr_createmem(ODR_DECODE); - Z_SOAP_Handler soap_handlers[3] = { - {YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec}, - {YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec}, - {0, 0, 0} - }; - ret = z_soap_codec(o, &soap_package, - &hres->content_buf, &hres->content_len, - soap_handlers); - if (!ret && soap_package->which == Z_SOAP_generic) + else + { + if (!yaz_matchstr(sru_method, "solr")) { - Z_SRW_PDU *sr = (Z_SRW_PDU *) soap_package->u.generic->p; - if (sr->which == Z_SRW_searchRetrieve_response) + Z_SRW_PDU *sr = 0; + ODR o = odr_createmem(ODR_DECODE); + ret = yaz_solr_decode(o, hres, &sr); + + if (ret == 0 && sr->which == Z_SRW_searchRetrieve_response) handle_srw_response(sr->u.response); - else if (sr->which == Z_SRW_explain_response) - handle_srw_explain_response(sr->u.explain_response); - else if (sr->which == Z_SRW_scan_response) - handle_srw_scan_response(sr->u.scan_response); - else if (sr->which == Z_SRW_update_response) - printf("Got update response. Status: %s\n", - sr->u.update_response->operationStatus); else { - printf("Decoding of SRW package failed\n"); + printf("Decoding of SOLR package failed\n"); ret = -1; } - } - else if (soap_package && (soap_package->which == Z_SOAP_fault - || soap_package->which == Z_SOAP_error)) - { - printf("SOAP Fault code %s\n", - soap_package->u.fault->fault_code); - printf("SOAP Fault string %s\n", - soap_package->u.fault->fault_string); - if (soap_package->u.fault->details) - printf("SOAP Details %s\n", - soap_package->u.fault->details); + odr_destroy(o); } else { - printf("z_soap_codec failed. (no SOAP error)\n"); - ret = -1; + Z_SOAP *soap_package = 0; + ODR o = odr_createmem(ODR_DECODE); + Z_SOAP_Handler soap_handlers[3] = { + {YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec}, + {YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec}, + {0, 0, 0} + }; + ret = z_soap_codec(o, &soap_package, + &hres->content_buf, &hres->content_len, + soap_handlers); + if (!ret && soap_package->which == Z_SOAP_generic) + { + Z_SRW_PDU *sr = (Z_SRW_PDU *) soap_package->u.generic->p; + if (sr->which == Z_SRW_searchRetrieve_response) + handle_srw_response(sr->u.response); + else if (sr->which == Z_SRW_explain_response) + handle_srw_explain_response(sr->u.explain_response); + else if (sr->which == Z_SRW_scan_response) + handle_srw_scan_response(sr->u.scan_response); + else if (sr->which == Z_SRW_update_response) + printf("Got update response. Status: %s\n", + sr->u.update_response->operationStatus); + else + { + printf("Decoding of SRW package failed\n"); + ret = -1; + } + } + else if (soap_package && (soap_package->which == Z_SOAP_fault + || soap_package->which == Z_SOAP_error)) + { + printf("SOAP Fault code %s\n", + soap_package->u.fault->fault_code); + printf("SOAP Fault string %s\n", + soap_package->u.fault->fault_string); + if (soap_package->u.fault->details) + printf("SOAP Details %s\n", + soap_package->u.fault->details); + } + else + { + printf("z_soap_codec failed. (no SOAP error)\n"); + ret = -1; + } + odr_destroy(o); } - odr_destroy(o); } if (ret) close_session(); /* close session on error */ @@ -5111,7 +4973,6 @@ static struct { {"init", cmd_init, "", NULL,0,NULL}, {"sru", cmd_sru, " ", NULL,0,NULL}, {"url", cmd_url, "", NULL,0,NULL}, - {"webservice", cmd_webservice, "", NULL,0,NULL}, {"exit", cmd_quit, "",NULL,0,NULL}, {0,0,0,0,0,0} };