X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fretrieve.c;h=107639eba1e3d65b552ad99e4be0596775d86c34;hb=64e695fc8ebc57dad345fa037e6a83bd403bb22b;hp=5b602ed19f532cb2353341994978c09651fcd517;hpb=0ef68e6e54cfd7a91a28ee3b1f305924ac34e787;p=idzebra-moved-to-github.git
diff --git a/index/retrieve.c b/index/retrieve.c
index 5b602ed..107639e 100644
--- a/index/retrieve.c
+++ b/index/retrieve.c
@@ -194,7 +194,7 @@ static int parse_zebra_elem(const char *elem,
}
-int zebra_special_sort_fetch(
+static int sort_fetch(
struct special_fetch_s *fi, const char *elemsetname,
const Odr_oid *input_format,
const Odr_oid **output_format,
@@ -209,16 +209,6 @@ int zebra_special_sort_fetch(
int ord;
ZebraHandle zh = fi->zh;
- /* only accept XML and SUTRS requests */
- if (oid_oidcmp(input_format, yaz_oid_recsyn_xml)
- && oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
- {
- yaz_log(YLOG_WARN, "unsupported format for element set zebra::%s",
- elemsetname);
- *output_format = 0;
- return YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST;
- }
-
if (!parse_zebra_elem(elemsetname,
&retrieval_index, &retrieval_index_len,
&retrieval_type, &retrieval_type_len))
@@ -248,49 +238,71 @@ int zebra_special_sort_fetch(
return -1; /* is not a sort index */
else
{
- char dst_buf[IT_MAX_WORD];
- WRBUF str = wrbuf_alloc();
+ WRBUF wrbuf_str = wrbuf_alloc();
const char *index_type;
const char *db = 0;
const char *string_index = 0;
- WRBUF wrbuf = result;
+ WRBUF wrbuf_result = result;
+ int off = 0;
- zebra_sort_sysno(zh->reg->sort_index, fi->sysno);
- zebra_sort_type(zh->reg->sort_index, ord);
- zebra_sort_read(zh->reg->sort_index, str);
-
- zebraExplain_lookup_ord(zh->reg->zei, ord, &index_type, &db, &string_index);
-
- zebra_term_untrans(zh, index_type, dst_buf, wrbuf_cstr(str));
-
+ zebraExplain_lookup_ord(zh->reg->zei, ord, &index_type, &db,
+ &string_index);
if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml))
{
*output_format = yaz_oid_recsyn_xml;
- wrbuf_printf(wrbuf, ZEBRA_XML_HEADER_STR
+ wrbuf_printf(wrbuf_result, ZEBRA_XML_HEADER_STR
" sysno=\"" ZINT_FORMAT "\""
" set=\"zebra::index%s/\">\n",
fi->sysno, elemsetname);
-
- wrbuf_printf(wrbuf, " ", index_type);
- wrbuf_xmlputs(wrbuf, dst_buf);
- wrbuf_printf(wrbuf, "\n");
- wrbuf_printf(wrbuf, "\n");
}
else if (!oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
{
*output_format = yaz_oid_recsyn_sutrs;
+ }
+ else
+ {
+ yaz_log(YLOG_WARN, "unsupported format for element set zebra::%s",
+ elemsetname);
+ *output_format = 0;
+ wrbuf_destroy(wrbuf_str);
+ return YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST;
+ }
+ zebra_sort_type(zh->reg->sort_index, ord);
+ zebra_sort_sysno(zh->reg->sort_index, fi->sysno);
+ zebra_sort_read(zh->reg->sort_index, wrbuf_str);
+
+ while (off != wrbuf_len(wrbuf_str))
+ {
+ char dst_buf[IT_MAX_WORD];
+ assert(off < wrbuf_len(wrbuf_str));
+ zebra_term_untrans(zh, index_type, dst_buf,
+ wrbuf_buf(wrbuf_str)+off);
- wrbuf_printf(wrbuf, "%s %s %s\n", string_index, index_type,
- dst_buf);
+ if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml))
+ {
+ wrbuf_printf(wrbuf_result, " ", index_type);
+ wrbuf_xmlputs(wrbuf_result, dst_buf);
+ wrbuf_printf(wrbuf_result, "\n");
+ }
+ else if (!oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
+ {
+ wrbuf_printf(wrbuf_result, "%s %s %s\n", string_index, index_type,
+ dst_buf);
+ }
+ off += strlen(wrbuf_buf(wrbuf_str)+off) + 1;
}
- wrbuf_destroy(str);
+ if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml))
+ {
+ wrbuf_printf(wrbuf_result, "\n");
+ }
+ wrbuf_destroy(wrbuf_str);
return 0;
}
}
-int zebra_special_index_fetch(
+static int special_index_fetch(
struct special_fetch_s *fi, const char *elemsetname,
const Odr_oid *input_format,
const Odr_oid **output_format,
@@ -601,7 +613,7 @@ struct term_collect {
zint set_occur;
};
-zint freq_term(ZebraHandle zh, int ord, const char *term, RSET rset_set)
+static zint freq_term(ZebraHandle zh, int ord, const char *term, RSET rset_set)
{
struct rset_key_control *kc = zebra_key_control_create(zh);
char ord_buf[IT_MAX_WORD];
@@ -634,7 +646,7 @@ zint freq_term(ZebraHandle zh, int ord, const char *term, RSET rset_set)
return hits;
}
-int term_qsort_handle(const void *a, const void *b)
+static int term_qsort_handle(const void *a, const void *b)
{
const struct term_collect *l = a;
const struct term_collect *r = b;
@@ -650,9 +662,9 @@ int term_qsort_handle(const void *a, const void *b)
}
}
-void term_collect_freq(ZebraHandle zh,
- struct term_collect *col, int no_terms_collect,
- int ord, RSET rset)
+static void term_collect_freq(ZebraHandle zh,
+ struct term_collect *col, int no_terms_collect,
+ int ord, RSET rset)
{
int i;
for (i = 0; i < no_terms_collect; i++)
@@ -663,9 +675,9 @@ void term_collect_freq(ZebraHandle zh,
qsort(col, no_terms_collect, sizeof(*col), term_qsort_handle);
}
-struct term_collect *term_collect_create(zebra_strmap_t sm,
- int no_terms_collect,
- NMEM nmem)
+static struct term_collect *term_collect_create(zebra_strmap_t sm,
+ int no_terms_collect,
+ NMEM nmem)
{
const char *term;
void *data_buf;
@@ -705,7 +717,7 @@ struct term_collect *term_collect_create(zebra_strmap_t sm,
return col;
}
-static ZEBRA_RES facet_fetch(
+static int facet_fetch(
struct special_fetch_s *fi, const char *elemsetname,
const Odr_oid *input_format,
const Odr_oid **output_format,
@@ -736,23 +748,13 @@ static ZEBRA_RES facet_fetch(
if (!spec_list || error)
{
- zebra_setError(
- zh,
- YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_,
- 0);
- return ZEBRA_FAIL;
+ return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
}
for (spec = spec_list; spec; spec = spec->next)
{
if (!spec->index_type)
- {
- zebra_setError(
- zh,
- YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_,
- 0);
- return ZEBRA_FAIL;
- }
+ return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
no_ord++;
}
@@ -766,11 +768,7 @@ static ZEBRA_RES facet_fetch(
spec->index_name);
if (ord == -1)
{
- zebra_setError(
- zh,
- YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_,
- 0);
- return ZEBRA_FAIL;
+ return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
}
ord_array[i] = ord;
}
@@ -780,9 +778,8 @@ static ZEBRA_RES facet_fetch(
poset = zebra_meta_records_create(zh, fi->setname, num_recs, pos_array);
if (!poset)
{
- zebra_setError(zh, YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST,
- fi->setname);
- ret = ZEBRA_FAIL;
+ wrbuf_puts(addinfo, fi->setname);
+ return YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST;
}
else
{
@@ -921,21 +918,18 @@ static ZEBRA_RES facet_fetch(
}
-int zebra_special_fetch(
+static int zebra_special_fetch(
void *handle, const char *elemsetname,
const Odr_oid *input_format,
const Odr_oid **output_format,
- WRBUF result, WRBUF addinfo
- )
+ WRBUF result, WRBUF addinfo)
{
Record rec = 0;
struct special_fetch_s *fi = (struct special_fetch_s *) handle;
ZebraHandle zh = fi->zh;
zint sysno = fi->sysno;
- /* set output variables before processing possible error states */
- /* *rec_lenp = 0; */
-
+ /* processing zebra::facet */
if (elemsetname && 0 == strncmp(elemsetname, "facet", 5))
{
return facet_fetch(fi, elemsetname + 5,
@@ -950,24 +944,23 @@ int zebra_special_fetch(
result, addinfo);
}
- /* processing zebra::meta::sysno elemset without fetching binary data */
+ /* processing zebra::meta::sysno */
if (elemsetname && 0 == strcmp(elemsetname, "meta::sysno"))
{
int ret = 0;
- WRBUF wrbuf = result;
if (!oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
{
- wrbuf_printf(wrbuf, ZINT_FORMAT, fi->sysno);
+ wrbuf_printf(result, ZINT_FORMAT, fi->sysno);
*output_format = input_format;
}
else if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml))
{
- wrbuf_printf(wrbuf, ZEBRA_XML_HEADER_STR
+ wrbuf_printf(result, ZEBRA_XML_HEADER_STR
" sysno=\"" ZINT_FORMAT "\"/>\n",
fi->sysno);
*output_format = input_format;
}
- if (wrbuf_len(wrbuf) == 0)
+ else
ret = YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST;
return ret;
}
@@ -975,7 +968,7 @@ int zebra_special_fetch(
/* processing special elementsetname zebra::index:: for sort elements */
if (elemsetname && 0 == strncmp(elemsetname, "index", 5))
{
- int ret = zebra_special_sort_fetch(
+ int ret = sort_fetch(
fi, elemsetname + 5,
input_format, output_format,
result, addinfo);
@@ -1012,35 +1005,25 @@ int zebra_special_fetch(
return 0;
}
- /* only accept XML and SUTRS requests from now */
- if (oid_oidcmp(input_format, yaz_oid_recsyn_xml)
- && oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
- {
- yaz_log(YLOG_WARN, "unsupported format for element set zebra::%s",
- elemsetname);
- return YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST;
- }
-
/* processing special elementsetnames zebra::meta:: */
if (elemsetname && 0 == strcmp(elemsetname, "meta"))
{
int ret = 0;
- WRBUF wrbuf = result;
RecordAttr *recordAttr = rec_init_attr(zh->reg->zei, rec);
if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml))
{
*output_format = input_format;
- wrbuf_printf(wrbuf, ZEBRA_XML_HEADER_STR
+ wrbuf_printf(result, ZEBRA_XML_HEADER_STR
" sysno=\"" ZINT_FORMAT "\"", sysno);
- retrieve_puts_attr(wrbuf, "base", rec->info[recInfo_databaseName]);
- retrieve_puts_attr(wrbuf, "file", rec->info[recInfo_filename]);
- retrieve_puts_attr(wrbuf, "type", rec->info[recInfo_fileType]);
+ retrieve_puts_attr(result, "base", rec->info[recInfo_databaseName]);
+ retrieve_puts_attr(result, "file", rec->info[recInfo_filename]);
+ retrieve_puts_attr(result, "type", rec->info[recInfo_fileType]);
if (fi->score >= 0)
- retrieve_puts_attr_int(wrbuf, "score", fi->score);
+ retrieve_puts_attr_int(result, "score", fi->score);
- wrbuf_printf(wrbuf,
+ wrbuf_printf(result,
" rank=\"" ZINT_FORMAT "\""
" size=\"%i\""
" set=\"zebra::%s\"/>\n",
@@ -1051,14 +1034,14 @@ int zebra_special_fetch(
else if (!oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
{
*output_format = input_format;
- wrbuf_printf(wrbuf, "sysno " ZINT_FORMAT "\n", sysno);
- retrieve_puts_str(wrbuf, "base", rec->info[recInfo_databaseName]);
- retrieve_puts_str(wrbuf, "file", rec->info[recInfo_filename]);
- retrieve_puts_str(wrbuf, "type", rec->info[recInfo_fileType]);
+ wrbuf_printf(result, "sysno " ZINT_FORMAT "\n", sysno);
+ retrieve_puts_str(result, "base", rec->info[recInfo_databaseName]);
+ retrieve_puts_str(result, "file", rec->info[recInfo_filename]);
+ retrieve_puts_str(result, "type", rec->info[recInfo_fileType]);
if (fi->score >= 0)
- retrieve_puts_int(wrbuf, "score", fi->score);
+ retrieve_puts_int(result, "score", fi->score);
- wrbuf_printf(wrbuf,
+ wrbuf_printf(result,
"rank " ZINT_FORMAT "\n"
"size %i\n"
"set zebra::%s\n",
@@ -1066,8 +1049,8 @@ int zebra_special_fetch(
recordAttr->recordSize,
elemsetname);
}
- if (wrbuf_len(wrbuf) == 0)
- ret = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
+ else
+ ret = YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST;
rec_free(&rec);
return ret;
@@ -1076,7 +1059,7 @@ int zebra_special_fetch(
/* processing special elementsetnames zebra::index:: */
if (elemsetname && 0 == strncmp(elemsetname, "index", 5))
{
- int ret = zebra_special_index_fetch(
+ int ret = special_index_fetch(
fi, elemsetname + 5,
input_format, output_format,
result, addinfo, rec);