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);
const char *elementSetName;
const char *smallSetElementSetName;
const char *mediumSetElementSetName;
- const char *facets;
assert(c->tasks);
assert(c->tasks->which == ZOOM_TASK_SEARCH);
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 =
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);
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);
}
{
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);
}
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++)
}
-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++)
{
ZOOM_resultset resultset;
ZOOM_Event event;
+ const char *resultCountPrecision = "exact";
if (!c->tasks || c->tasks->which != ZOOM_TASK_SEARCH)
return;
}
if (sr->resultSetStatus)
{
+ if (*sr->resultSetStatus == Z_SearchResponse_estimate)
+ resultCountPrecision = "estimate";
ZOOM_options_set_int(resultset->options, "resultSetStatus",
*sr->resultSetStatus);
}
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);
}
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));
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)
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;
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();
-
- wrbuf_write(w, v, v_len);
- free(v);
- resultset->size = odr_atoi(wrbuf_cstr(w));
+ ZOOM_memcached_search(c, resultset);
- 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",
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++)
{
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);