X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-z3950.c;h=63202f3bb22bcf50e434a10cc062935b2499c82c;hp=b08210876889ee1756d3163609541e45eea80ac6;hb=3dbc44820fa5b82541856e83a370f6a1dfddc9a9;hpb=192c53b56174fa2d80db61029ba95bfa2a1a480a diff --git a/src/zoom-z3950.c b/src/zoom-z3950.c index b082108..63202f3 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); @@ -653,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 = @@ -1140,8 +1140,8 @@ void ZOOM_handle_facet_list(ZOOM_resultset r, Z_FacetList *fl) } } -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++) @@ -1195,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++) @@ -1268,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; @@ -1281,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); } @@ -1289,13 +1292,16 @@ 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; - ZOOM_memcached_hitcount(c, resultset); + ZOOM_memcached_hitcount(c, resultset, sr->additionalSearchInfo, + resultCountPrecision); resultset->live_set = 2; handle_Z3950_records(c, sr->records, 0); } @@ -1438,6 +1444,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)); @@ -1460,6 +1468,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) @@ -1544,7 +1554,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; @@ -1554,7 +1564,7 @@ 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); ZOOM_memcached_search(c, resultset); @@ -1567,16 +1577,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 = resultset->size - *start; + ZOOM_set_dset_error(c, YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, "Bib-1", + 0, 0); } 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++) { @@ -1716,7 +1723,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);