moving int declaration to top of function to avoid upsetting old compilers
[yaz-moved-to-github.git] / zoom / zoom-benchmark.c
index e298129..c7edd95 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: zoom-benchmark.c,v 1.2 2005-09-09 13:51:43 marc Exp $
+ * $Id: zoom-benchmark.c,v 1.10 2005-09-20 09:36:18 marc Exp $
  *
  * Asynchronous multi-target client doing search and piggyback retrieval
  */
@@ -23,15 +23,78 @@ static int zoom_progress[10];
 
 /* commando line parameters */
 static struct parameters_t { 
-    char host[1024];
-    char query[1024];
+    char host[4096];
+    char query[4096];
+    char progress[4096];
     int concurrent;
     int timeout;
 } parameters;
 
+struct  event_line_t 
+{
+    int connection;
+    long time_sec;
+    long time_usec;
+    int progress;
+    int event;
+    char zoom_event[128];
+    int error;
+    char errmsg[128];
+};
+
+
+void print_event_line(struct event_line_t *pel)
+{
+    printf ("%d\t%ld.%06ld\t%d\t%d\t%s\t%d\t%s\n",
+            pel->connection, pel->time_sec, pel->time_usec, 
+            pel->progress,
+            pel->event, pel->zoom_event, 
+            pel->error, pel->errmsg);
+}
+
+
+void  update_events(int *elc, struct event_line_t *els,
+                    int conn,
+                    long sec,
+                    long usec,
+                    int prog,
+                    int event,
+                    const char * eventmsg,
+                    int error,
+                    const char * errmsg){
+    
+    els[conn * 10 + elc[conn]].connection = conn;
+    els[conn * 10 + elc[conn]].time_sec = sec;
+    els[conn * 10 + elc[conn]].time_usec = usec;
+    els[conn * 10 + elc[conn]].progress = prog;
+    els[conn * 10 + elc[conn]].event = event;
+    strcpy(els[conn * 10 + elc[conn]].zoom_event, eventmsg);
+    els[conn * 10 + elc[conn]].error = error;
+    strcpy(els[conn * 10 + elc[conn]].errmsg, errmsg);
+
+    //print_event_line(&els[conn*10 + elc[conn]]);
+
+    elc[conn] += 1;
+}
+
+void  print_events(int *elc,  struct event_line_t *els, 
+                   int connections){
+    int i;
+    int j;
+    for (i=0; i < connections; i++){
+        for (j=0; j < elc[i]; j++){
+            print_event_line(&els[i*10 + j]);
+        }
+        printf("\n");
+    }
+}
+
+
 
 void init_statics()
 {
+    int i;
+
     /* naming events */
     zoom_events[ZOOM_EVENT_NONE] = "ZOOM_EVENT_NONE";
     zoom_events[ZOOM_EVENT_CONNECT] = "ZOOM_EVENT_CONNECT";
@@ -57,10 +120,14 @@ void init_statics()
     zoom_progress[ZOOM_EVENT_RECV_SEARCH] = 6;
 
     /* parameters */
-    //parameters.host = "";
-    //parameters.query = "";
     parameters.concurrent = 1;
     parameters.timeout = 0;
+
+    /* progress initializing */
+    for (i = 0; i < 4096; i++){
+        parameters.progress[i] = 0;
+    }
+    
 }
  
 struct time_type 
@@ -114,36 +181,36 @@ void read_params(int argc, char **argv, struct parameters_t *p_parameters){
     char *arg;
     int ret;
     while ((ret = options("h:q:c:t:", argv, argc, &arg)) != -2)
+    {
+        switch (ret)
         {
-            switch (ret)
-                {
-                case 'h':
-                    strcpy(p_parameters->host, arg);
-                    break;
-                case 'q':
-                    strcpy(p_parameters->query, arg);
-                    break;
-                case 'c':
-                    p_parameters->concurrent = atoi(arg);
+        case 'h':
+            strcpy(p_parameters->host, arg);
+            break;
+        case 'q':
+            strcpy(p_parameters->query, arg);
+            break;
+        case 'c':
+            p_parameters->concurrent = atoi(arg);
+            break;
+        case 't':
+            p_parameters->timeout = atoi(arg);
                     break;
-                case 't':
-                    p_parameters->timeout = atoi(arg);
-                    break;
-                case 0:
-                    //for (i = 0; i<number; i++)
-                    //    yaz_log(level, "%s", arg);
-                    print_option_error();
-                    break;
-                default:
-                    print_option_error();
-                }
+        case 0:
+            print_option_error();
+            break;
+        default:
+            print_option_error();
         }
-
-    //printf("zoom-benchmark\n");
-    //printf("   host:       %s \n", p_parameters->host);
-    //printf("   query:      %s \n", p_parameters->query);
-    //printf("   concurrent: %d \n", p_parameters->concurrent);
-    //printf("   timeout:    %d \n\n", p_parameters->timeout);
+    }
+    
+    if(0){
+        printf("zoom-benchmark\n");
+        printf("   host:       %s \n", p_parameters->host);
+        printf("   query:      %s \n", p_parameters->query);
+        printf("   concurrent: %d \n", p_parameters->concurrent);
+        printf("   timeout:    %d \n\n", p_parameters->timeout);
+    }
 
     if (! strlen(p_parameters->host))
         print_option_error();
@@ -155,20 +222,32 @@ void read_params(int argc, char **argv, struct parameters_t *p_parameters){
         print_option_error();
 }
 
+void print_table_header()
+{
+    printf ("target\tsecond.usec\tprogress\tevent\teventname\t");
+    printf("error\terrorname\n");
+}
 
 
 int main(int argc, char **argv)
 {
-    init_statics();
-    
     struct time_type time;
+    ZOOM_connection *z;
+    ZOOM_resultset *r;
+    int *elc;
+    struct event_line_t *els;
+    ZOOM_options o;
+    int i;
 
-    read_params(argc, argv, &parameters);
+    init_statics();
 
-    ZOOM_connection z[parameters.concurrent];
-    ZOOM_resultset r[parameters.concurrent];
-    ZOOM_options o = ZOOM_options_create();
+    read_params(argc, argv, &parameters);
 
+    z = xmalloc(sizeof(*z) * parameters.concurrent);
+    r = xmalloc(sizeof(*r) * parameters.concurrent);
+    elc = xmalloc(sizeof(*elc) * parameters.concurrent);
+    els = xmalloc(sizeof(*els) * parameters.concurrent * 10);
+    o = ZOOM_options_create();
 
     /* async mode */
     ZOOM_options_set (o, "async", "1");
@@ -177,90 +256,74 @@ int main(int argc, char **argv)
     ZOOM_options_set (o, "count", "1");
 
     /* preferred record syntax */
-    //ZOOM_options_set (o, "preferredRecordSyntax", "usmarc");
-    //ZOOM_options_set (o, "elementSetName", "F");
+    if (0){
+        ZOOM_options_set (o, "preferredRecordSyntax", "usmarc");
+        ZOOM_options_set (o, "elementSetName", "F");
+    }
+    
 
     /* connect to all concurrent connections*/
-    int i;
     for ( i = 0; i < parameters.concurrent; i++){
+        /* set event count to zero */
+        elc[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);
+        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);
 
-    // print header of table
-    printf ("second.usec\ttarget\tprogress\tevent\teventname\terror\terrorname\n");
     time_init(&time);
     /* network I/O. pass number of connections and array of connections */
     while ((i = ZOOM_event (parameters.concurrent, z)))
     { 
-        time_stamp(&time);
-
         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)
-            progress = -progress;
-        
-        printf ("%i.%06i\t%d\t%d\t%d\t%s\t%d\t%s\n",
-                time_sec(&time), time_usec(&time), 
-                i-1, progress,
-                event, zoom_events[event], 
-                error, errmsg);
+            parameters.progress[i] = -progress;
+        else
+            parameters.progress[i] += 1;
+
 
+        update_events(elc, els,
+                      i-1, time_sec(&time), time_usec(&time), 
+                      parameters.progress[i],
+                      event, zoom_events[event], 
+                      error, errmsg);
+        
+        
     }
-    
-    /* no more to be done. Inspect results */
-    // commented out right now - do nothing
-/*     for (i = 0; i<parameters.concurrent; i++) */
-/*     { */
-/*         int error; */
-/*         const char *errmsg, *addinfo; */
-/*         const char *tname = (same_target ? argv[2] : argv[1+i]); */
-/*         /\* display errors if any *\/ */
-/*         if ((error = ZOOM_connection_error(z[i], &errmsg, &addinfo))) */
-/*             fprintf (stderr, "%s error: %s (%d) %s\n", tname, errmsg, */
-/*                      error, addinfo); */
-/*         else */
-/*         { */
-/*             /\* OK, no major errors. Look at the result count *\/ */
-/*             int pos; */
-/*             printf ("%s: %d hits\n", tname, ZOOM_resultset_size(r[i])); */
-/*             /\* go through all records at target *\/ */
-/*             for (pos = 0; pos < 10; pos++) */
-/*             { */
-/*                 int len; /\* length of buffer rec *\/ */
-/*                 const char *rec = */
-/*                     ZOOM_record_get ( */
-/*                         ZOOM_resultset_record (r[i], pos), "render", &len); */
-/*                 /\* if rec is non-null, we got a record for display *\/ */
-/*                 if (rec) */
-/*                 { */
-/*                     printf ("%d\n", pos+1); */
-/*                     if (rec) */
-/*                         fwrite (rec, 1, len, stdout); */
-/*                     printf ("\n"); */
-/*                 } */
-/*             } */
-/*         } */
-/*     } */
 
+
+    /* output */
+    print_table_header();    
+    print_events(elc,  els, parameters.concurrent);
+    
     /* destroy and exit */
     for (i = 0; i<parameters.concurrent; i++)
     {
         ZOOM_resultset_destroy (r[i]);
         ZOOM_connection_destroy (z[i]);
     }
+    xfree(z);
+    xfree(r);
+    xfree(elc);
+    xfree(els);
     ZOOM_options_destroy(o);
     exit (0);
 }