Trying to use Solr name consistently
[yaz-moved-to-github.git] / client / client.c
index 3665ade..a55f095 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;
@@ -142,12 +142,12 @@ static int auto_wait = 1;
 static Odr_bitmask z3950_options;
 static int z3950_version = 3;
 static int scan_stepSize = 0;
-static int scan_position = 1;
+static char scan_position[64];
 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,
@@ -1413,7 +1413,7 @@ static char *encode_SRW_term(ODR o, const char *q)
 }
 
 
-static int send_SRW_scanRequest(const char *arg, int pos, int num)
+static int send_SRW_scanRequest(const char *arg, Odr_int *pos, int num)
 {
     Z_SRW_PDU *sr = 0;
 
@@ -1434,7 +1434,7 @@ static int send_SRW_scanRequest(const char *arg, int pos, int num)
         printf("Only CQL and PQF supported in SRW\n");
         return 0;
     }
-    sr->u.scan_request->responsePosition = odr_intdup(out, pos);
+    sr->u.scan_request->responsePosition = pos;
     sr->u.scan_request->maximumTerms = odr_intdup(out, num);
     return send_srw(sr);
 }
@@ -1479,6 +1479,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)
@@ -1528,7 +1529,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 */
@@ -1697,16 +1698,12 @@ 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 = 0;
-        attr_values.relation = "default";
-
+        yaz_facet_attr_init(&attr_values);
         yaz_facet_attr_get_z_attributes(al, &attr_values);
         if (!attr_values.errcode)
         {
             int term_index;
-            printf("  %s (%d): \n", attr_values.useattr, /* attr_values.relation, attr_values.limit, */ facet->num_terms);
+            printf("  %s (%d): \n", attr_values.useattr, facet->num_terms);
             for (term_index = 0 ; term_index < facet->num_terms; term_index++)
             {
                 Z_FacetTerm *facetTerm = facet->terms[term_index];
@@ -2129,6 +2126,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;
@@ -3018,7 +3016,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)
     {
@@ -3174,6 +3172,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;
@@ -3282,10 +3281,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 &&
@@ -3298,7 +3297,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"))
@@ -3321,13 +3320,14 @@ static int cmd_cancel_find(const char *arg)
 }
 
 static int send_Z3950_scanrequest(const char *set,  const char *query,
-                                  Odr_int pp, Odr_int num, const char *term)
+                                  Odr_int *pos, Odr_int num, const char *term)
 {
     Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest);
     Z_ScanRequest *req = apdu->u.scanRequest;
 
     if (only_z3950())
         return 0;
+    printf("query: %s\n", query);
     if (queryType == QueryType_CCL2RPN)
     {
         int error, pos;
@@ -3397,7 +3397,7 @@ static int send_Z3950_scanrequest(const char *set,  const char *query,
     req->num_databaseNames = num_databaseNames;
     req->databaseNames = databaseNames;
     req->numberOfTermsRequested = &num;
-    req->preferredPositionInResponse = &pp;
+    req->preferredPositionInResponse = pos;
     req->stepSize = odr_intdup(out, scan_stepSize);
 
     if (set)
@@ -3572,9 +3572,17 @@ static int cmd_scanstep(const char *arg)
 
 static int cmd_scanpos(const char *arg)
 {
-    int r = sscanf(arg, "%d", &scan_position);
-    if (r == 0)
-        scan_position = 1;
+    if (!strcmp(arg, "none"))
+        strcpy(scan_position, "none");
+    else
+    {
+        int dummy;
+        int r = sscanf(arg, "%d", &dummy);
+        if (r == 1 && strlen(arg) < sizeof(scan_position)-1)
+            strcpy(scan_position, arg);
+        else
+            printf("specify number of none for scanpos\n");
+    }
     return 0;
 }
 
@@ -3588,6 +3596,28 @@ static int cmd_scansize(const char *arg)
 
 static int cmd_scan_common(const char *set, const char *arg)
 {
+    Odr_int pos, *pos_p = 0;
+    const char *scan_term = 0;
+    const char *scan_query = 0;
+
+    if (!*arg)
+    {
+        pos = 1;
+        pos_p = &pos;
+        scan_query = last_scan_query;
+        scan_term = last_scan_line;
+    }
+    else
+    {
+        strcpy(last_scan_query, arg);
+        scan_query = arg;
+        if (strcmp(scan_position, "none"))
+        {
+            pos = odr_atoi(scan_position);
+            pos_p = &pos;
+        }
+    }
+
     if (protocol == PROTO_HTTP)
     {
 #if YAZ_HAVE_XML2
@@ -3595,16 +3625,8 @@ static int cmd_scan_common(const char *set, const char *arg)
             session_connect(cur_host);
         if (!conn)
             return 0;
-        if (*arg)
-        {
-            if (send_SRW_scanRequest(arg, scan_position, scan_size) < 0)
-                return 0;
-        }
-        else
-        {
-            if (send_SRW_scanRequest(last_scan_line, 1, scan_size) < 0)
-                return 0;
-        }
+        if (send_SRW_scanRequest(scan_query, pos_p, scan_size) < 0)
+            return 0;
         return 2;
 #else
         return 0;
@@ -3625,19 +3647,9 @@ static int cmd_scan_common(const char *set, const char *arg)
             printf("Target doesn't support scan\n");
             return 0;
         }
-        if (*arg)
-        {
-            strcpy(last_scan_query, arg);
-            if (send_Z3950_scanrequest(set, arg,
-                                       scan_position, scan_size, 0) < 0)
-                return 0;
-        }
-        else
-        {
-            if (send_Z3950_scanrequest(set, last_scan_query,
-                                      1, scan_size, last_scan_line) < 0)
-                return 0;
-        }
+        if (send_Z3950_scanrequest(set, scan_query, pos_p,
+                                   scan_size, scan_term) < 0)
+            return 0;
         return 2;
     }
 }
@@ -4069,7 +4081,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
@@ -4262,7 +4274,9 @@ 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);
     if (apdu_file)
         odr_setprint(print, apdu_file);
@@ -4351,8 +4365,19 @@ static void handle_srw_response(Z_SRW_searchRetrieveResponse *res)
         printf("Number of hits: " ODR_INT_PRINTF "\n", *res->numberOfRecords);
     if (res->facetList)
         display_facets(res->facetList);
-    for (i = 0; i<res->num_records; i++)
+    if (res->suggestions)
+        printf("Suggestions:\n%s\n", res->suggestions);
+    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)
@@ -4419,9 +4444,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);
@@ -4430,9 +4457,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,
@@ -4922,7 +4950,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 )