Refactor ssl_get and tcpip_get to one function YAZ-831
[yaz-moved-to-github.git] / util / benchmark.c
index 95ca053..3b00f13 100644 (file)
@@ -1,33 +1,29 @@
-/* $Id: benchmark.c,v 1.7 2005-01-15 19:47:15 adam Exp $
- * Copyright (C) 1995-2005, Index Data ApS
- *
- * This file is part of the YAZ toolkit.
- *
- * See the file LICENSE.
- *
- * This is an elementary benchmarker for server performance.  It works
- * by repeatedly connecting to, seaching in and retrieving from the
- * specified server, and keeps statistics about the minimum, maximum
- * and average times for each operation.
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) Index Data
+ * See the file LICENSE for details.
  */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <yaz/options.h>
 #include <stdarg.h>
 
 #include <yaz/zoom.h>
 
 
-struct options {
-    int nconnect;              /* number of connections to make */
-    int nsearch;               /* number of searches on each connection */
-    int npresent;              /* number of presents for each search */
-    int full;                  /* 1 = fetch full records, 0 = brief */
-    int delay;                 /* number of ms to delay between ops */
-    int random;                        /* if true, delay is random 0-specified */
-    int verbosity;             /* 0 = quiet, higher => more verbose */
-} options = {
+struct boptions {
+    int nconnect;               /* number of connections to make */
+    int nsearch;                /* number of searches on each connection */
+    int npresent;               /* number of presents for each search */
+    int full;                   /* 1 = fetch full records, 0 = brief */
+    int delay;                  /* number of ms to delay between ops */
+    int random;                 /* if true, delay is random 0-specified */
+    int verbosity;              /* 0 = quiet, higher => more verbose */
+} boptions = {
     3,
     3,
     3,
@@ -40,63 +36,71 @@ struct options {
 
 static int test(char *host, int port);
 static void db_printf(int level, char *fmt, ...);
+static void usage(const char *prog);
 
 int main(int argc, char **argv)
 {
-    char *host;
-    int port;
+    char *host = 0;
+    int port = 0;
     int c;
     int i;
     int ok;
     int nok = 0;
-
-    while ((c = getopt(argc, argv, "c:s:p:fbd:rv:")) != -1) {
-       switch (c) {
-       case 'c': options.nconnect = atoi(optarg); break;
-       case 's': options.nsearch = atoi(optarg); break;
-       case 'p': options.npresent = atoi(optarg); break;
-       case 'f': options.full = 1; break;
-       case 'b': options.full = 0; break;
-       case 'd': options.delay = atoi(optarg); break;
-       case 'r': options.random = 1; break;
-       case 'v': options.verbosity = atoi(optarg); break;
-       default: goto USAGE;
-       }
-    }
-
-    if (argc-optind != 2) {
-    USAGE:
-       fprintf(stderr, "Usage: %s [options] <host> <port>\n"
-"      -c <n>  Make <n> connection to the server [default: 3]\n"
-"      -s <n>  Perform <n> searches on each connection [3]\n"
-"      -p <n>  Make <n> present requests after each search [3]\n"
-"      -f      Fetch full records [default: brief]\n"
-"      -b      Fetch brief records\n"
-"      -d <n>  Delay <n> ms after each operation\n"
-"      -r      Delays are random between 0 and the specified number of ms\n"
-"      -v <n>  Set verbosity level to <n> [0, silent on success]\n"
-, argv[0]);
-       return 1;
+    char *arg;
+
+    while ((c = options("c:s:p:fbd:rv:", argv, argc, &arg)) != -2) {
+        switch (c) {
+        case 0:
+            if (!host)
+                host = arg;
+            else if (!port)
+                port = atoi(arg);
+            else
+                usage(*argv);
+            break;
+        case 'c': boptions.nconnect = atoi(arg); break;
+        case 's': boptions.nsearch = atoi(arg); break;
+        case 'p': boptions.npresent = atoi(arg); break;
+        case 'f': boptions.full = 1; break;
+        case 'b': boptions.full = 0; break;
+        case 'd': boptions.delay = atoi(arg); break;
+        case 'r': boptions.random = 1; break;
+        case 'v': boptions.verbosity = atoi(arg); break;
+        default: usage(*argv);
+        }
     }
 
-    host = argv[optind];
-    port = atoi(argv[optind+1]);
+    if (!host || !port)
+        usage(*argv);
 
-    for (i = 0; i < options.nconnect; i++) {
-       db_printf(2, "iteration %d of %d", i+1, options.nconnect);
-       ok = test(host, port);
-       if (ok) nok++;
+    for (i = 0; i < boptions.nconnect; i++) {
+        db_printf(2, "iteration %d of %d", i+1, boptions.nconnect);
+        ok = test(host, port);
+        if (ok) nok++;
     }
 
-    db_printf(1, "passed %d of %d tests", nok, options.nconnect);
-    if (nok < options.nconnect)
-       printf("Failed %d of %d tests\n",
-              options.nconnect-nok, options.nconnect);
-
+    db_printf(1, "passed %d of %d tests", nok, boptions.nconnect);
+    if (nok < boptions.nconnect)
+        printf("Failed %d of %d tests\n",
+               boptions.nconnect-nok, boptions.nconnect);
 
     return 0;
 }
 
+static void usage(const char *prog)
+{
+    fprintf(stderr, "Usage: %s [options] <host> <port>\n"
+"       -c <n>  Make <n> connection to the server [default: 3]\n"
+"       -s <n>  Perform <n> searches on each connection [3]\n"
+"       -p <n>  Make <n> present requests after each search [3]\n"
+"       -f      Fetch full records [default: brief]\n"
+"       -b      Fetch brief records\n"
+"       -d <n>  Delay <n> ms after each operation\n"
+"       -r      Delays are random between 0 and the specified number of ms\n"
+"       -v <n>  Set verbosity level to <n> [0, silent on success]\n"
+            , prog);
+    exit(1);
+}
 
 static int test(char *host, int port)
 {
@@ -106,8 +110,8 @@ static int test(char *host, int port)
 
     conn = ZOOM_connection_new(host, port);
     if ((error = ZOOM_connection_error(conn, &errmsg, &addinfo))) {
-       fprintf(stderr, "ZOOM error: %s (%d): %s\n", errmsg, error, addinfo);
-       return 0;
+        fprintf(stderr, "ZOOM error: %s (%d): %s\n", errmsg, error, addinfo);
+        return 0;
     }
 
     ZOOM_connection_destroy(conn);
@@ -118,8 +122,8 @@ static void db_printf(int level, char *fmt, ...)
 {
     va_list ap;
 
-    if (level > options.verbosity)
-       return;
+    if (level > boptions.verbosity)
+        return;
 
     fprintf(stderr, "DEBUG(%d): ", level);
     va_start(ap, fmt);
@@ -127,3 +131,12 @@ static void db_printf(int level, char *fmt, ...)
     fputc('\n', stderr);
     va_end(ap);
 }
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+