-/* $Id: retrieve.c,v 1.46 2006-11-09 14:39:24 adam Exp $
+/* $Id: retrieve.c,v 1.48 2006-11-13 13:53:49 marc Exp $
Copyright (C) 1995-2006
Index Data ApS
#include <yaz/diagbib1.h>
#include <direntz.h>
-int zebra_storedata_fetch(ZebraHandle zh, SYSNO sysno, ODR odr,
+static void parse_zebra_elem(const char *elem,
+ const char **index, size_t *index_len,
+ const char **type, size_t *type_len)
+{
+ *type = 0;
+ *type_len = 0;
+
+ *index = 0;
+ *index_len = 0;
+
+ if (elem && *elem)
+ {
+ const char *cp = strchr(elem, ':');
+
+ if (!cp) /* no colon */
+ {
+ *index = elem;
+ *index_len = strlen(elem);
+ }
+ else if (cp[1] == '\0') /* 'index:' */
+ {
+ *index = elem;
+ *index_len = cp - elem;
+ }
+ else
+ {
+ *index = elem;
+ *index_len = cp - elem;
+ *type = cp+1;
+ *type_len = strlen(cp+1);
+ }
+ }
+}
+
+int zebra_storekeys_fetch(ZebraHandle zh, SYSNO sysno, ODR odr,
Record rec,
const char *element_set,
oid_value input_format,
oid_value *output_format,
char **rec_bufp, int *rec_lenp)
{
+ const char *retrieval_index;
+ size_t retrieval_index_len;
+ const char *retrieval_type;
+ size_t retrieval_type_len;
+
+ int return_code = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
+
WRBUF wrbuf = wrbuf_alloc();
- zebra_rec_keys_t keys = zebra_rec_keys_open();
+ zebra_rec_keys_t keys;
+
+
+ /* only accept XML and SUTRS requests */
+ if (input_format != VAL_TEXT_XML
+ && input_format != VAL_SUTRS)
+ {
+ yaz_log(YLOG_WARN, "unsupported format for element set zebra::%s",
+ element_set);
+ *output_format = VAL_NONE;
+ return return_code;
+ }
+
+
+ keys = zebra_rec_keys_open();
zebra_rec_keys_set_buf(keys,
rec->info[recInfo_delKeys],
rec->size[recInfo_delKeys],
0);
+
+ parse_zebra_elem(element_set,
+ &retrieval_index, &retrieval_index_len,
+ &retrieval_type, &retrieval_type_len);
+
+
+
+
+
if (zebra_rec_keys_rewind(keys))
{
size_t slen;
const char *str;
struct it_key key_in;
+
+
+ if (input_format == VAL_TEXT_XML)
+ {
+ *output_format = VAL_TEXT_XML;
+ /*wrbuf_printf(wrbuf,
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");*/
+
+ wrbuf_printf(wrbuf,
+ "<record xmlns="
+ "\"http://www.indexdata.com/zebra/\""
+ " sysno=\"" ZINT_FORMAT "\""
+ " set=\"zebra::%s\">\n",
+ sysno, element_set);
+ }
+ else if (input_format == VAL_SUTRS)
+ *output_format = VAL_SUTRS;
+
+
while(zebra_rec_keys_read(keys, &str, &slen, &key_in))
{
int i;
int index_type;
const char *db = 0;
const char *string_index = 0;
+ size_t string_index_len;
char dst_buf[IT_MAX_WORD];
zebraExplain_lookup_ord(zh->reg->zei, ord, &index_type, &db,
&string_index);
-
- if (string_index)
- wrbuf_printf(wrbuf, "%s", string_index);
-
- zebra_term_untrans(zh, index_type, dst_buf, str);
- wrbuf_printf(wrbuf, " %s", dst_buf);
-
- for (i = 1; i < key_in.len; i++)
- wrbuf_printf(wrbuf, " " ZINT_FORMAT, key_in.mem[i]);
- wrbuf_printf(wrbuf, "\n");
-
+ string_index_len = strlen(string_index);
+ if (retrieval_index == 0
+ || (string_index_len == retrieval_index_len
+ && !memcmp(string_index, retrieval_index,
+ string_index_len)))
+ {
+
+ if (retrieval_type == 0
+ || (retrieval_type_len == 1
+ && retrieval_type[0] == index_type))
+ {
+
+ if (input_format == VAL_TEXT_XML)
+ {
+ wrbuf_printf(wrbuf, " <index name=\"%s\"",
+ string_index);
+
+ wrbuf_printf(wrbuf, " type=\"%c\"", index_type);
+
+ wrbuf_printf(wrbuf, " seq=\"" ZINT_FORMAT "\">",
+ key_in.mem[key_in.len -1]);
+
+ zebra_term_untrans(zh, index_type, dst_buf, str);
+ wrbuf_xmlputs(wrbuf, dst_buf);
+ wrbuf_printf(wrbuf, "</index>\n");
+ }
+ else if (input_format == VAL_SUTRS)
+ {
+ wrbuf_printf(wrbuf, "%s ", string_index);
+
+ wrbuf_printf(wrbuf, "%c", index_type);
+
+ for (i = 1; i < key_in.len; i++)
+ wrbuf_printf(wrbuf, " " ZINT_FORMAT,
+ key_in.mem[i]);
+
+ zebra_term_untrans(zh, index_type, dst_buf, str);
+ wrbuf_printf(wrbuf, " %s", dst_buf);
+
+ wrbuf_printf(wrbuf, "\n");
+ }
+ }
+ }
}
+ if (input_format == VAL_TEXT_XML)
+ {
+ wrbuf_printf(wrbuf, "</record>\n");
+ }
}
- *output_format = VAL_SUTRS;
+
*rec_lenp = wrbuf_len(wrbuf);
*rec_bufp = odr_malloc(odr, *rec_lenp);
memcpy(*rec_bufp, wrbuf_buf(wrbuf), *rec_lenp);
if (comp && comp->which == Z_RecordComp_simple
&& comp->u.simple->which == Z_ElementSetNames_generic
- && strncmp(comp->u.simple->u.generic, "zebra:", 6) == 0)
+ && strncmp(comp->u.simple->u.generic, "zebra::", 7) == 0)
{
- int r = zebra_storedata_fetch(zh, sysno, odr, rec,
- comp->u.simple->u.generic,
+ int r = zebra_storekeys_fetch(zh, sysno, odr, rec,
+ comp->u.simple->u.generic + 7,
input_format, output_format,
rec_bufp, rec_lenp);