int main(int argc, char **argv) { ZOOM_connection z; ZOOM_options o = ZOOM_options_create (); const char *errmsg, *addinfo; if (argc != 4) { fprintf (stderr, "usage:\nzoom-ka sleepinterval target query\n"); exit(1); } /* async mode */ ZOOM_options_set (o, "async", "1"); z = ZOOM_connection_create(o); while(1) { int i, error; ZOOM_resultset rset; ZOOM_connection_connect (z, argv[2], 0); rset = ZOOM_connection_search_pqf(z, argv[3]); while ((i = ZOOM_event(1, &z))) { printf ("no = %d event = %d\n", i-1, ZOOM_connection_last_event(z)); } if ((error = ZOOM_connection_error(z, &errmsg, &addinfo))) { fprintf(stderr, "%s error: %s (%d) %s\n", ZOOM_connection_option_get(z, "host"), errmsg, error, addinfo); } ZOOM_resultset_destroy(rset); sleep(atoi(argv[1])); } ZOOM_connection_destroy (z); ZOOM_options_destroy(o); }
int main(int argc, char **argv) { struct time_type time; ZOOM_connection *z; ZOOM_resultset *r; int *elc; struct event_line_t *els; ZOOM_options o; int i; int k; init_statics(); read_params(argc, argv, ¶meters); z = (ZOOM_connection *) xmalloc(sizeof(*z) * parameters.concurrent); r = (ZOOM_resultset *) xmalloc(sizeof(*r) * parameters.concurrent); elc = (int *) xmalloc(sizeof(*elc) * parameters.concurrent * parameters.repeat); els = (struct event_line_t *) xmalloc( sizeof(*els) * parameters.concurrent * parameters.repeat * 10); o = ZOOM_options_create(); /* async mode */ ZOOM_options_set (o, "async", "1"); /* get first record of result set (using piggypack) */ if (parameters.piggypack) ZOOM_options_set (o, "count", "1"); /* set proxy */ if (strlen(parameters.proxy)) ZOOM_options_set (o, "proxy", parameters.proxy); /* preferred record syntax */ if (0){ ZOOM_options_set (o, "preferredRecordSyntax", "usmarc"); ZOOM_options_set (o, "elementSetName", "F"); } time_init(&time); /* repeat loop */ for (k = 0; k < parameters.repeat; k++){ /* progress zeroing */ for (i = 0; i < 4096; i++){ parameters.progress[i] = k * 5 -1; } /* connect to all concurrent connections*/ for ( i = 0; i < parameters.concurrent; i++){ /* set event count to zero */ elc[k * parameters.concurrent + i] = 0; /* create connection - pass options (they are the same for all) */ z[i] = ZOOM_connection_create(o); /* connect and init */ ZOOM_connection_connect(z[i], parameters.host, 0); } /* search all */ for (i = 0; i < parameters.concurrent; i++) r[i] = ZOOM_connection_search_pqf (z[i], parameters.query); /* network I/O. pass number of connections and array of connections */ while ((i = ZOOM_event (parameters.concurrent, z))){ int event = ZOOM_connection_last_event(z[i-1]); const char *errmsg; const char *addinfo; int error = 0; //int progress = zoom_progress[event]; if (event == ZOOM_EVENT_SEND_DATA || event == ZOOM_EVENT_RECV_DATA) continue; time_stamp(&time); /* updating events and event list */ error = ZOOM_connection_error(z[i-1] , &errmsg, &addinfo); if (error) parameters.progress[i] = zoom_progress[ZOOM_EVENT_UNKNOWN]; //parameters.progress[i] = zoom_progress[ZOOM_EVENT_NONE]; else if (event == ZOOM_EVENT_CONNECT) parameters.progress[i] = zoom_progress[event]; else //parameters.progress[i] = zoom_progress[event]; parameters.progress[i] += 1; update_events(elc, els, k, i-1, time_sec(&time), time_usec(&time), parameters.progress[i], event, zoom_events[event], error, errmsg); } /* destroy connections */ for (i = 0; i<parameters.concurrent; i++) { ZOOM_resultset_destroy (r[i]); ZOOM_connection_destroy (z[i]); } } /* for (k = 0; k < parameters.repeat; k++) repeat loop */ /* output */ if (parameters.gnuplot){ printf("# gnuplot data and instruction file \n"); printf("# gnuplot thisfile \n"); printf("\n"); printf("set title \"Z39.50 connection plot\"\n"); printf("set xlabel \"Connection\"\n"); printf("set ylabel \"Time Seconds\"\n"); printf("set zlabel \"Progress\"\n"); printf("set ticslevel 0\n"); printf("set grid\n"); printf("set pm3d\n"); printf("splot '-' using ($1):($2):($3) t '' with points\n"); printf("\n"); printf("\n"); } print_table_header(); print_events(elc, els, parameters.concurrent); if (parameters.gnuplot){ printf("end\n"); printf("pause -1 \"Hit ENTER to return\"\n"); } /* destroy data structures and exit */ xfree(z); xfree(r); xfree(elc); xfree(els); ZOOM_options_destroy(o); exit (0); }
static void non_block_events(struct connection *co) { int got_records = 0; IOCHAN iochan = co->iochan; ZOOM_connection link = co->link; while (1) { struct client *cl = co->client; int ev; int r = ZOOM_event_nonblock(1, &link); if (!r) break; if (!cl) continue; ev = ZOOM_connection_last_event(link); #if 1 yaz_log(YLOG_DEBUG, "%p Connection ZOOM_EVENT_%s", co, ZOOM_get_event_str(ev)); #endif switch (ev) { case ZOOM_EVENT_END: { const char *error, *addinfo; int err; if ((err = ZOOM_connection_error(link, &error, &addinfo))) { yaz_log(YLOG_LOG, "Error %s from %s", error, client_get_id(cl)); client_set_diagnostic(cl, err, addinfo); client_set_state(cl, Client_Error); } else { iochan_settimeout(iochan, co->session_timeout); client_set_state(cl, Client_Idle); } yaz_cond_broadcast(co->host->cond_ready); } break; case ZOOM_EVENT_SEND_DATA: break; case ZOOM_EVENT_RECV_DATA: break; case ZOOM_EVENT_UNKNOWN: break; case ZOOM_EVENT_SEND_APDU: client_set_state(co->client, Client_Working); iochan_settimeout(iochan, co->operation_timeout); break; case ZOOM_EVENT_RECV_APDU: break; case ZOOM_EVENT_CONNECT: yaz_log(YLOG_LOG, "Connected to %s", client_get_id(cl)); co->state = Conn_Open; break; case ZOOM_EVENT_RECV_SEARCH: client_search_response(cl); break; case ZOOM_EVENT_RECV_RECORD: client_record_response(cl); got_records = 1; break; default: yaz_log(YLOG_LOG, "Unhandled event (%d) from %s", ev, client_get_id(cl)); break; } } if (got_records) { struct client *cl = co->client; if (cl) { client_check_preferred_watch(cl); client_got_records(cl); } } }