XPath tests
[idzebra-moved-to-github.git] / test / testclient.c
1 /*
2  * $Id: testclient.c,v 1.5 2002-11-09 22:26:19 adam Exp $
3  *
4  * Z39.50 client specifically for Zebra testing.
5  */
6
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <yaz/xmalloc.h>
10 #include <yaz/options.h>
11 #include <yaz/zoom.h>
12
13 char *prog = "testclient";
14
15 int main(int argc, char **argv)
16 {
17     ZOOM_connection z;
18     ZOOM_resultset r;
19     int error;
20     const char *errmsg, *addinfo;
21     char *query = 0;
22     char *target = 0;
23     char *arg;
24     int delay_sec = 0;
25     int ret;
26     int retrieve_number = 0;
27     int retrieve_offset = 0;
28     char *format = 0;
29     int pos;
30     int check_count = -1;
31     int exit_code = 0;
32
33     while ((ret = options("d:n:o:f:c:", argv, argc, &arg)) != -2)
34     {
35         switch (ret)
36         {
37         case 0:
38             if (!target)
39                 target = xstrdup(arg);
40             else if (!query)
41                 query = xstrdup(arg);
42             break;
43         case 'd':
44             delay_sec = atoi(arg);
45             break;
46         case 'n':
47             retrieve_number = atoi(arg);
48             break;
49         case 'o':
50             retrieve_offset = atoi(arg);
51             break;
52         case 'f':
53             format = xstrdup(arg);
54             break;
55         case 'c':
56             check_count = atoi(arg);
57             break;
58         default:
59             printf ("%s: unknown option %s\n", prog, arg);
60             printf ("usage:\n%s [options] target query \n", prog);
61             printf (" eg.  bagel.indexdata.dk/gils computer\n");
62             exit (1);
63         }
64     }
65
66     if (!target || !target)
67     {
68         printf ("%s: missing target/query\n", prog);
69         printf ("usage:\n%s [options] target query \n", prog);
70         printf (" eg.  bagel.indexdata.dk/gils computer\n");
71         printf ("Options:\n");
72         printf (" -n num       number of records to fetch. Default: 0.\n");
73         printf (" -o off       offset for records - counting from 0.\n");
74         printf (" -f format    set record syntax. Default: none\n");
75         printf (" -d sec       delay a number of seconds before exit.\n");
76         printf ("Options\n");
77         exit (3);
78     }
79     z = ZOOM_connection_new (target, 0);
80     
81     if ((error = ZOOM_connection_error(z, &errmsg, &addinfo)))
82     {
83         printf ("Error: %s (%d) %s\n", errmsg, error, addinfo);
84         exit (2);
85     }
86
87     r = ZOOM_connection_search_pqf (z, query);
88     if ((error = ZOOM_connection_error(z, &errmsg, &addinfo)))
89     {
90         printf ("Error: %s (%d) %s\n", errmsg, error, addinfo);
91         if (check_count != -1)
92             exit_code = 10;
93     }
94     else
95     {
96         printf ("Result count: %d\n", ZOOM_resultset_size(r));
97         if (check_count != -1 && check_count != ZOOM_resultset_size(r))
98             exit_code = 10;
99     }
100     if (format)
101         ZOOM_resultset_option_set(r, "preferredRecordSyntax", format);
102     for (pos = 0; pos < retrieve_number; pos++)
103     {
104         size_t len;
105         const char *rec =
106             ZOOM_record_get(
107                 ZOOM_resultset_record(r, pos + retrieve_offset),
108                 "render", &len);
109         
110         if (rec)
111             fwrite (rec, 1, len, stdout);
112     }
113     if (delay_sec > 0)
114         sleep(delay_sec);
115     ZOOM_resultset_destroy (r);
116     ZOOM_connection_destroy (z);
117     exit (0);
118 }