+ else if (scan->query->z_query->which == Z_Query_type_1
+ || scan->query->z_query->which == Z_Query_type_101)
+ {
+ sr->u.scan_request->query_type = Z_SRW_query_type_pqf;
+ sr->u.scan_request->scanClause.pqf = scan->query->query_string;
+ }
+ else
+ {
+ set_ZOOM_error(c, ZOOM_ERROR_UNSUPPORTED_QUERY, 0);
+ return zoom_complete;
+ }
+
+ sr->u.scan_request->maximumTerms = odr_intdup(
+ c->odr_out, ZOOM_options_get_int(scan->options, "number", 10));
+
+ sr->u.scan_request->responsePosition = odr_intdup(
+ c->odr_out, ZOOM_options_get_int(scan->options, "position", 1));
+
+ option_val = ZOOM_options_get(scan->options, "extraArgs");
+ yaz_encode_sru_extra(sr, c->odr_out, option_val);
+ return send_srw(c, sr);
+}
+#else
+static zoom_ret ZOOM_connection_srw_send_scan(ZOOM_connection c)
+{
+ return zoom_complete;
+}
+#endif
+
+
+ZOOM_API(size_t)
+ ZOOM_scanset_size(ZOOM_scanset scan)
+{
+ if (!scan)
+ return 0;
+
+ if (scan->scan_response && scan->scan_response->entries)
+ return scan->scan_response->entries->num_entries;
+ else if (scan->srw_scan_response)
+ return scan->srw_scan_response->num_terms;
+ return 0;
+}
+
+static void ZOOM_scanset_term_x(ZOOM_scanset scan, size_t pos,
+ int *occ,
+ const char **value_term, size_t *value_len,
+ const char **disp_term, size_t *disp_len)
+{
+ size_t noent = ZOOM_scanset_size(scan);
+
+ *value_term = 0;
+ *value_len = 0;
+
+ *disp_term = 0;
+ *disp_len = 0;
+
+ *occ = 0;
+ if (pos >= noent || pos < 0)
+ return;
+ if (scan->scan_response)
+ {
+ Z_ScanResponse *res = scan->scan_response;
+ if (res->entries->entries[pos]->which == Z_Entry_termInfo)
+ {
+ Z_TermInfo *t = res->entries->entries[pos]->u.termInfo;
+
+ *value_term = (const char *) t->term->u.general->buf;
+ *value_len = t->term->u.general->len;
+ if (t->displayTerm)
+ {
+ *disp_term = t->displayTerm;
+ *disp_len = strlen(*disp_term);
+ }
+ else if (t->term->which == Z_Term_general)
+ {
+ *disp_term = (const char *) t->term->u.general->buf;
+ *disp_len = t->term->u.general->len;
+ }
+ *occ = t->globalOccurrences ? *t->globalOccurrences : 0;
+ }
+ }
+ if (scan->srw_scan_response)
+ {
+ Z_SRW_scanResponse *res = scan->srw_scan_response;
+ Z_SRW_scanTerm *t = res->terms + pos;
+ if (t)
+ {
+ *value_term = t->value;
+ *value_len = strlen(*value_term);
+
+ if (t->displayTerm)
+ *disp_term = t->displayTerm;
+ else
+ *disp_term = t->value;
+ *disp_len = strlen(*disp_term);
+ *occ = t->numberOfRecords ? *t->numberOfRecords : 0;
+ }
+ }
+}
+
+ZOOM_API(const char *)
+ ZOOM_scanset_term(ZOOM_scanset scan, size_t pos,
+ int *occ, int *len)
+{
+ const char *value_term = 0;
+ size_t value_len = 0;
+ const char *disp_term = 0;
+ size_t disp_len = 0;
+
+ ZOOM_scanset_term_x(scan, pos, occ, &value_term, &value_len,
+ &disp_term, &disp_len);
+
+ *len = value_len;
+ return value_term;
+}
+
+ZOOM_API(const char *)
+ ZOOM_scanset_display_term(ZOOM_scanset scan, size_t pos,
+ int *occ, int *len)
+{
+ const char *value_term = 0;
+ size_t value_len = 0;
+ const char *disp_term = 0;
+ size_t disp_len = 0;
+
+ ZOOM_scanset_term_x(scan, pos, occ, &value_term, &value_len,
+ &disp_term, &disp_len);
+
+ *len = disp_len;
+ return disp_term;