/* $Id: apitest.c,v 1.16.2.1 2005/01/16 23:13:29 adam Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps This file is part of the Zebra server. Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. Zebra is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Zebra; see the file LICENSE.zebra. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #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_input, odr_output; /* zs is our Zebra Service - decribes whole server */ ZebraService zs; /* zh is our Zebra Handle - describes database session */ ZebraHandle zh; /* the database we specify in our example */ const char *base = "Default"; int argno; nmem_init (); yaz_log_init_file("apitest.log"); odr_input = odr_createmem (ODR_DECODE); odr_output = odr_createmem (ODR_ENCODE); zs = zebra_start ("zebra.cfg"); if (!zs) { printf ("zebra_start failed; missing zebra.cfg?\n"); exit (1); } /* open Zebra */ zh = zebra_open (zs); if (!zh) { printf ("zebras_open failed\n"); exit (1); } zebra_select_databases (zh, 1, &base); /* 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_input, PROTO_Z3950, argv[argno]); char setname[64]; int errCode; int i; int hits; char *errString; ZebraRetrievalRecord *records; int noOfRecordsToFetch; /* bad query? */ if (!query) { logf (LOG_WARN, "bad query %s\n", argv[argno]); odr_reset (odr_input); continue; } else { char out_str[100]; int r; #if 1 r = zebra_string_norm (zh, 'w', argv[argno], strlen(argv[argno]), out_str, sizeof(out_str)); if (r >= 0) { printf ("norm: '%s'\n", out_str); } else { printf ("norm fail: %d\n", r); } #endif } /* result set name will be called 1,2, etc */ sprintf (setname, "%d", argno); /* fire up the search */ zebra_search_RPN (zh, odr_input, query, setname, &hits); /* status ... */ zebra_result (zh, &errCode, &errString); /* error? */ if (errCode) { printf ("Zebra Search Error %d %s\n", errCode, errString); continue; } /* ok ... */ printf ("Zebra Search gave %d hits\n", hits); /* Deterimine number of records to fetch ... */ if (hits > 10) noOfRecordsToFetch = 10; else noOfRecordsToFetch = hits; /* reset our memory - we've finished dealing with search */ odr_reset (odr_input); odr_reset (odr_output); /* prepare to fetch ... */ records = odr_malloc (odr_input, sizeof(*records) * noOfRecordsToFetch); /* specify position of each record to fetch */ /* first one is numbered 1 and NOT 0 */ for (i = 0; i