+ rc->next = r->record_hash[record_hash(pos)];
+ r->record_hash[record_hash(pos)] = rc;
+}
+
+static ZOOM_record record_cache_lookup(ZOOM_resultset r, int pos)
+{
+ ZOOM_record_cache rc;
+ const char *elementSetName =
+ ZOOM_resultset_option_get(r, "elementSetName");
+ const char *syntax =
+ ZOOM_resultset_option_get(r, "preferredRecordSyntax");
+
+ for (rc = r->record_hash[record_hash(pos)]; rc; rc = rc->next)
+ {
+ if (pos == rc->pos)
+ {
+ if (strcmp_null(r->schema, rc->schema))
+ continue;
+ if (strcmp_null(elementSetName,rc->elementSetName))
+ continue;
+ if (strcmp_null(syntax, rc->syntax))
+ continue;
+ return &rc->rec;
+ }
+ }
+ return 0;
+}
+
+static void handle_records(ZOOM_connection c, Z_Records *sr,
+ int present_phase)
+{
+ ZOOM_resultset resultset;
+ int *start, *count;
+
+ if (!c->tasks)
+ return ;
+ switch (c->tasks->which)
+ {
+ case ZOOM_TASK_SEARCH:
+ resultset = c->tasks->u.search.resultset;
+ start = &c->tasks->u.search.start;
+ count = &c->tasks->u.search.count;
+ break;
+ case ZOOM_TASK_RETRIEVE:
+ resultset = c->tasks->u.retrieve.resultset;
+ start = &c->tasks->u.retrieve.start;
+ count = &c->tasks->u.retrieve.count;
+ break;
+ default:
+ return;
+ }
+ if (sr && sr->which == Z_Records_NSD)
+ response_default_diag(c, sr->u.nonSurrogateDiagnostic);
+ else if (sr && sr->which == Z_Records_multipleNSD)
+ {
+ if (sr->u.multipleNonSurDiagnostics->num_diagRecs >= 1)
+ response_diag(c, sr->u.multipleNonSurDiagnostics->diagRecs[0]);
+ else
+ set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
+ }
+ else
+ {
+ if (*count + *start > resultset->size)
+ *count = resultset->size - *start;
+ if (*count < 0)
+ *count = 0;
+ if (sr && sr->which == Z_Records_DBOSD)
+ {
+ int i;
+ NMEM nmem = odr_extract_mem(c->odr_in);
+ Z_NamePlusRecordList *p =
+ sr->u.databaseOrSurDiagnostics;
+ for (i = 0; i<p->num_records; i++)
+ {
+ record_cache_add(resultset, p->records[i], i + *start);
+ }
+ *count -= i;
+ *start += i;
+ yaz_log(log_details,
+ "handle_records resultset=%p start=%d count=%d",
+ resultset, *start, *count);
+
+ /* transfer our response to search_nmem .. we need it later */
+ nmem_transfer(resultset->odr->mem, nmem);
+ nmem_destroy(nmem);
+ if (present_phase && p->num_records == 0)
+ {
+ /* present response and we didn't get any records! */
+ Z_NamePlusRecord *myrec =
+ zget_surrogateDiagRec(resultset->odr, 0, 14, 0);
+ record_cache_add(resultset, myrec, *start);
+ }
+ }
+ else if (present_phase)
+ {
+ /* present response and we didn't get any records! */
+ Z_NamePlusRecord *myrec =
+ zget_surrogateDiagRec(resultset->odr, 0, 14, 0);
+ record_cache_add(resultset, myrec, *start);
+ }
+ }
+}
+
+static void handle_present_response(ZOOM_connection c, Z_PresentResponse *pr)
+{
+ handle_records(c, pr->records, 1);