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