From d0276ba178f8bdd1ccad216d8b4ec9af832b0cf7 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 12 Jun 1998 12:22:11 +0000 Subject: [PATCH] Work on Zebra API. --- index/Makefile | 16 +++- index/apitest.c | 226 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ index/zebraapi.c | 30 +++++++- index/zebraapi.h | 60 +++++++++++++++ index/zserver.c | 7 +- index/zserver.h | 40 ++-------- 6 files changed, 338 insertions(+), 41 deletions(-) create mode 100644 index/apitest.c create mode 100644 index/zebraapi.h diff --git a/index/Makefile b/index/Makefile index fb699a0..f3fdcdb 100644 --- a/index/Makefile +++ b/index/Makefile @@ -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 index 0000000..d9cef32 --- /dev/null +++ b/index/apitest.c @@ -0,0 +1,226 @@ + +#include + +#include +#include +#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 #endif +#include #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; ierrCode; +} + +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 index 0000000..a94d576 --- /dev/null +++ b/index/zebraapi.h @@ -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 +#include +#include + +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); + + + diff --git a/index/zserver.c b/index/zserver.c index b1d14ef..bc7bf18 100644 --- a/index/zserver.c +++ b/index/zserver.c @@ -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; diff --git a/index/zserver.h b/index/zserver.h index 098ab50..92b8ddf 100644 --- a/index/zserver.h +++ b/index/zserver.h @@ -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. * @@ -132,6 +135,7 @@ #include #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); - -- 1.7.10.4