yaz-client uses cs_create_host_proxy
[yaz-moved-to-github.git] / client / client.c
index 23b59e4..89bc0fa 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2011 Index Data
+ * Copyright (C) 1995-2013 Index Data
  * See the file LICENSE for details.
  */
 /** \file client.c
@@ -125,7 +125,7 @@ static char ccl_fields[512] = "default.bib";
 static char cql_fields[512] = "/usr/local/share/yaz/etc/pqf.properties";
 static char *esPackageName = 0;
 static char *yazProxy = 0;
-static int kilobytes = 1024;
+static int kilobytes = 64 * 1024;
 static char *negotiationCharset = 0;
 static int  negotiationCharsetRecords = 1;
 static int  negotiationCharsetVersion = 3;
@@ -147,6 +147,7 @@ static int scan_size = 20;
 static char cur_host[200];
 static Odr_int last_hit_count = 0;
 static int pretty_xml = 0;
+static Odr_int sru_maximumRecords = 0;
 
 typedef enum {
     QueryType_Prefix,
@@ -701,10 +702,7 @@ static int session_connect_base(const char *arg, const char **basep)
     strncpy(type_and_host, arg, sizeof(type_and_host)-1);
     type_and_host[sizeof(type_and_host)-1] = '\0';
 
-    if (yazProxy)
-        conn = cs_create_host(yazProxy, 1, &add);
-    else
-        conn = cs_create_host(arg, 1, &add);
+    conn = cs_create_host_proxy(yazProxy, 1, &add, yazProxy);
     if (!conn)
     {
         printf("Could not resolve address %s\n", arg);
@@ -1478,6 +1476,7 @@ static int send_SRW_searchRequest(const char *arg)
         printf("Only CQL and PQF supported in SRW\n");
         return 0;
     }
+    sru_maximumRecords = 0;
     sr->u.request->maximumRecords = odr_intdup(out, 0);
     sr->u.request->facetList = facet_list;
     if (record_schema)
@@ -1527,7 +1526,7 @@ static int send_Z3950_searchRequest(const char *arg)
             printf("CCL ERROR: %s\n", ccl_err_msg(error));
             return 0;
         }
-    } 
+    }
     else if (myQueryType == QueryType_CQL2RPN)
     {
         /* ### All this code should be wrapped in a utility function */
@@ -1696,11 +1695,7 @@ static void display_facet(Z_FacetField *facet)
     {
         Z_AttributeList *al = facet->attributes;
         struct yaz_facet_attr attr_values;
-        attr_values.errcode = 0;
-        attr_values.limit = -1;
-        attr_values.useattr = "NONE";
-        attr_values.relation = "default";
-
+        yaz_facet_attr_init(&attr_values);
         yaz_facet_attr_get_z_attributes(al, &attr_values);
         if (!attr_values.errcode)
         {
@@ -2128,6 +2123,7 @@ static Z_External *create_external_itemRequest(void)
     }
     else
     {
+        item_request_buf = odr_getbuf (out, &item_request_size, 0);
         r = (Z_External *) odr_malloc(out, sizeof(*r));
         r->direct_reference = odr_oiddup(out, yaz_oid_general_isoill_1);
         r->indirect_reference = 0;
@@ -3017,7 +3013,7 @@ static int parse_show_args(const char *arg_c, char *setstring,
         sprintf(setstring, "%d", setnumber);
     else
         *setstring = '\0';
-    
+
     token_len = check_token(arg_c, "format");
     if (token_len)
     {
@@ -3173,6 +3169,7 @@ static int send_SRW_presentRequest(const char *arg)
     if (!parse_show_args(arg, setstring, &setno, &nos))
         return 0;
     sr->u.request->startRecord = odr_intdup(out, setno);
+    sru_maximumRecords = nos;
     sr->u.request->maximumRecords = odr_intdup(out, nos);
     if (record_schema)
         sr->u.request->recordSchema = record_schema;
@@ -3281,10 +3278,10 @@ static int cmd_cancel(const char *arg)
             apdu->u.triggerResourceControlRequest;
         bool_t rfalse = 0;
         char command[16];
-        
+
         *command = '\0';
         sscanf(arg, "%15s", command);
-        
+
         if (only_z3950())
             return 0;
         if (session_initResponse &&
@@ -3297,7 +3294,7 @@ static int cmd_cancel(const char *arg)
         *req->requestedAction = Z_TriggerResourceControlRequest_cancel;
         req->resultSetWanted = &rfalse;
         req->referenceId = set_refid(out);
-        
+
         send_apdu(apdu);
         printf("Sent cancel request\n");
         if (!strcmp(command, "wait"))
@@ -3607,7 +3604,7 @@ static int cmd_scan_common(const char *set, const char *arg)
         scan_query = last_scan_query;
         scan_term = last_scan_line;
     }
-    else 
+    else
     {
         strcpy(last_scan_query, arg);
         scan_query = arg;
@@ -4081,7 +4078,7 @@ static int cmd_set_auto_reconnect(const char* arg)
         printf("Error use on or off\n");
         return 1;
     }
-    
+
     if (auto_reconnect)
         printf("Set auto reconnect enabled.\n");
     else
@@ -4274,7 +4271,7 @@ static void initialize(const char *rc_file)
         fprintf(stderr, "failed to allocate ODR streams\n");
         exit(1);
     }
-    
+
     strcpy(scan_position, "1");
 
     setvbuf(stdout, 0, _IONBF, 0);
@@ -4367,8 +4364,17 @@ static void handle_srw_response(Z_SRW_searchRetrieveResponse *res)
         display_facets(res->facetList);
     if (res->suggestions)
         printf("Suggestions:\n%s\n", res->suggestions);
-    for (i = 0; i<res->num_records; i++)
+    for (i = 0; i < res->num_records; i++)
+    {
+        if (i >= sru_maximumRecords)
+        {
+            printf("SRU server returns extra records. Skipping "
+                   ODR_INT_PRINTF " records.\n",
+                   res->num_records - sru_maximumRecords);
+            break;
+        }
         handle_srw_record(res->records + i);
+    }
 }
 
 static void handle_srw_scan_term(Z_SRW_scanTerm *term)
@@ -4435,9 +4441,11 @@ static void http_response(Z_HTTP_Response *hres)
 
             if (ret == 0 && sr->which == Z_SRW_searchRetrieve_response)
                 handle_srw_response(sr->u.response);
+            else if (ret == 0 && sr->which == Z_SRW_scan_response)
+                handle_srw_scan_response(sr->u.scan_response);
             else
             {
-                printf("Decoding of SOLR package failed\n");
+                printf("Decoding of Solr package failed\n");
                 ret = -1;
             }
             odr_destroy(o);
@@ -4446,9 +4454,10 @@ static void http_response(Z_HTTP_Response *hres)
         {
             Z_SOAP *soap_package = 0;
             ODR o = odr_createmem(ODR_DECODE);
-            Z_SOAP_Handler soap_handlers[3] = {
-                {YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec},
+            Z_SOAP_Handler soap_handlers[] = {
+                {YAZ_XMLNS_SRU_v2_response, 0, (Z_SOAP_fun) yaz_srw_codec},
                 {YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec},
+                {YAZ_XMLNS_SRU_v1_response, 0, (Z_SOAP_fun) yaz_srw_codec},
                 {0, 0, 0}
             };
             ret = z_soap_codec(o, &soap_package,
@@ -4938,7 +4947,7 @@ static int cmd_wait_response(const char *arg)
 {
     int i;
     int wait_for = atoi(arg);
-    if (wait_for < 1) 
+    if (wait_for < 1)
         wait_for = 1;
 
     for (i = 0 ; i < wait_for; ++i )