+#if HAVE_GSOAP
+static zoom_ret ZOOM_srw_search(ZOOM_connection c, ZOOM_resultset r,
+ const char *cql)
+{
+ int ret;
+ struct xcql__operandType *xQuery = 0;
+ char *action = 0;
+ xsd__integer startRecord = r->start + 1;
+ xsd__integer maximumRecord = r->count;
+ const char *schema = ZOOM_resultset_option_get (r, "schema");
+ struct zs__searchRetrieveResponse res;
+ xsd__string recordPacking = 0;
+
+
+ if (!schema)
+ schema = "http://www.loc.gov/marcxml/";
+
+ ret = soap_call_zs__searchRetrieveRequest(c->soap, c->host_port,
+ action,
+ &r->z_query->u.type_104->u.cql,
+ xQuery,
+ 0, 0,
+ &startRecord, &maximumRecord,
+ (char **) &schema,
+ &recordPacking,
+ &res);
+ if (ret != SOAP_OK)
+ {
+ const char **s = soap_faultdetail(c->soap);
+ xfree (c->addinfo);
+ c->addinfo = 0;
+ if (s && *s)
+ c->addinfo = xstrdup(*s);
+ c->diagset = "SOAP";
+ c->error = ret;
+ }
+ else
+ {
+ if (res.diagnostics.__sizeDiagnostics > 0)
+ {
+ int i = 0;
+ xfree (c->addinfo);
+ c->addinfo = 0;
+ c->diagset = "SRW";
+ c->error = res.diagnostics.diagnostic[i]->code;
+ if (res.diagnostics.diagnostic[i]->details)
+ c->addinfo =
+ xstrdup(res.diagnostics.diagnostic[i]->details);
+
+ }
+ else
+ {
+ int i;
+ r->size = res.numberOfRecords;
+ if (res.resultSetId)
+ r->setname = xstrdup(res.resultSetId);
+ for (i = 0; i < res.records.__sizeRecords; i++)
+ {
+ char *rdata = res.records.record[i]->recordData;
+ if (rdata)
+ {
+ Z_NamePlusRecord *npr =
+ odr_malloc(r->odr, sizeof(*npr));
+ Z_External *ext =
+ z_ext_record(r->odr, VAL_TEXT_XML,
+ rdata, strlen(rdata));
+ npr->databaseName = 0;
+ npr->which = Z_NamePlusRecord_databaseRecord;
+ npr->u.databaseRecord = ext;
+ record_cache_add (r, npr, r->start + i);
+ }
+ }
+ }
+ }
+ return zoom_complete;
+}
+#endif
+