Work on Zebra API.
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 12 Jun 1998 12:22:11 +0000 (12:22 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 12 Jun 1998 12:22:11 +0000 (12:22 +0000)
index/Makefile
index/apitest.c [new file with mode: 0644]
index/zebraapi.c
index/zebraapi.h [new file with mode: 0644]
index/zserver.c
index/zserver.h

index fb699a0..f3fdcdb 100644 (file)
@@ -1,7 +1,7 @@
 # Copyright (C) 1995-1998, Index Data I/S 
 # All rights reserved.
 # Sebastian Hammer, Adam Dickmeiss
-# $Id: Makefile,v 1.49 1998-03-05 08:45:11 adam Exp $
+# $Id: Makefile,v 1.50 1998-06-12 12:22:11 adam Exp $
 
 SHELL=/bin/sh
 RANLIB=ranlib
@@ -17,6 +17,7 @@ TPROG1=zebraidx
 TPROG2=kdump
 TPROG3=zebrasrv
 TPROG4=hlvltest
+TPROG5=apitest
 DEFS=$(INCLUDE)
 O1 = main.o dir.o dirs.o trav.o extract.o kinput.o kcompare.o \
  symtab.o recindex.o recstat.o lockutil.o lockidx.o \
@@ -26,6 +27,9 @@ O3 = zserver.o kcompare.o zrpn.o zsets.o attribute.o recindex.o \
  zlogs.o lockutil.o locksrv.o zinfo.o trunc.o sortidx.o rank1.o zebraapi.o \
  retrieve.o
 O4 = hlvl.o hlvltest.o kcompare.o
+O5 = apitest.o kcompare.o zrpn.o zsets.o attribute.o recindex.o \
+ zlogs.o lockutil.o locksrv.o zinfo.o trunc.o sortidx.o rank1.o zebraapi.o \
+ retrieve.o
 CPP=$(CC) -E
 
 all: $(TPROG1) $(TPROG2) $(TPROG3)
@@ -59,6 +63,16 @@ $(TPROG4): $(O4) \
                ../lib/isamc.a ../lib/bfile.a ../lib/dfa.a ../lib/zebrautl.a \
                $(YAZLIB) $(OSILIB) $(ELIBS) -lm 
 
+$(TPROG5): $(O5) \
+               ../lib/rset.a ../lib/dict.a ../lib/isam.a ../lib/recctrl.a \
+               ../lib/isamc.a ../lib/bfile.a ../lib/dfa.a ../lib/zebrautl.a \
+               $(YAZLIB)
+       $(CC) $(CFLAGS) -o $(TPROG5) $(O5) \
+               ../lib/rset.a ../lib/dict.a ../lib/isam.a ../lib/recctrl.a \
+               ../lib/isamc.a ../lib/bfile.a ../lib/dfa.a ../lib/zebrautl.a \
+               $(YAZLIB) $(OSILIB) $(ELIBS) -lm
+
+
 .c.o:
        $(CC) -c $(DEFS) $(CFLAGS) $<
 
diff --git a/index/apitest.c b/index/apitest.c
new file mode 100644 (file)
index 0000000..d9cef32
--- /dev/null
@@ -0,0 +1,226 @@
+
+#include <stdio.h>
+
+#include <log.h>
+#include <pquery.h>
+#include "zebraapi.h"
+
+/* Small routine to display GRS-1 record variants ... */
+/* Copied verbatim from yaz/client/client.c */
+static void display_variant(Z_Variant *v, int level)
+{
+    int i;
+
+    for (i = 0; i < v->num_triples; i++)
+    {
+       printf("%*sclass=%d,type=%d", level * 4, "", *v->triples[i]->zclass,
+           *v->triples[i]->type);
+       if (v->triples[i]->which == Z_Triple_internationalString)
+           printf(",value=%s\n", v->triples[i]->value.internationalString);
+       else
+           printf("\n");
+    }
+}
+/* Small routine to display a GRS-1 record ... */
+/* Copied verbatim from yaz/client/client.c */
+static void display_grs1(Z_GenericRecord *r, int level)
+{
+    int i;
+
+    if (!r)
+        return;
+    for (i = 0; i < r->num_elements; i++)
+    {
+        Z_TaggedElement *t;
+
+        printf("%*s", level * 4, "");
+        t = r->elements[i];
+        printf("(");
+        if (t->tagType)
+            printf("%d,", *t->tagType);
+        else
+            printf("?,");
+        if (t->tagValue->which == Z_StringOrNumeric_numeric)
+            printf("%d) ", *t->tagValue->u.numeric);
+        else
+            printf("%s) ", t->tagValue->u.string);
+        if (t->content->which == Z_ElementData_subtree)
+        {
+            printf("\n");
+            display_grs1(t->content->u.subtree, level+1);
+        }
+        else if (t->content->which == Z_ElementData_string)
+            printf("%s\n", t->content->u.string);
+        else if (t->content->which == Z_ElementData_numeric)
+           printf("%d\n", *t->content->u.numeric);
+       else if (t->content->which == Z_ElementData_oid)
+       {
+           int *ip = t->content->u.oid;
+           oident *oent;
+
+           if ((oent = oid_getentbyoid(t->content->u.oid)))
+               printf("OID: %s\n", oent->desc);
+           else
+           {
+               printf("{");
+               while (ip && *ip >= 0)
+                   printf(" %d", *(ip++));
+               printf(" }\n");
+           }
+       }
+       else if (t->content->which == Z_ElementData_noDataRequested)
+           printf("[No data requested]\n");
+       else if (t->content->which == Z_ElementData_elementEmpty)
+           printf("[Element empty]\n");
+       else if (t->content->which == Z_ElementData_elementNotThere)
+           printf("[Element not there]\n");
+       else
+            printf("??????\n");
+       if (t->appliedVariant)
+           display_variant(t->appliedVariant, level+1);
+       if (t->metaData && t->metaData->supportedVariants)
+       {
+           int c;
+
+           printf("%*s---- variant list\n", (level+1)*4, "");
+           for (c = 0; c < t->metaData->num_supportedVariants; c++)
+           {
+               printf("%*svariant #%d\n", (level+1)*4, "", c);
+               display_variant(t->metaData->supportedVariants[c], level + 2);
+           }
+       }
+    }
+}
+
+/* Small test main to illustrate the use of the C api */
+int main (int argc, char **argv)
+{
+    /* odr is a handle to memory assocated with RETURNED data from
+       various functions */
+    ODR odr = odr_createmem (ODR_ENCODE);    
+    
+    /* zh is our Zebra Handle - describes the server as a whole */
+    ZebraHandle zh;
+    
+    /* the database we specify in our example */
+    char *base = "Default";
+    int argno;
+
+    /* open Zebra */
+    zh = zebra_open ("zebra.cfg");
+    if (!zh)
+    {
+       printf ("Couldn't init zebra\n");
+       exit (1);
+    }
+
+    /* This call controls the logging facility in YAZ/Zebra */
+#if 0
+    log_init(LOG_ALL, "", "out.log");
+#endif
+
+    /* Each argument to main will be a query */
+    for (argno = 1; argno < argc; argno++)
+    {
+       /* parse the query and generate an RPN structure */
+       Z_RPNQuery *query = p_query_rpn (odr, PROTO_Z3950, argv[argno]);
+       char setname[64];
+       int errCode;
+       int i;
+       const char *errString;
+       char *errAdd;
+       ZebraRetrievalRecord *records;
+       int noOfRecordsToFetch;
+
+       /* bad query? */
+       if (!query)
+       {
+           logf (LOG_WARN, "bad query %s\n", argv[argno]);
+           odr_reset (odr);
+           continue;
+       }
+
+       /* result set name will be called 1,2, etc */
+       sprintf (setname, "%d", i);
+
+       /* fire up the search */
+       zebra_search_rpn (zh, odr, query, 1, &base, setname);
+       
+       /* status ... */
+       errCode = zebra_errCode (zh);
+       errString = zebra_errString (zh);
+       errAdd = zebra_errAdd (zh);
+       
+       /* error? */
+       if (errCode)
+       {
+           printf ("Zebra Search Error %d %s %s\n",
+                   errCode, errString, errAdd ? errAdd : "");
+           continue;
+       }
+       /* ok ... */
+       printf ("Zebra Search gave %d hits\n", zebra_hits (zh));
+       
+       /* Deterimine number of records to fetch ... */
+       if (zebra_hits(zh) > 10)
+           noOfRecordsToFetch = 10;
+       else
+           noOfRecordsToFetch = zebra_hits(zh);
+
+       /* reset our memory - we've finished dealing with search */
+       odr_reset (odr);
+
+       /* prepare to fetch ... */
+       records = malloc (sizeof(*records) * noOfRecordsToFetch);
+       /* specify position of each record to fetch */
+       /* first one is numbered 1 and NOT 0 */
+       for (i = 0; i<noOfRecordsToFetch; i++)
+           records[i].position = i+1;
+       /* fetch them and request for GRS-1 records */
+       zebra_records_retrieve (zh, odr, setname, NULL, VAL_GRS1,
+                               noOfRecordsToFetch, records);
+
+       /* status ... */
+       errCode = zebra_errCode (zh);
+       errString = zebra_errString (zh);
+       errAdd = zebra_errAdd (zh);
+       
+       /* error ? */
+       if (errCode)
+       {
+           printf ("Zebra Search Error %d %s %s\n",
+                   errCode, errString, errAdd ? errAdd : "");
+       }
+       else
+       {
+           /* inspect each record in result */
+           for (i = 0; i<noOfRecordsToFetch; i++)
+           {
+               printf ("Record %d\n", i+1);
+               /* error when fetching this record? */
+               if (records[i].errCode)
+               {
+                   printf ("  Error %d\n", records[i].errCode);
+                   continue;
+               }
+               /* GRS-1 record ? */
+               if (records[i].format == VAL_GRS1)
+               {
+                   Z_GenericRecord *grs_record =
+                       (Z_GenericRecord *) records[i].buf;
+                   printf ("  GRS-1\n");
+                   display_grs1(grs_record, 0);
+               }
+               /* some other record we don't handle yet... */
+               else
+               {
+                   printf ("  Other record (ignored)\n");
+               }
+           }
+       }
+       free (records);
+       odr_reset (odr);  /* reset memory */
+    }
+    return 0;
+}
index a87ee4a..5907725 100644 (file)
@@ -4,7 +4,10 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zebraapi.c,v $
- * Revision 1.3  1998-05-27 16:57:44  adam
+ * Revision 1.4  1998-06-12 12:22:12  adam
+ * Work on Zebra API.
+ *
+ * Revision 1.3  1998/05/27 16:57:44  adam
  * Zebra returns surrogate diagnostic for single records when
  * appropriate.
  *
@@ -26,6 +29,7 @@
 #include <unistd.h>
 #endif
 
+#include <diagbib1.h>
 #include "zserver.h"
 
 static int zebra_register_lock (ZebraHandle zh)
@@ -123,7 +127,7 @@ static void zebra_register_unlock (ZebraHandle zh)
         zebra_server_unlock (zh, zh->registerState);
 }
 
-ZebraHandle zebra_open (const char *host, const char *configName)
+ZebraHandle zebra_open (const char *configName)
 {
     ZebraHandle zh = xmalloc (sizeof(*zh));
 
@@ -195,7 +199,7 @@ void zebra_records_retrieve (ZebraHandle zh, ODR stream,
     int i, *pos_array;
 
     zh->errCode = 0;
-    pos_array = xmalloc (sizeof(*pos_array));
+    pos_array = xmalloc (num_recs * sizeof(*pos_array));
     for (i = 0; i<num_recs; i++)
        pos_array[i] = recs[i].position;
 
@@ -258,6 +262,26 @@ void zebra_sort (ZebraHandle zh, ODR stream,
     zebra_register_unlock (zh);
 }
 
+int zebra_errCode (ZebraHandle zh)
+{
+    return zh->errCode;
+}
+
+const char *zebra_errString (ZebraHandle zh)
+{
+    return diagbib1_str (zh->errCode);
+}
+
+char *zebra_errAdd (ZebraHandle zh)
+{
+    return zh->errString;
+}
+
+int zebra_hits (ZebraHandle zh)
+{
+    return zh->hits;
+}
+
 void zebra_setDB (ZebraHandle zh, int num_bases, char **basenames)
 {
 
diff --git a/index/zebraapi.h b/index/zebraapi.h
new file mode 100644 (file)
index 0000000..a94d576
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 1994-1998, Index Data I/S 
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: zebraapi.h,v $
+ * Revision 1.1  1998-06-12 12:22:13  adam
+ * Work on Zebra API.
+ *
+ */
+
+#include <odr.h>
+#include <oid.h>
+#include <proto.h>
+
+typedef struct {
+    int errCode;
+    char *errString;
+    int position;
+    char *buf;
+    int len;
+    oid_value format;
+    char *base;
+} ZebraRetrievalRecord;
+
+typedef struct {
+    int occurrences;
+    char *term;
+} ZebraScanEntry;
+
+typedef struct zebra_info *ZebraHandle;
+
+YAZ_EXPORT ZebraHandle zebra_open (const char *host);
+
+YAZ_EXPORT void zebra_search_rpn (ZebraHandle zh, ODR stream,
+                      Z_RPNQuery *query, int num_bases, char **basenames, 
+                      const char *setname);
+
+YAZ_EXPORT void zebra_records_retrieve (ZebraHandle zh, ODR stream,
+                            const char *setname, Z_RecordComposition *comp,
+                            oid_value input_format,
+                            int num_recs, ZebraRetrievalRecord *recs);
+
+YAZ_EXPORT void zebra_scan (ZebraHandle zh, ODR stream,
+                           Z_AttributesPlusTerm *zapt,
+                           oid_value attributeset,
+                           int num_bases, char **basenames,
+                           int *position, int *num_entries,
+                           ZebraScanEntry **list,
+                           int *is_partial);
+
+YAZ_EXPORT void zebra_close (ZebraHandle zh);
+
+YAZ_EXPORT int zebra_errCode (ZebraHandle zh);
+YAZ_EXPORT const char *zebra_errString (ZebraHandle zh);
+YAZ_EXPORT char *zebra_errAdd (ZebraHandle zh);
+YAZ_EXPORT int zebra_hits (ZebraHandle zh);
+
+
+
index b1d14ef..bc7bf18 100644 (file)
@@ -4,7 +4,10 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zserver.c,v $
- * Revision 1.58  1998-05-27 16:57:46  adam
+ * Revision 1.59  1998-06-12 12:22:13  adam
+ * Work on Zebra API.
+ *
+ * Revision 1.58  1998/05/27 16:57:46  adam
  * Zebra returns surrogate diagnostic for single records when
  * appropriate.
  *
@@ -243,7 +246,7 @@ bend_initresult *bend_init (bend_initrequest *q)
     logf (LOG_DEBUG, "bend_init");
 
     sob = statserv_getcontrol ();
-    if (!(zh = zebra_open (NULL, sob->configname)))
+    if (!(zh = zebra_open (sob->configname)))
     {
        logf (LOG_FATAL, "Failed to open Zebra `%s'", sob->configname);
        r->errcode = 1;
index 098ab50..92b8ddf 100644 (file)
@@ -4,7 +4,10 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zserver.h,v $
- * Revision 1.32  1998-05-27 16:57:47  adam
+ * Revision 1.33  1998-06-12 12:22:14  adam
+ * Work on Zebra API.
+ *
+ * Revision 1.32  1998/05/27 16:57:47  adam
  * Zebra returns surrogate diagnostic for single records when
  * appropriate.
  *
 
 #include <sortidx.h>
 #include "index.h"
+#include "zebraapi.h"
 #include "zinfo.h"
 
 typedef struct {
@@ -176,7 +180,6 @@ struct zebra_info {
     ZebraRankClass rank_classes;
 };
 
-typedef struct zebra_info *ZebraHandle;
 
 struct rank_control {
     char *name;
@@ -193,11 +196,6 @@ void rpn_search (ZebraHandle zh, ODR stream,
                 const char *setname);
 
 
-typedef struct {
-    int occurrences;
-    char *term;
-} ZebraScanEntry;
-
 void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
               oid_value attributeset,
               int num_bases, char **basenames,
@@ -250,36 +248,8 @@ int att_getentbyatt(ZebraHandle zh, attent *res, oid_value set, int att);
 
 extern struct rank_control *rank1_class;
 
-ZebraHandle zebra_open (const char *host, const char *configName);
-void zebra_search_rpn (ZebraHandle zh, ODR stream,
-                      Z_RPNQuery *query, int num_bases, char **basenames, 
-                      const char *setname);
-
-typedef struct {
-    int errCode;
-    char *errString;
-    int position;
-    char *buf;
-    int len;
-    oid_value format;
-    char *base;
-} ZebraRetrievalRecord;
-
-void zebra_records_retrieve (ZebraHandle zh, ODR stream,
-                            const char *setname, Z_RecordComposition *comp,
-                            oid_value input_format,
-                            int num_recs, ZebraRetrievalRecord *recs);
-
 int zebra_record_fetch (ZebraHandle zh, int sysno, int score, ODR stream,
                        oid_value input_format, Z_RecordComposition *comp,
                        oid_value *output_format, char **rec_bufp,
                        int *rec_lenp, char **basenamep);
 
-void zebra_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
-                oid_value attributeset,
-                int num_bases, char **basenames,
-                int *position, int *num_entries, ZebraScanEntry **list,
-                int *is_partial);
-
-void zebra_close (ZebraHandle zh);
-