Do not reset querytype if session resets (HTTP/SRU).
[yaz-moved-to-github.git] / client / client.c
index 671332e..ee278ee 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: client.c,v 1.354 2007-12-21 08:31:42 adam Exp $
+ * $Id: client.c,v 1.356 2007-12-27 13:27:40 adam Exp $
  */
 /** \file client.c
  *  \brief yaz-client program
@@ -598,27 +598,22 @@ static int set_base(const char *arg)
     return 1;
 }
 
-static int parse_cmd_doc(const char **arg, ODR out, char **buf,
-                         int *len, int opt)
+static int parse_cmd_doc(const char **arg, ODR out, char **buf, int *len)
 {
     const char *sep;
     while (**arg && strchr(" \t\n\r\f", **arg))
         (*arg)++;
-    if ((*arg)[0] == '\"' && (sep=strchr(*arg+1, '"')))
+    if (**arg == '\0')
     {
-        (*arg)++;
-        *len = sep - *arg;
-        *buf = odr_strdupn(out, *arg, *len);
-        (*arg) = sep+1;
-        return 1;
+        return 0;
     }
-    else if ((*arg)[0] && (*arg)[0] != '\"')
+    else if ((*arg)[0] == '<')
     {
         long fsize;
         FILE *inf;
         const char *fname;
-        const char *arg_start = *arg;
-        
+        const char *arg_start = ++(*arg);
+    
         while (**arg != '\0' && **arg != ' ')
             (*arg)++;
             
@@ -644,7 +639,8 @@ static int parse_cmd_doc(const char **arg, ODR out, char **buf,
             return 0;
         }
         *len = fsize;
-        *buf = (char *) odr_malloc(out, fsize);
+        *buf = (char *) odr_malloc(out, fsize+1);
+        (*buf)[fsize] = '\0';
         if (fread(*buf, 1, fsize, inf) != fsize)
         {
             printf("Unable to read %s\n", fname);
@@ -652,21 +648,25 @@ static int parse_cmd_doc(const char **arg, ODR out, char **buf,
             return 0;
         }
         fclose(inf);
-        return 1;
     }
-    else if (**arg == '\0')
+    else if ((*arg)[0] == '\"' && (sep=strchr(*arg+1, '"')))
     {
-        if (opt)
-        {
-            *len = 0;
-            *buf = 0;
-            return 1;
-        }
-        printf("Missing doc argument\n");
+        (*arg)++;
+        *len = sep - *arg;
+        *buf = odr_strdupn(out, *arg, *len);
+        (*arg) = sep+1;
     }
     else
-        printf("Bad doc argument %s\n", *arg);
-    return 0;
+    {
+        const char *arg_start = *arg;
+
+        while (**arg != '\0' && **arg != ' ')
+            (*arg)++;
+
+        *len = *arg - arg_start;
+        *buf = odr_strdupn(out, arg_start, *len);
+    }
+    return 1;
 }
 
 static int cmd_base(const char *arg)
@@ -724,8 +724,6 @@ int session_connect(const char *arg)
         return 0;
     }
 #if YAZ_HAVE_XML2
-    if (conn->protocol == PROTO_HTTP)
-        queryType = QueryType_CQL;
 #else
     if (conn->protocol == PROTO_HTTP)
     {
@@ -786,12 +784,16 @@ int session_connect(const char *arg)
 
 int cmd_open(const char *arg)
 {
+    int r;
     if (arg)
     {
         strncpy (cur_host, arg, sizeof(cur_host)-1);
         cur_host[sizeof(cur_host)-1] = 0;
     }
-    return session_connect(cur_host);
+    r = session_connect(cur_host);
+    if (conn && conn->protocol == PROTO_HTTP)
+        queryType = QueryType_CQL;
+    return r;
 }
 
 void try_reconnect(void)
@@ -2170,17 +2172,17 @@ static int cmd_update_SRW(int action_no, const char *recid,
 
 static int cmd_update_common(const char *arg, int version)
 {
-    char action[20], recid_buf[20];
+    char *action_buf;
+    int action_len;
+    char *recid_buf;
+    int recid_len;
     const char *recid = 0;
     char *rec_buf;
     int rec_len;
     int action_no;
     int noread = 0;
 
-    *action = 0;
-    *recid_buf = 0;
-    sscanf (arg, "%19s %19s%n", action, recid_buf, &noread);
-    if (noread == 0)
+    if (parse_cmd_doc(&arg, out, &action_buf, &action_len) == 0)
     {
         printf("Use: update action recid [fname]\n");
         printf(" where action is one of insert,replace,delete.update\n");
@@ -2189,17 +2191,23 @@ static int cmd_update_common(const char *arg, int version)
         return 0;
     }
 
-    if (!strcmp (action, "insert"))
+    if (parse_cmd_doc(&arg, out, &recid_buf, &recid_len) == 0)
+    {
+        printf("Missing recid\n");
+        return 0;
+    }
+
+    if (!strcmp(action_buf, "insert"))
         action_no = Z_IUOriginPartToKeep_recordInsert;
-    else if (!strcmp (action, "replace"))
+    else if (!strcmp(action_buf, "replace"))
         action_no = Z_IUOriginPartToKeep_recordReplace;
-    else if (!strcmp (action, "delete"))
+    else if (!strcmp(action_buf, "delete"))
         action_no = Z_IUOriginPartToKeep_recordDelete;
-    else if (!strcmp (action, "update"))
+    else if (!strcmp(action_buf, "update"))
         action_no = Z_IUOriginPartToKeep_specialUpdate;
     else 
     {
-        printf ("Bad action: %s\n", action);
+        printf ("Bad action: %s\n", action_buf);
         printf ("Possible values: insert, replace, delete, update\n");
         return 0;
     }
@@ -2208,14 +2216,14 @@ static int cmd_update_common(const char *arg, int version)
         recid = recid_buf;
 
     arg += noread;
-    if (parse_cmd_doc(&arg, out, &rec_buf, &rec_len, 1) == 0)
+    if (parse_cmd_doc(&arg, out, &rec_buf, &rec_len) == 0)
         return 0;
 
 #if YAZ_HAVE_XML2
     if (protocol == PROTO_HTTP)
-        return cmd_update_SRW(action_no, recid, rec_buf, rec_len);
+        return cmd_update_SRW(action_no, recid_buf, rec_buf, rec_len);
 #endif
-    return cmd_update_Z3950(version, action_no, recid, rec_buf, rec_len);
+    return cmd_update_Z3950(version, action_no, recid_buf, rec_buf, rec_len);
 }
 
 #if YAZ_HAVE_XML2
@@ -2223,7 +2231,7 @@ static int cmd_update_SRW(int action_no, const char *recid,
                           char *rec_buf, int rec_len)
 {
     if (!conn)
-        cmd_open(0);
+        session_connect(cur_host);
     if (!conn)
         return 0;
     else
@@ -2422,7 +2430,7 @@ static int cmd_xmles(const char *arg)
         }
         arg += noread;
         if (parse_cmd_doc(&arg, out, &asn_buf,
-                          &ext->u.single_ASN1_type->len, 0) == 0)
+                          &ext->u.single_ASN1_type->len) == 0)
             return 0;
 
         ext->u.single_ASN1_type->buf = (unsigned char *) asn_buf;
@@ -2499,7 +2507,7 @@ static int cmd_explain(const char *arg)
         return 0;
 #if YAZ_HAVE_XML2
     if (!conn)
-        cmd_open(0);
+        session_connect(cur_host);
     if (conn)
     {
         Z_SRW_PDU *sr = 0;
@@ -2572,7 +2580,7 @@ static int cmd_find(const char *arg)
     {
 #if YAZ_HAVE_XML2
         if (!conn)
-            cmd_open(0);
+            session_connect(cur_host);
         if (!conn)
             return 0;
         if (!send_SRW_searchRequest(arg))
@@ -2849,7 +2857,7 @@ static int cmd_show(const char *arg)
     {
 #if YAZ_HAVE_XML2
         if (!conn)
-            cmd_open(0);
+            session_connect(cur_host);
         if (!conn)
             return 0;
         if (!send_SRW_presentRequest(arg))
@@ -3196,7 +3204,7 @@ static int cmd_scan_common(const char *set, const char *arg)
     {
 #if YAZ_HAVE_XML2
         if (!conn)
-            cmd_open(0);
+            session_connect(cur_host);
         if (!conn)
             return 0;
         if (*arg)
@@ -4077,7 +4085,7 @@ void wait_and_handle_response(int one_response_only)
         {
             cs_close(conn);
             conn = 0;
-            cmd_open(0);
+            session_connect(cur_host);
             reconnect_ok = 0;
             if (conn)
             {