- if (resultset->count + resultset->start > resultset->size)
- resultset->count = resultset->size - resultset->start;
- if (resultset->count < 0)
- resultset->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+ resultset->start);
- }
- /* 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, resultset->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, resultset->start);
- }
- }
-}
-
-static void handle_present_response (ZOOM_connection c, Z_PresentResponse *pr)
-{
- handle_records (c, pr->records, 1);
-}
-
-static void handle_search_response (ZOOM_connection c, Z_SearchResponse *sr)
+ 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,
+ syntax, elementSetName);
+ }
+ *count -= i;
+ if (*count < 0)
+ *count = 0;
+ *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(odr_getmem(resultset->odr), 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,
+ syntax, elementSetName);
+ }
+ }
+ 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, syntax, elementSetName);
+ }
+ }
+}
+
+static void handle_present_response(ZOOM_connection c, Z_PresentResponse *pr)
+{
+ handle_records(c, pr->records, 1);
+}
+
+static void handle_queryExpressionTerm(ZOOM_options opt, const char *name,
+ Z_Term *term)
+{
+ switch (term->which)
+ {
+ case Z_Term_general:
+ ZOOM_options_setl(opt, name,
+ (const char *)(term->u.general->buf),
+ term->u.general->len);
+ break;
+ case Z_Term_characterString:
+ ZOOM_options_set(opt, name, term->u.characterString);
+ break;
+ case Z_Term_numeric:
+ ZOOM_options_set_int(opt, name, *term->u.numeric);
+ break;
+ }
+}
+
+static void handle_queryExpression(ZOOM_options opt, const char *name,
+ Z_QueryExpression *exp)
+{
+ char opt_name[80];
+
+ switch (exp->which)
+ {
+ case Z_QueryExpression_term:
+ if (exp->u.term && exp->u.term->queryTerm)
+ {
+ sprintf(opt_name, "%s.term", name);
+ handle_queryExpressionTerm(opt, opt_name, exp->u.term->queryTerm);
+ }
+ break;
+ case Z_QueryExpression_query:
+ break;
+ }
+}
+
+static void handle_searchResult(ZOOM_connection c, ZOOM_resultset resultset,
+ Z_OtherInformation *o)
+{
+ int i;
+ for (i = 0; o && i < o->num_elements; i++)
+ {
+ if (o->list[i]->which == Z_OtherInfo_externallyDefinedInfo)
+ {
+ Z_External *ext = o->list[i]->information.externallyDefinedInfo;
+
+ if (ext->which == Z_External_searchResult1)
+ {
+ int j;
+ Z_SearchInfoReport *sr = ext->u.searchResult1;
+
+ if (sr->num)
+ ZOOM_options_set_int(
+ resultset->options, "searchresult.size", sr->num);
+
+ for (j = 0; j < sr->num; j++)
+ {
+ Z_SearchInfoReport_s *ent =
+ ext->u.searchResult1->elements[j];
+ char pref[80];
+
+ sprintf(pref, "searchresult.%d", j);
+
+ if (ent->subqueryId)
+ {
+ char opt_name[80];
+ sprintf(opt_name, "%s.id", pref);
+ ZOOM_options_set(resultset->options, opt_name,
+ ent->subqueryId);
+ }
+ if (ent->subqueryExpression)
+ {
+ char opt_name[80];
+ sprintf(opt_name, "%s.subquery", pref);
+ handle_queryExpression(resultset->options, opt_name,
+ ent->subqueryExpression);
+ }
+ if (ent->subqueryInterpretation)
+ {
+ char opt_name[80];
+ sprintf(opt_name, "%s.interpretation", pref);
+ handle_queryExpression(resultset->options, opt_name,
+ ent->subqueryInterpretation);
+ }
+ if (ent->subqueryRecommendation)
+ {
+ char opt_name[80];
+ sprintf(opt_name, "%s.recommendation", pref);
+ handle_queryExpression(resultset->options, opt_name,
+ ent->subqueryRecommendation);
+ }
+ if (ent->subqueryCount)
+ {
+ char opt_name[80];
+ sprintf(opt_name, "%s.count", pref);
+ ZOOM_options_set_int(resultset->options, opt_name,
+ *ent->subqueryCount);
+ }
+ }
+ }
+ }
+ }
+}
+
+static void handle_search_response(ZOOM_connection c, Z_SearchResponse *sr)