# 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
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 \
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)
../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) $<
--- /dev/null
+
+#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;
+}
* 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.
*
#include <unistd.h>
#endif
+#include <diagbib1.h>
#include "zserver.h"
static int zebra_register_lock (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));
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;
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)
{
--- /dev/null
+/*
+ * 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);
+
+
+
* 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.
*
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;
* 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 {
ZebraRankClass rank_classes;
};
-typedef struct zebra_info *ZebraHandle;
struct rank_control {
char *name;
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,
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);
-