+#if HAVE_XML2
+static void handle_srw_response(ZOOM_connection c,
+ Z_SRW_searchRetrieveResponse *res)
+{
+ ZOOM_resultset resultset = 0;
+ int i;
+ NMEM nmem;
+
+ if (!c->tasks)
+ return;
+
+ if (c->tasks->which == ZOOM_TASK_SEARCH)
+ resultset = c->tasks->u.search.resultset;
+ else if (c->tasks->which == ZOOM_TASK_RETRIEVE)
+ resultset = c->tasks->u.retrieve.resultset;
+ else
+ return ;
+
+ resultset->size = 0;
+
+ yaz_log(LOG_DEBUG, "got SRW response OK");
+
+ if (res->numberOfRecords)
+ resultset->size = *res->numberOfRecords;
+
+ for (i = 0; i<res->num_records; i++)
+ {
+ int pos;
+
+ Z_NamePlusRecord *npr = (Z_NamePlusRecord *)
+ odr_malloc(c->odr_in, sizeof(Z_NamePlusRecord));
+
+ if (res->records[i].recordPosition &&
+ *res->records[i].recordPosition > 0)
+ pos = *res->records[i].recordPosition - 1;
+ else
+ pos = resultset->start + i;
+
+ npr->databaseName = 0;
+ npr->which = Z_NamePlusRecord_databaseRecord;
+ npr->u.databaseRecord = (Z_External *)
+ odr_malloc(c->odr_in, sizeof(Z_External));
+ npr->u.databaseRecord->descriptor = 0;
+ npr->u.databaseRecord->direct_reference =
+ yaz_oidval_to_z3950oid(c->odr_in, CLASS_RECSYN, VAL_TEXT_XML);
+ npr->u.databaseRecord->which = Z_External_octet;
+ npr->u.databaseRecord->u.octet_aligned = (Odr_oct *)
+ odr_malloc(c->odr_in, sizeof(Odr_oct));
+ npr->u.databaseRecord->u.octet_aligned->buf =
+ res->records[i].recordData_buf;
+ npr->u.databaseRecord->u.octet_aligned->len =
+ npr->u.databaseRecord->u.octet_aligned->size =
+ res->records[i].recordData_len;
+ record_cache_add (resultset, npr, pos);
+ }
+ if (res->num_diagnostics > 0)
+ {
+ set_dset_error(c, *res->diagnostics[0].code, "SRW",
+ res->diagnostics[0].details, 0);
+ }
+ nmem = odr_extract_mem(c->odr_in);
+ nmem_transfer(resultset->odr->mem, nmem);
+ nmem_destroy(nmem);
+}
+#endif
+
+#if HAVE_XML2