Bump version to 2.1.7
[yaz-moved-to-github.git] / client / client.c
index ade869e..b5a11eb 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: client.c,v 1.279 2005-05-08 22:53:59 adam Exp $
+ * $Id: client.c,v 1.283 2005-06-06 07:25:47 adam Exp $
  */
 
 #include <stdio.h>
@@ -126,6 +126,7 @@ static FILE *marc_file = 0;
 static char *refid = NULL;
 static char *last_open_command = NULL;
 static int auto_reconnect = 0;
+static int auto_wait = 1;
 static Odr_bitmask z3950_options;
 static int z3950_version = 3;
 static int scan_stepSize = 0;
@@ -2282,6 +2283,8 @@ static int cmd_options(const char *arg)
        int r;
        int pos;
        r = yaz_init_opt_encode(&z3950_options, arg, &pos);
+       if (r == -1)
+           printf("Unknown option(s) near %s\n", arg+pos);
     }
     else
     {
@@ -3363,6 +3366,28 @@ int cmd_set_auto_reconnect(const char* arg)
     return 0;
 }
 
+
+int cmd_set_auto_wait(const char* arg)
+{  
+    if(strlen(arg)==0) {
+        auto_wait = ! auto_wait;
+    } else if(strcmp(arg,"on")==0) {
+        auto_wait = 1;
+    } else if(strcmp(arg,"off")==0) {
+        auto_wait = 0;         
+    } else {
+        printf("Error use on or off\n");
+        return 1;
+    }
+    
+    if (auto_wait)
+        printf("Set auto wait enabled.\n");
+    else
+        printf("Set auto wait disabled.\n");
+    
+    return 0;
+}
+
 int cmd_set_marcdump(const char* arg)
 {
     if(marc_file && marc_file != stderr) { /* don't close stdout*/
@@ -3539,7 +3564,7 @@ static void initialize(void)
 
 
 #if HAVE_GETTIMEOFDAY
-struct timeval tv_start, tv_end;
+struct timeval tv_start;
 #endif
 
 #if HAVE_XML2
@@ -3719,6 +3744,10 @@ void wait_and_handle_response()
     int res;
     char *netbuffer= 0;
     int netbufferlen = 0;
+#if HAVE_GETTIMEOFDAY
+    int got_tv_end = 0;
+    struct timeval tv_end;
+#endif
     Z_GDU *gdu;
     
     while(conn)
@@ -3751,6 +3780,11 @@ void wait_and_handle_response()
             close_session();
             break;
         }
+#if HAVE_GETTIMEOFDAY
+       if (got_tv_end == 0)
+           gettimeofday (&tv_end, 0); /* count first one only */
+       got_tv_end++;
+#endif
         odr_reset(out);
         odr_reset(in); /* release APDU from last round */
         record_last = 0;
@@ -3841,10 +3875,9 @@ void wait_and_handle_response()
         if (conn && !cs_more(conn))
             break;
     }
-    if (conn)
-    {
 #if HAVE_GETTIMEOFDAY
-        gettimeofday (&tv_end, 0);
+    if (got_tv_end)
+    {
 #if 0
         printf ("S/U S/U=%ld/%ld %ld/%ld",
                 (long) tv_start.tv_sec,
@@ -3855,8 +3888,8 @@ void wait_and_handle_response()
         printf ("Elapsed: %.6f\n",
                 (double) tv_end.tv_usec / 1e6 + tv_end.tv_sec -
                 ((double) tv_start.tv_usec / 1e6 + tv_start.tv_sec));
-#endif
     }
+#endif
     xfree (netbuffer);
 }
 
@@ -3995,6 +4028,7 @@ int cmd_list_all(const char* args) {
     if(yazProxy) printf("using proxy          : %s\n",yazProxy);               
     
     printf("auto_reconnect       : %s\n",auto_reconnect?"on":"off");
+    printf("auto_wait            : %s\n",auto_wait?"on":"off");
     
     if (!auth) {
         printf("Authentication       : none\n");
@@ -4076,6 +4110,20 @@ int cmd_clear_otherinfo(const char* args)
     return 0;
 }
 
+int cmd_wait_response(const char *arg)
+{
+    int wait_for = atoi(arg);
+    int i=0;
+    if( wait_for < 1 ) {
+       wait_for = 1;
+    };
+    
+    for( i=0 ; i < wait_for ; ++i ) {
+       wait_and_handle_response( );
+    };
+    return 0;
+}
+
 static int cmd_help (const char *line);
 
 typedef char *(*completerFunctionType)(const char *text, int state);
@@ -4133,6 +4181,7 @@ static struct {
     {"set_cclfile", cmd_set_cclfile," <filename>",NULL,1,NULL},
     {"set_cqlfile", cmd_set_cqlfile," <filename>",NULL,1,NULL},
     {"set_auto_reconnect", cmd_set_auto_reconnect," on|off",complete_auto_reconnect,1,NULL},
+    {"set_auto_wait", cmd_set_auto_wait," on|off",complete_auto_reconnect,1,NULL},
     {"set_otherinfo", cmd_set_otherinfo,"<otherinfoinddex> <oid> <string>",NULL,0,NULL},
     {"sleep", cmd_sleep,"<seconds>",NULL,0,NULL},
     {"register_oid", cmd_register_oid,"<name> <class> <oid>",NULL,0,NULL},
@@ -4142,6 +4191,7 @@ static struct {
     {"list_otherinfo",cmd_list_otherinfo,"[otherinfoinddex]",NULL,0,NULL},
     {"list_all",cmd_list_all,"",NULL,0,NULL},
     {"clear_otherinfo",cmd_clear_otherinfo,"",NULL,0,NULL},
+    {"wait_response",cmd_wait_response,"<number>",NULL,0,NULL},
     /* Server Admin Functions */
     {"adm-reindex", cmd_adm_reindex, "<database-name>",NULL,0,NULL},
     {"adm-truncate", cmd_adm_truncate, "('database'|'index')<object-name>",NULL,0,NULL},
@@ -4212,9 +4262,9 @@ static int cmd_help (const char *line)
        printf("        8=element, 9=subelement, 10=elementType, 11=byte.\n");
        printf("\nExamples:\n");
        printf(" Search for a and b in-order at most 3 words apart:\n");
-       printf("  @prox 0 3 1 2 k 2\n");
+       printf("  @prox 0 3 1 2 k 2 a b\n");
        printf(" Search for any order of a and b next to each other:\n");
-       printf("  @prox 0 1 0 3 k 2\n");
+       printf("  @prox 0 1 0 3 k 2 a b\n");
     }
     return 1;
 }
@@ -4310,7 +4360,7 @@ void process_cmd_line(char* line)
     
     if(apdu_file) fflush(apdu_file);
     
-    if (res >= 2)
+    if (res >= 2 && auto_wait)
         wait_and_handle_response();
     
     if(apdu_file)