X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-z3950.c;h=9c810e80cd8c295f2cb64b2ea1f888aff38874fa;hp=556e258d57eda59f49d7bf9afb2ea8b25a1b9286;hb=4d1450cc691292cef5bcfdd41cefc030e4dabbf6;hpb=c65e569219f8a60e2cba17ddc648a48a7b8b5096 diff --git a/src/zoom-z3950.c b/src/zoom-z3950.c index 556e258..9c810e8 100644 --- a/src/zoom-z3950.c +++ b/src/zoom-z3950.c @@ -510,7 +510,7 @@ static int encode_APDU(ZOOM_connection c, Z_APDU *a, ODR out) yaz_oi_set_string_oid(oi, out, yaz_oid_userinfo_cookie, 1, c->cookie_out); } - if (c->client_IP) + if (c->client_IP && a->which == Z_APDU_initRequest) { Z_OtherInformation **oi; yaz_oi_APDU(a, &oi); @@ -609,7 +609,7 @@ zoom_ret ZOOM_connection_Z3950_send_init(ZOOM_connection c) auth->u.open = odr_strdup(c->odr_out, c->user); ireq->idAuthentication = auth; } - if (c->proxy) + if (c->proxy_mode) { yaz_oi_set_string_oid(&ireq->otherInfo, c->odr_out, yaz_oid_userinfo_proxy, 1, c->host_port); @@ -645,7 +645,6 @@ static zoom_ret Z3950_send_search(ZOOM_connection c) const char *elementSetName; const char *smallSetElementSetName; const char *mediumSetElementSetName; - const char *facets; assert(c->tasks); assert(c->tasks->which == ZOOM_TASK_SEARCH); @@ -654,7 +653,7 @@ static zoom_ret Z3950_send_search(ZOOM_connection c) apdu = zget_APDU(c->odr_out, Z_APDU_searchRequest); search_req = apdu->u.searchRequest; - yaz_log(c->log_details, "%p ZOOM_connection_send_search set=%p", c, r); + yaz_log(c->log_details, "%p Z3950_send_search set=%p", c, r); elementSetName = c->tasks->u.search.elementSetName; smallSetElementSetName = @@ -668,15 +667,17 @@ static zoom_ret Z3950_send_search(ZOOM_connection c) if (!mediumSetElementSetName) mediumSetElementSetName = elementSetName; - facets = ZOOM_options_get(r->options, "facets"); - if (facets) { - Z_FacetList *facet_list = yaz_pqf_parse_facet_list(c->odr_out, facets); - if (facet_list) { + if (r->req_facets) + { + Z_FacetList *facet_list = + yaz_pqf_parse_facet_list(c->odr_out, r->req_facets); + if (facet_list) + { Z_OtherInformation **oi = &search_req->additionalSearchInfo; yaz_oi_set_facetlist(oi, c->odr_out, facet_list); } else - yaz_log(YLOG_WARN, "Unable to parse facets: %s", facets); + yaz_log(YLOG_WARN, "Unable to parse facets: %s", r->req_facets); } assert(r); @@ -788,7 +789,7 @@ static zoom_ret Z3950_send_search(ZOOM_connection c) if (!rp) break; } - r->setname = xstrdup(setname); + r->setname = odr_strdup(r->odr, setname); yaz_log(c->log_details, "%p ZOOM_connection_send_search: " "allocating set %s", c, r->setname); } @@ -796,7 +797,7 @@ static zoom_ret Z3950_send_search(ZOOM_connection c) { yaz_log(c->log_details, "%p ZOOM_connection_send_search: using " "default set", c); - r->setname = xstrdup("default"); + r->setname = odr_strdup(r->odr, "default"); } ZOOM_options_set(r->options, "setname", r->setname); } @@ -1121,21 +1122,26 @@ static ZOOM_facet_field get_zoom_facet_field(ODR odr, Z_FacetField *facet) void ZOOM_handle_facet_list(ZOOM_resultset r, Z_FacetList *fl) { int j; - r->num_facets = fl->num; + r->num_res_facets = fl->num; yaz_log(YLOG_DEBUG, "Facets found: %d", fl->num); - r->facets = odr_malloc(r->odr, fl->num * sizeof(*r->facets)); + r->res_facets = odr_malloc(r->odr, fl->num * sizeof(*r->res_facets)); r->facets_names = odr_malloc(r->odr, fl->num * sizeof(*r->facets_names)); for (j = 0; j < fl->num; j++) { - r->facets[j] = get_zoom_facet_field(r->odr, fl->elements[j]); - if (!r->facets[j]) + r->res_facets[j] = get_zoom_facet_field(r->odr, fl->elements[j]); + if (!r->res_facets[j]) + { + r->facets_names[j] = 0; yaz_log(YLOG_DEBUG, "Facet field missing on index %d !", j); - r->facets_names[j] = (char *) ZOOM_facet_field_name(r->facets[j]); + } + else + r->facets_names[j] = (char *) + ZOOM_facet_field_name(r->res_facets[j]); } } -static void handle_facet_result(ZOOM_connection c, ZOOM_resultset r, - Z_OtherInformation *o) +void ZOOM_handle_facet_result(ZOOM_connection c, ZOOM_resultset r, + Z_OtherInformation *o) { int i; for (i = 0; o && i < o->num_elements; i++) @@ -1189,8 +1195,8 @@ static void handle_queryExpression(ZOOM_options opt, const char *name, } -static void handle_search_result(ZOOM_connection c, ZOOM_resultset resultset, - Z_OtherInformation *o) +void ZOOM_handle_search_result(ZOOM_connection c, ZOOM_resultset resultset, + Z_OtherInformation *o) { int i; for (i = 0; o && i < o->num_elements; i++) @@ -1262,6 +1268,7 @@ static void handle_Z3950_search_response(ZOOM_connection c, { ZOOM_resultset resultset; ZOOM_Event event; + const char *resultCountPrecision = "exact"; if (!c->tasks || c->tasks->which != ZOOM_TASK_SEARCH) return; @@ -1275,6 +1282,8 @@ static void handle_Z3950_search_response(ZOOM_connection c, } if (sr->resultSetStatus) { + if (*sr->resultSetStatus == Z_SearchResponse_estimate) + resultCountPrecision = "estimate"; ZOOM_options_set_int(resultset->options, "resultSetStatus", *sr->resultSetStatus); } @@ -1283,37 +1292,27 @@ static void handle_Z3950_search_response(ZOOM_connection c, ZOOM_options_set_int(resultset->options, "presentStatus", *sr->presentStatus); } - handle_search_result(c, resultset, sr->additionalSearchInfo); + ZOOM_options_set(resultset->options, "resultCountPrecision", + resultCountPrecision); + ZOOM_handle_search_result(c, resultset, sr->additionalSearchInfo); - handle_facet_result(c, resultset, sr->additionalSearchInfo); + ZOOM_handle_facet_result(c, resultset, sr->additionalSearchInfo); resultset->size = *sr->resultCount; - resultset->live_set = 2; - -#if HAVE_LIBMEMCACHED_MEMCACHED_H - if (c->mc_st) - { - uint32_t flags = 0; - memcached_return_t rc; - time_t expiration = 36000; - char str[40]; - sprintf(str, ODR_INT_PRINTF, *sr->resultCount); - rc = memcached_set(c->mc_st, - wrbuf_buf(resultset->mc_key),wrbuf_len(resultset->mc_key), - str, strlen(str), expiration, flags); - yaz_log(YLOG_LOG, "Store Z39.50 hit count key=%s value=%s rc=%u %s", - wrbuf_cstr(resultset->mc_key), str, (unsigned) rc, - memcached_last_error_message(c->mc_st)); - } -#endif + ZOOM_memcached_hitcount(c, resultset, sr->additionalSearchInfo, + resultCountPrecision); + resultset->live_set = 2; handle_Z3950_records(c, sr->records, 0); } static void handle_Z3950_sort_response(ZOOM_connection c, Z_SortResponse *res) { if (res->diagnostics && res->num_diagnostics > 0) + { response_diag(c, res->diagnostics[0]); + ZOOM_connection_remove_tasks(c); + } } static void handle_Z3950_scan_response(ZOOM_connection c, Z_ScanResponse *res) @@ -1360,13 +1359,17 @@ static void handle_Z3950_records(ZOOM_connection c, Z_Records *sr, schema = c->tasks->u.search.schema; if (sr && sr->which == Z_Records_NSD) + { response_default_diag(c, sr->u.nonSurrogateDiagnostic); + ZOOM_connection_remove_tasks(c); + } else if (sr && sr->which == Z_Records_multipleNSD) { if (sr->u.multipleNonSurDiagnostics->num_diagRecs >= 1) response_diag(c, sr->u.multipleNonSurDiagnostics->diagRecs[0]); else ZOOM_set_error(c, ZOOM_ERROR_DECODE, 0); + ZOOM_connection_remove_tasks(c); } else { @@ -1448,6 +1451,8 @@ zoom_ret send_Z3950_sort(ZOOM_connection c, ZOOM_resultset resultset) Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_sortRequest); Z_SortRequest *req = apdu->u.sortRequest; + yaz_log(c->log_details, "%p send_Z3950_sort set=%p", c, resultset); + req->num_inputResultSetNames = 1; req->inputResultSetNames = (Z_InternationalString **) odr_malloc(c->odr_out, sizeof(*req->inputResultSetNames)); @@ -1470,6 +1475,8 @@ static zoom_ret Z3950_send_present(ZOOM_connection c) const char *elementSetName = c->tasks->u.search.elementSetName; const char *schema = c->tasks->u.search.schema; + yaz_log(c->log_details, "%p Z3950_send_present", c); + *req->resultSetStartPoint = c->tasks->u.search.start + 1; if (resultset->step > 0 && resultset->step < c->tasks->u.search.count) @@ -1554,7 +1561,7 @@ zoom_ret ZOOM_connection_Z3950_search(ZOOM_connection c) ZOOM_resultset resultset; int *start, *count; - if (!c->tasks) + if (!c->tasks || c->tasks->which == ZOOM_TASK_SORT) return zoom_complete; assert(c->tasks->which == ZOOM_TASK_SEARCH); resultset = c->tasks->u.search.resultset; @@ -1564,38 +1571,11 @@ zoom_ret ZOOM_connection_Z3950_search(ZOOM_connection c) elementSetName = c->tasks->u.search.elementSetName; schema = c->tasks->u.search.schema; - yaz_log(c->log_details, "%p send_present start=%d count=%d", + yaz_log(c->log_details, "%p ZOOM_connection_Z3950_search start=%d count=%d", c, *start, *count); -#if HAVE_LIBMEMCACHED_MEMCACHED_H - /* TODO: add sorting */ - if (c->mc_st && resultset->live_set == 0) - { - size_t v_len; - uint32_t flags; - memcached_return_t rc; - char *v = memcached_get(c->mc_st, wrbuf_buf(resultset->mc_key), - wrbuf_len(resultset->mc_key), - &v_len, &flags, &rc); - if (v) - { - ZOOM_Event event; - WRBUF w = wrbuf_alloc(); + ZOOM_memcached_search(c, resultset); - wrbuf_write(w, v, v_len); - free(v); - resultset->size = odr_atoi(wrbuf_cstr(w)); - - yaz_log(YLOG_LOG, "For key %s got value %s", - wrbuf_cstr(resultset->mc_key), wrbuf_cstr(w)); - - wrbuf_destroy(w); - event = ZOOM_Event_create(ZOOM_EVENT_RECV_SEARCH); - ZOOM_connection_put_event(c, event); - resultset->live_set = 1; - } - } -#endif if (*start < 0 || *count < 0) { ZOOM_set_dset_error(c, YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, "Bib-1", @@ -1605,15 +1585,13 @@ zoom_ret ZOOM_connection_Z3950_search(ZOOM_connection c) if (resultset->live_set) { if (*start >= resultset->size) - return zoom_complete; - if (*start + *count > resultset->size) + *count = 0; + else if (*start + *count >= resultset->size) *count = resultset->size - *start; } if (c->error) /* don't continue on error */ return zoom_complete; - yaz_log(c->log_details, "send_present resultset=%p start=%d count=%d", - resultset, *start, *count); for (i = 0; i < *count; i++) { @@ -1753,7 +1731,8 @@ void ZOOM_handle_Z3950_apdu(ZOOM_connection c, Z_APDU *apdu) case Z_APDU_sortResponse: yaz_log(c->log_api, "%p handle_Z3950_apdu Sort response", c); handle_Z3950_sort_response(c, apdu->u.sortResponse); - ZOOM_connection_remove_task(c); + if (ZOOM_connection_Z3950_search(c) == zoom_complete) + ZOOM_connection_remove_task(c); break; case Z_APDU_scanResponse: yaz_log(c->log_api, "%p handle_Z3950_apdu Scan response", c);