2 * $Id: zoom-benchmark.c,v 1.9 2005-09-19 14:14:01 marc Exp $
4 * Asynchronous multi-target client doing search and piggyback retrieval
13 #include <yaz/xmalloc.h>
14 #include <yaz/options.h>
19 static char* zoom_events[10];
21 /* re-sorting event numbers to progress numbers */
22 static int zoom_progress[10];
24 /* commando line parameters */
25 static struct parameters_t {
46 void print_event_line(struct event_line_t *pel)
48 printf ("%d\t%ld.%06ld\t%d\t%d\t%s\t%d\t%s\n",
49 pel->connection, pel->time_sec, pel->time_usec,
51 pel->event, pel->zoom_event,
52 pel->error, pel->errmsg);
55 //void update_event_line(struct event_line_t *pel,
61 // const char * eventmsg,
63 // const char * errmsg)
65 // pel->connection = conn;
66 // pel->time_sec = sec;
67 // pel->time_usec = usec;
68 // pel->progress = prog;
69 // pel->event = event;
70 // strcpy(pel->zoom_event, eventmsg);
71 // pel->error = error;
72 // strcpy(pel->errmsg, errmsg);
75 void update_events(int *elc, struct event_line_t *els,
81 const char * eventmsg,
85 els[conn * 10 + elc[conn]].connection = conn;
86 els[conn * 10 + elc[conn]].time_sec = sec;
87 els[conn * 10 + elc[conn]].time_usec = usec;
88 els[conn * 10 + elc[conn]].progress = prog;
89 els[conn * 10 + elc[conn]].event = event;
90 strcpy(els[conn * 10 + elc[conn]].zoom_event, eventmsg);
91 els[conn * 10 + elc[conn]].error = error;
92 strcpy(els[conn * 10 + elc[conn]].errmsg, errmsg);
94 //print_event_line(&els[conn*10 + elc[conn]]);
99 void print_events(int *elc, struct event_line_t *els,
103 for (i=0; i < connections; i++){
104 for (j=0; j < elc[i]; j++){
105 print_event_line(&els[i*10 + j]);
116 zoom_events[ZOOM_EVENT_NONE] = "ZOOM_EVENT_NONE";
117 zoom_events[ZOOM_EVENT_CONNECT] = "ZOOM_EVENT_CONNECT";
118 zoom_events[ZOOM_EVENT_SEND_DATA] = "ZOOM_EVENT_SEND_DATA";
119 zoom_events[ZOOM_EVENT_RECV_DATA] = "ZOOM_EVENT_RECV_DATA";
120 zoom_events[ZOOM_EVENT_TIMEOUT] = "ZOOM_EVENT_TIMEOUT";
121 zoom_events[ZOOM_EVENT_UNKNOWN] = "ZOOM_EVENT_UNKNOWN";
122 zoom_events[ZOOM_EVENT_SEND_APDU] = "ZOOM_EVENT_SEND_APDU";
123 zoom_events[ZOOM_EVENT_RECV_APDU] = "ZOOM_EVENT_RECV_APDU";
124 zoom_events[ZOOM_EVENT_RECV_RECORD] = "ZOOM_EVENT_RECV_RECORD";
125 zoom_events[ZOOM_EVENT_RECV_SEARCH] = "ZOOM_EVENT_RECV_SEARCH";
127 /* re-sorting event numbers to progress numbers */
128 zoom_progress[ZOOM_EVENT_NONE] = 0;
129 zoom_progress[ZOOM_EVENT_CONNECT] = 1;
130 zoom_progress[ZOOM_EVENT_SEND_DATA] = 3;
131 zoom_progress[ZOOM_EVENT_RECV_DATA] = 4;
132 zoom_progress[ZOOM_EVENT_TIMEOUT] = 8;
133 zoom_progress[ZOOM_EVENT_UNKNOWN] = 9;
134 zoom_progress[ZOOM_EVENT_SEND_APDU] = 2;
135 zoom_progress[ZOOM_EVENT_RECV_APDU] = 5;
136 zoom_progress[ZOOM_EVENT_RECV_RECORD] = 7;
137 zoom_progress[ZOOM_EVENT_RECV_SEARCH] = 6;
140 parameters.concurrent = 1;
141 parameters.timeout = 0;
143 /* progress initializing */
145 for (i = 0; i < 4096; i++){
146 parameters.progress[i] = 0;
159 void time_init(struct time_type *ptime)
161 gettimeofday(&(ptime->now), 0);
162 gettimeofday(&(ptime->then), 0);
167 void time_stamp(struct time_type *ptime)
169 gettimeofday(&(ptime->now), 0);
170 ptime->sec = ptime->now.tv_sec - ptime->then.tv_sec;
171 ptime->usec = ptime->now.tv_usec - ptime->then.tv_usec;
172 if (ptime->usec < 0){
174 ptime->usec += 1000000;
178 long time_sec(struct time_type *ptime)
183 long time_usec(struct time_type *ptime)
188 void print_option_error()
190 fprintf(stderr, "zoom-benchmark: Call error\n");
191 fprintf(stderr, "zoom-benchmark -h host:port -q pqf-query "
192 "[-c no_concurrent] "
198 void read_params(int argc, char **argv, struct parameters_t *p_parameters){
201 while ((ret = options("h:q:c:t:", argv, argc, &arg)) != -2)
206 strcpy(p_parameters->host, arg);
209 strcpy(p_parameters->query, arg);
212 p_parameters->concurrent = atoi(arg);
215 p_parameters->timeout = atoi(arg);
218 print_option_error();
221 print_option_error();
226 printf("zoom-benchmark\n");
227 printf(" host: %s \n", p_parameters->host);
228 printf(" query: %s \n", p_parameters->query);
229 printf(" concurrent: %d \n", p_parameters->concurrent);
230 printf(" timeout: %d \n\n", p_parameters->timeout);
233 if (! strlen(p_parameters->host))
234 print_option_error();
235 if (! strlen(p_parameters->query))
236 print_option_error();
237 if (! (p_parameters->concurrent > 0))
238 print_option_error();
239 if (! (p_parameters->timeout >= 0))
240 print_option_error();
243 void print_table_header()
245 printf ("target\tsecond.usec\tprogress\tevent\teventname\t");
246 printf("error\terrorname\n");
250 int main(int argc, char **argv)
252 struct time_type time;
256 struct event_line_t *els;
262 read_params(argc, argv, ¶meters);
264 z = xmalloc(sizeof(*z) * parameters.concurrent);
265 r = xmalloc(sizeof(*r) * parameters.concurrent);
266 elc = xmalloc(sizeof(*elc) * parameters.concurrent);
267 els = xmalloc(sizeof(*els) * parameters.concurrent * 10);
268 o = ZOOM_options_create();
271 ZOOM_options_set (o, "async", "1");
273 /* get first record of result set (using piggyback) */
274 ZOOM_options_set (o, "count", "1");
276 /* preferred record syntax */
278 ZOOM_options_set (o, "preferredRecordSyntax", "usmarc");
279 ZOOM_options_set (o, "elementSetName", "F");
283 /* connect to all concurrent connections*/
284 for ( i = 0; i < parameters.concurrent; i++){
285 /* set event count to zero */
288 /* create connection - pass options (they are the same for all) */
289 z[i] = ZOOM_connection_create(o);
291 /* connect and init */
292 ZOOM_connection_connect(z[i], parameters.host, 0);
295 for (i = 0; i < parameters.concurrent; i++)
296 r[i] = ZOOM_connection_search_pqf (z[i], parameters.query);
299 /* network I/O. pass number of connections and array of connections */
300 while ((i = ZOOM_event (parameters.concurrent, z)))
302 int event = ZOOM_connection_last_event(z[i-1]);
306 int progress = zoom_progress[event];
307 struct event_line_t el;
309 if (event == ZOOM_EVENT_SEND_DATA || event == ZOOM_EVENT_RECV_DATA)
314 /* updating events and event list */
315 error = ZOOM_connection_error(z[i-1] , &errmsg, &addinfo);
317 parameters.progress[i] = -progress;
319 parameters.progress[i] += 1;
323 // printf ("%d\t%ld.%06ld\t%d\t%d\t%s\t%d\t%s\n",
324 //update_event_line(& el,
325 // i-1, time_sec(&time), time_usec(&time),
326 // parameters.progress[i],
327 // event, zoom_events[event],
329 //print_event_line(&el);
332 update_events(elc, els,
333 i-1, time_sec(&time), time_usec(&time),
334 parameters.progress[i],
335 event, zoom_events[event],
343 print_table_header();
344 print_events(elc, els, parameters.concurrent);
346 /* destroy and exit */
347 for (i = 0; i<parameters.concurrent; i++)
349 ZOOM_resultset_destroy (r[i]);
350 ZOOM_connection_destroy (z[i]);
356 ZOOM_options_destroy(o);
362 * indent-tabs-mode: nil
364 * vim: shiftwidth=4 tabstop=8 expandtab