+zoom_ret ZOOM_connection_Z3950_search(ZOOM_connection c)
+{
+ int i = 0;
+ const char *syntax = 0;
+ const char *elementSetName = 0;
+ const char *schema = 0;
+ ZOOM_resultset resultset;
+ int *start, *count;
+
+ if (!c->tasks)
+ return zoom_complete;
+ assert(c->tasks->which == ZOOM_TASK_SEARCH);
+ resultset = c->tasks->u.search.resultset;
+ start = &c->tasks->u.search.start;
+ count = &c->tasks->u.search.count;
+ syntax = c->tasks->u.search.syntax;
+ elementSetName = c->tasks->u.search.elementSetName;
+ schema = c->tasks->u.search.schema;
+
+ yaz_log(c->log_details, "%p send_present 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));
+
+ 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",
+ "start/count < 0", 0);
+ }
+
+ if (resultset->live_set)
+ {
+ if (*start >= resultset->size)
+ return zoom_complete;
+ 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++)
+ {
+ ZOOM_record rec =
+ ZOOM_record_cache_lookup(resultset, i + *start,
+ syntax, elementSetName, schema);
+ if (!rec)
+ break;
+ }
+ *start += i;
+ *count -= i;
+
+ if (*count == 0 && resultset->live_set)
+ return zoom_complete;
+
+ if (resultset->live_set == 2)
+ return Z3950_send_present(c);
+ else
+ return Z3950_send_search(c);
+}
+