Happy new year
[idzebra-moved-to-github.git] / test / api / testclient.c
1 /* This file is part of the Zebra server.
2    Copyright (C) 1994-2009 Index Data
3
4 Zebra is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
7 version.
8
9 Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 */
19
20 #include <stdlib.h>
21 #include <stdio.h>
22 #ifdef WIN32
23 #else
24 #include <unistd.h>
25 #endif
26
27 #include <yaz/xmalloc.h>
28 #include <yaz/options.h>
29 #include <yaz/zoom.h>
30
31 char *prog = "testclient";
32
33 int main(int argc, char **argv)
34 {
35     ZOOM_connection z;
36     ZOOM_resultset r;
37     int error;
38     const char *errmsg, *addinfo;
39     char *query = 0;
40     char *target = 0;
41     char *arg;
42     int delay_sec = 0;
43     int ret;
44     int retrieve_number = 0;
45     int retrieve_offset = 0;
46     char *format = 0;
47     int pos;
48     int check_count = -1;
49     int exit_code = 0;
50
51     while ((ret = options("d:n:o:f:c:", argv, argc, &arg)) != -2)
52     {
53         switch (ret)
54         {
55         case 0:
56             if (!target)
57                 target = xstrdup(arg);
58             else if (!query)
59                 query = xstrdup(arg);
60             break;
61         case 'd':
62             delay_sec = atoi(arg);
63             break;
64         case 'n':
65             retrieve_number = atoi(arg);
66             break;
67         case 'o':
68             retrieve_offset = atoi(arg);
69             break;
70         case 'f':
71             format = xstrdup(arg);
72             break;
73         case 'c':
74             check_count = atoi(arg);
75             break;
76         default:
77             printf ("%s: unknown option %s\n", prog, arg);
78             printf ("usage:\n%s [options] target query \n", prog);
79             printf (" eg.  indexdata.dk/gils computer\n");
80             exit (1);
81         }
82     }
83
84     if (!target || !query)
85     {
86         printf ("%s: missing target/query\n", prog);
87         printf ("usage:\n%s [options] target query \n", prog);
88         printf (" eg.  bagel.indexdata.dk/gils computer\n");
89         printf ("Options:\n");
90         printf (" -n num       number of records to fetch. Default: 0.\n");
91         printf (" -o off       offset for records - counting from 0.\n");
92         printf (" -f format    set record syntax. Default: none\n");
93         printf (" -d sec       delay a number of seconds before exit.\n");
94         printf (" -c count     expect count hits, fail if not.\n");
95         exit (3);
96     }
97     z = ZOOM_connection_new (target, 0);
98     
99     if ((error = ZOOM_connection_error(z, &errmsg, &addinfo)))
100     {
101         printf ("Error: %s (%d) %s\n", errmsg, error, addinfo);
102         exit (2);
103     }
104
105     r = ZOOM_connection_search_pqf (z, query);
106     if ((error = ZOOM_connection_error(z, &errmsg, &addinfo)))
107     {
108         printf ("Error: %s (%d) %s\n", errmsg, error, addinfo);
109         if (check_count != -1)
110             exit_code = 10;
111     }
112     else
113     {
114         printf ("Result count: %ld\n", (long) ZOOM_resultset_size(r));
115         if (check_count != -1 && check_count != ZOOM_resultset_size(r))
116         {
117             printf("Wrong number of hits, expected %d, got %ld\n",
118                             check_count, (long) ZOOM_resultset_size(r) );
119             exit(3);
120         }
121     }
122     if (format)
123         ZOOM_resultset_option_set(r, "preferredRecordSyntax", format);
124     for (pos = 0; pos < retrieve_number; pos++)
125     {
126         int len;
127         const char *rec =
128             ZOOM_record_get(
129                 ZOOM_resultset_record(r, pos + retrieve_offset),
130                 "render", &len);
131         
132         if (rec)
133             fwrite (rec, 1, len, stdout);
134     }
135     if (delay_sec > 0)
136         sleep(delay_sec);
137     ZOOM_resultset_destroy (r);
138     ZOOM_connection_destroy (z);
139     exit (exit_code);
140 }
141 /*
142  * Local variables:
143  * c-basic-offset: 4
144  * indent-tabs-mode: nil
145  * End:
146  * vim: shiftwidth=4 tabstop=8 expandtab
147  */
148