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