8 /* Small routine to display GRS-1 record variants ... */
9 /* Copied verbatim from yaz/client/client.c */
10 static void display_variant(Z_Variant *v, int level)
14 for (i = 0; i < v->num_triples; i++)
16 printf("%*sclass=%d,type=%d", level * 4, "", *v->triples[i]->zclass,
17 *v->triples[i]->type);
18 if (v->triples[i]->which == Z_Triple_internationalString)
19 printf(",value=%s\n", v->triples[i]->value.internationalString);
25 /* Small routine to display a GRS-1 record ... */
26 /* Copied verbatim from yaz/client/client.c */
27 static void display_grs1(Z_GenericRecord *r, int level)
33 for (i = 0; i < r->num_elements; i++)
37 printf("%*s", level * 4, "");
41 printf("%d,", *t->tagType);
44 if (t->tagValue->which == Z_StringOrNumeric_numeric)
45 printf("%d) ", *t->tagValue->u.numeric);
47 printf("%s) ", t->tagValue->u.string);
48 if (t->content->which == Z_ElementData_subtree)
51 display_grs1(t->content->u.subtree, level+1);
53 else if (t->content->which == Z_ElementData_string)
54 printf("%s\n", t->content->u.string);
55 else if (t->content->which == Z_ElementData_numeric)
56 printf("%d\n", *t->content->u.numeric);
57 else if (t->content->which == Z_ElementData_oid)
59 int *ip = t->content->u.oid;
62 if ((oent = oid_getentbyoid(t->content->u.oid)))
63 printf("OID: %s\n", oent->desc);
67 while (ip && *ip >= 0)
68 printf(" %d", *(ip++));
72 else if (t->content->which == Z_ElementData_noDataRequested)
73 printf("[No data requested]\n");
74 else if (t->content->which == Z_ElementData_elementEmpty)
75 printf("[Element empty]\n");
76 else if (t->content->which == Z_ElementData_elementNotThere)
77 printf("[Element not there]\n");
80 if (t->appliedVariant)
81 display_variant(t->appliedVariant, level+1);
82 if (t->metaData && t->metaData->supportedVariants)
86 printf("%*s---- variant list\n", (level+1)*4, "");
87 for (c = 0; c < t->metaData->num_supportedVariants; c++)
89 printf("%*svariant #%d\n", (level+1)*4, "", c);
90 display_variant(t->metaData->supportedVariants[c], level + 2);
96 /* Small test main to illustrate the use of the C api */
97 int main (int argc, char **argv)
99 /* odr is a handle to memory assocated with RETURNED data from
101 ODR odr_input, odr_output;
103 /* zh is our Zebra Handle - describes the server as a whole */
106 /* the database we specify in our example */
107 char *base = "Default";
112 log_init_file("apitest.log");
114 odr_input = odr_createmem (ODR_DECODE);
115 odr_output = odr_createmem (ODR_ENCODE);
118 zh = zebra_open ("zebra.cfg");
121 printf ("Couldn't init zebra\n");
125 /* This call controls the logging facility in YAZ/Zebra */
127 log_init(LOG_ALL, "", "out.log");
130 /* Each argument to main will be a query */
131 for (argno = 1; argno < argc; argno++)
133 /* parse the query and generate an RPN structure */
134 Z_RPNQuery *query = p_query_rpn (odr_input, PROTO_Z3950, argv[argno]);
138 const char *errString;
140 ZebraRetrievalRecord *records;
141 int noOfRecordsToFetch;
146 logf (LOG_WARN, "bad query %s\n", argv[argno]);
147 odr_reset (odr_input);
151 /* result set name will be called 1,2, etc */
152 sprintf (setname, "%d", argno);
154 /* fire up the search */
155 zebra_search_rpn (zh, odr_input, odr_output, query, 1, &base, setname);
158 errCode = zebra_errCode (zh);
159 errString = zebra_errString (zh);
160 errAdd = zebra_errAdd (zh);
165 printf ("Zebra Search Error %d %s %s\n",
166 errCode, errString, errAdd ? errAdd : "");
170 printf ("Zebra Search gave %d hits\n", zebra_hits (zh));
172 /* Deterimine number of records to fetch ... */
173 if (zebra_hits(zh) > 10)
174 noOfRecordsToFetch = 10;
176 noOfRecordsToFetch = zebra_hits(zh);
178 /* reset our memory - we've finished dealing with search */
179 odr_reset (odr_input);
180 odr_reset (odr_output);
182 /* prepare to fetch ... */
183 records = odr_malloc (odr_input, sizeof(*records) * noOfRecordsToFetch);
184 /* specify position of each record to fetch */
185 /* first one is numbered 1 and NOT 0 */
186 for (i = 0; i<noOfRecordsToFetch; i++)
187 records[i].position = i+1;
188 /* fetch them and request for GRS-1 records */
189 zebra_records_retrieve (zh, odr_input, setname, NULL, VAL_SUTRS,
190 noOfRecordsToFetch, records);
193 errCode = zebra_errCode (zh);
194 errString = zebra_errString (zh);
195 errAdd = zebra_errAdd (zh);
200 printf ("Zebra Search Error %d %s %s\n",
201 errCode, errString, errAdd ? errAdd : "");
205 /* inspect each record in result */
206 for (i = 0; i<noOfRecordsToFetch; i++)
208 printf ("Record %d\n", i+1);
209 /* error when fetching this record? */
210 if (records[i].errCode)
212 printf (" Error %d\n", records[i].errCode);
216 if (records[i].format == VAL_GRS1)
218 Z_GenericRecord *grs_record =
219 (Z_GenericRecord *) records[i].buf;
221 display_grs1(grs_record, 0);
223 else if (records[i].format == VAL_SUTRS)
226 printf ("%.*s", records[i].len, records[i].buf);
228 /* some other record we don't handle yet... */
231 printf (" Other record (ignored)\n");
235 /* reset our memory - we've finished dealing with present */
236 odr_reset (odr_input);
237 odr_reset (odr_output);
239 odr_destroy (odr_input);
240 odr_destroy (odr_output);