Use assert rather than abort
[idzebra-moved-to-github.git] / index / retrieve.c
index ca3cc74..6a1b65c 100644 (file)
@@ -1,4 +1,4 @@
-/* $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
 
@@ -36,24 +36,107 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #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;
@@ -61,24 +144,61 @@ int zebra_storedata_fetch(ZebraHandle zh, SYSNO sysno, ODR odr,
             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);
@@ -132,10 +252,10 @@ int zebra_record_fetch(ZebraHandle zh, SYSNO sysno, int score,
 
     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);