yaz-client: Loosen NS check for SRU YAZ-716
[yaz-moved-to-github.git] / client / client.c
index 7b0f926..71c3910 100644 (file)
@@ -103,9 +103,9 @@ char *databaseNames[128];
 int num_databaseNames = 0;
 static Z_External *record_last = 0;
 static int setnumber = -1;              /* current result set number */
-static int smallSetUpperBound = 0;
-static int largeSetLowerBound = 1;
-static int mediumSetPresentNumber = 0;
+static Odr_int smallSetUpperBound = 0;
+static Odr_int largeSetLowerBound = 1;
+static Odr_int mediumSetPresentNumber = 0;
 static Z_ElementSetNames *elementSetNames = 0;
 static Z_FacetList *facet_list = 0;
 static ODR facet_odr = 0;
@@ -253,9 +253,12 @@ static void add_otherInfos(Z_APDU *a)
     Z_OtherInformation **oi;
     int i;
 
-    yaz_oi_APDU(a, &oi);
-    if (facet_list)
+    if (facet_list && a->which == Z_APDU_searchRequest)
+    {
+        oi = &a->u.searchRequest->additionalSearchInfo;
         yaz_oi_set_facetlist(oi, out, facet_list);
+    }
+    yaz_oi_APDU(a, &oi);
     for (i = 0; i < maxOtherInfosSupported; ++i)
     {
         if (oid_oidlen(extraOtherInfos[i].oid) > 0)
@@ -318,17 +321,9 @@ static void print_refid(Z_ReferenceId *id)
 
 static Z_ReferenceId *set_refid(ODR out)
 {
-    Z_ReferenceId *id;
     if (!refid)
         return 0;
-    id = (Z_ReferenceId *) odr_malloc(out, sizeof(*id));
-    id->len = strlen(refid);
-#if OCT_SIZE
-    id->size = id->len;
-#endif
-    id->buf = (unsigned char *) odr_malloc(out, id->len);
-    memcpy(id->buf, refid, id->len);
-    return id;
+    return odr_create_Odr_oct(out, refid, strlen(refid));
 }
 
 /* INIT SERVICE ------------------------------- */
@@ -846,6 +841,50 @@ static void print_record(const char *buf, size_t len)
         printf("\n");
 }
 
+static void print_mab_record(const char *buf, size_t len)
+{
+    size_t i;
+    size_t last_linebreak = 0;
+    size_t last_subfield  = 0;
+    for (i = 0; i < len; i++)
+    {
+        // line break after header
+        if ( i == 24 )
+        {
+            printf("\n");
+            last_linebreak = i - 1;
+        }
+
+        // space between field and content
+        if ( i > 24 && i - last_linebreak == 5 )
+            printf(" ");
+
+        // space after subfield
+        if ( last_subfield != 0 && i - last_subfield == 2 )
+            printf(" ");
+
+        if ((buf[i] <= 126 && buf[i] >= 32) || strchr("\n\r\t\f", buf[i]))
+            printf("%c", buf[i]);
+        else if ( buf[i] == 29 ) // record separator
+            printf("\n");
+        else if ( buf[i] == 30 ) // field separator
+        {
+            printf("\n");
+            last_linebreak = i;
+        }
+        else if ( buf[i] == 31 ) // subfield
+        {
+            // space before subfields; except first one
+            if ( i > 24 && i - last_linebreak > 5 )
+                printf(" ");
+            printf("$");
+            last_subfield = i;
+        }
+        else
+            printf("\\X%02X", ((const unsigned char *)buf)[i]);
+    }
+}
+
 static void print_xml_record(const char *buf, size_t len)
 {
     int has_printed = 0;
@@ -931,7 +970,10 @@ static void display_record(Z_External *r)
             || !oid_oidcmp(oid, yaz_oid_recsyn_html))
         {
             print_xml_record(octet_buf, octet_len);
-
+        }
+        else if (!oid_oidcmp(oid, yaz_oid_recsyn_mab))
+        {
+            print_mab_record(octet_buf, octet_len);
         }
         else
         {
@@ -1482,8 +1524,7 @@ static int send_SRW_searchRequest(const char *arg)
     sru_maximumRecords = 0;
     sr->u.request->maximumRecords = odr_intdup(out, 0);
     sr->u.request->facetList = facet_list;
-    if (record_schema)
-        sr->u.request->recordSchema = record_schema;
+    sr->u.request->recordSchema = record_schema;
     if (recordsyntax_size == 1 && !yaz_matchstr(recordsyntax_list[0], "xml"))
         sr->u.request->recordPacking = "xml";
     return send_srw(sr);
@@ -1563,15 +1604,12 @@ static int send_Z3950_searchRequest(const char *arg)
     req->referenceId = set_refid(out);
     if (!strcmp(arg, "@big")) /* strictly for troublemaking */
     {
-        static unsigned char big[2100];
+        static char big[2100];
         static Odr_oct bigo;
 
         /* send a very big referenceid to test transport stack etc. */
         memset(big, 'A', 2100);
         bigo.len = 2100;
-#if OCT_SIZE
-        bigo.size = bigo.len;
-#endif
         bigo.buf = big;
         req->referenceId = &bigo;
     }
@@ -1625,7 +1663,7 @@ static int send_Z3950_searchRequest(const char *arg)
     case QueryType_CCL:
         query.which = Z_Query_type_2;
         query.u.type_2 = &ccl_query;
-        ccl_query.buf = (unsigned char*) arg;
+        ccl_query.buf = (char *) arg;
         ccl_query.len = strlen(arg);
         break;
     case QueryType_CCL2RPN:
@@ -2135,18 +2173,8 @@ static Z_External *create_external_itemRequest(void)
         r->indirect_reference = 0;
         r->descriptor = 0;
         r->which = Z_External_single;
-
-        r->u.single_ASN1_type = (Odr_oct *)
-            odr_malloc(out, sizeof(*r->u.single_ASN1_type));
-        r->u.single_ASN1_type->buf = (unsigned char *)
-        odr_malloc(out, item_request_size);
-        r->u.single_ASN1_type->len = item_request_size;
-#if OCT_SIZE
-        r->u.single_ASN1_type->size = item_request_size;
-#endif
-        memcpy(r->u.single_ASN1_type->buf, item_request_buf,
-                item_request_size);
-
+        r->u.single_ASN1_type =
+            odr_create_Odr_oct(out, item_request_buf, item_request_size);
         do_hex_dump(item_request_buf,item_request_size);
     }
     return r;
@@ -2190,20 +2218,8 @@ static Z_External *create_external_ILL_APDU(void)
         r->indirect_reference = 0;
         r->descriptor = 0;
         r->which = Z_External_single;
-
-        r->u.single_ASN1_type = (Odr_oct *)
-            odr_malloc(out, sizeof(*r->u.single_ASN1_type));
-        r->u.single_ASN1_type->buf = (unsigned char *)
-        odr_malloc(out, ill_request_size);
-        r->u.single_ASN1_type->len = ill_request_size;
-#if OCT_SIZE
-        r->u.single_ASN1_type->size = ill_request_size;
-#endif
-        memcpy(r->u.single_ASN1_type->buf, ill_request_buf, ill_request_size);
-/*         printf("len = %d\n", ill_request_size); */
-/*              do_hex_dump(ill_request_buf,ill_request_size); */
-/*              printf("--- end of extenal\n"); */
-
+        r->u.single_ASN1_type = odr_create_Odr_oct(out, ill_request_buf,
+                                                   ill_request_size);
     }
     return r;
 }
@@ -2492,18 +2508,8 @@ static int send_Z3950_update(int version, int action_no, const char *recid,
         notToKeep->elements[0] = (Z_IU0SuppliedRecords_elem *)
             odr_malloc(out, sizeof(**notToKeep->elements));
         notToKeep->elements[0]->which = Z_IUSuppliedRecords_elem_opaque;
-        if (recid)
-        {
-            notToKeep->elements[0]->u.opaque = (Odr_oct *)
-                odr_malloc(out, sizeof(Odr_oct));
-            notToKeep->elements[0]->u.opaque->buf = (unsigned char *) recid;
-#if OCT_SIZE
-            notToKeep->elements[0]->u.opaque->size = strlen(recid);
-#endif
-            notToKeep->elements[0]->u.opaque->len = strlen(recid);
-        }
-        else
-            notToKeep->elements[0]->u.opaque = 0;
+        notToKeep->elements[0]->u.opaque = recid ?
+            odr_create_Odr_oct(out, recid, strlen(recid)) : 0;
         notToKeep->elements[0]->supplementalId = 0;
         notToKeep->elements[0]->correlationInfo = 0;
         notToKeep->elements[0]->record = record_this;
@@ -2541,18 +2547,8 @@ static int send_Z3950_update(int version, int action_no, const char *recid,
         notToKeep->elements[0] = (Z_IUSuppliedRecords_elem *)
             odr_malloc(out, sizeof(**notToKeep->elements));
         notToKeep->elements[0]->which = Z_IUSuppliedRecords_elem_opaque;
-        if (recid)
-        {
-            notToKeep->elements[0]->u.opaque = (Odr_oct *)
-                odr_malloc(out, sizeof(Odr_oct));
-            notToKeep->elements[0]->u.opaque->buf = (unsigned char *) recid;
-#if OCT_SIZE
-            notToKeep->elements[0]->u.opaque->size = strlen(recid);
-#endif
-            notToKeep->elements[0]->u.opaque->len = strlen(recid);
-        }
-        else
-            notToKeep->elements[0]->u.opaque = 0;
+        notToKeep->elements[0]->u.opaque = recid ?
+            odr_create_Odr_oct(out, recid, strlen(recid)) : 0;
         notToKeep->elements[0]->supplementalId = 0;
         notToKeep->elements[0]->correlationInfo = 0;
         notToKeep->elements[0]->record = record_this;
@@ -2596,7 +2592,7 @@ static int cmd_xmles(const char *arg)
                           &ext->u.single_ASN1_type->len) == 0)
             return 0;
 
-        ext->u.single_ASN1_type->buf = (unsigned char *) asn_buf;
+        ext->u.single_ASN1_type->buf = asn_buf;
 
         oid = yaz_string_to_oid_odr(yaz_oid_std(),
                                     CLASS_EXTSERV, oid_str, out);
@@ -2682,7 +2678,7 @@ static int cmd_explain(const char *arg)
         setno = 1;
 
         /* save this for later .. when fetching individual records */
-        sr = yaz_srw_get(out, Z_SRW_explain_request);
+        sr = yaz_srw_get_pdu(out, Z_SRW_explain_request, sru_version);
         if (recordsyntax_size == 1
             && !yaz_matchstr(recordsyntax_list[0], "xml"))
             sr->u.explain_request->recordPacking = "xml";
@@ -2953,30 +2949,30 @@ static int cmd_delete(const char *arg)
 
 static int cmd_ssub(const char *arg)
 {
-    if (!(smallSetUpperBound = atoi(arg)))
-        return 0;
+    smallSetUpperBound = odr_strtol(arg, 0, 10);
     return 1;
 }
 
 static int cmd_lslb(const char *arg)
 {
-    if (!(largeSetLowerBound = atoi(arg)))
-        return 0;
+    largeSetLowerBound = odr_strtol(arg, 0, 10);
     return 1;
 }
 
 static int cmd_mspn(const char *arg)
 {
-    if (!(mediumSetPresentNumber = atoi(arg)))
-        return 0;
+    mediumSetPresentNumber = odr_strtol(arg, 0, 10);
     return 1;
 }
 
 static int cmd_status(const char *arg)
 {
-    printf("smallSetUpperBound: %d\n", smallSetUpperBound);
-    printf("largeSetLowerBound: %d\n", largeSetLowerBound);
-    printf("mediumSetPresentNumber: %d\n", mediumSetPresentNumber);
+    printf("smallSetUpperBound: " ODR_INT_PRINTF "\n",
+           smallSetUpperBound);
+    printf("largeSetLowerBound: " ODR_INT_PRINTF "\n",
+           largeSetLowerBound);
+    printf("mediumSetPresentNumber: " ODR_INT_PRINTF "\n",
+           mediumSetPresentNumber);
     return 1;
 }
 
@@ -3188,8 +3184,7 @@ static int send_SRW_presentRequest(const char *arg)
     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;
+    sr->u.request->recordSchema = record_schema;
     if (recordsyntax_size == 1 && !yaz_matchstr(recordsyntax_list[0], "xml"))
         sr->u.request->recordPacking = "xml";
     return send_srw(sr);
@@ -3401,11 +3396,8 @@ static int send_Z3950_scanrequest(const char *set,  const char *query,
             req->termListAndStartPoint->term->u.general)
         {
             req->termListAndStartPoint->term->u.general->buf =
-                (unsigned char *) odr_strdup(out, term);
+                odr_strdup(out, term);
             req->termListAndStartPoint->term->u.general->len = strlen(term);
-#if OCT_SIZE
-            req->termListAndStartPoint->term->u.general->size = strlen(term);
-#endif
         }
     }
     req->referenceId = set_refid(out);
@@ -4336,10 +4328,7 @@ struct timeval tv_start;
 static void handle_srw_record(Z_SRW_record *rec)
 {
     if (rec->recordPosition)
-    {
         printf("pos=" ODR_INT_PRINTF, *rec->recordPosition);
-        setno = *rec->recordPosition + 1;
-    }
     if (rec->recordSchema)
         printf(" schema=%s", rec->recordSchema);
     printf("\n");
@@ -4393,6 +4382,7 @@ static void handle_srw_response(Z_SRW_searchRetrieveResponse *res)
         }
         handle_srw_record(res->records + i);
     }
+    setno += res->num_records;
 }
 
 static void handle_srw_scan_term(Z_SRW_scanTerm *term)
@@ -4476,6 +4466,7 @@ static void http_response(Z_HTTP_Response *hres)
                 {YAZ_XMLNS_SRU_v2_mask, 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},
+                {"searchRetrieveResponse", 0, (Z_SOAP_fun) yaz_srw_codec},
                 {0, 0, 0}
             };
             ret = z_soap_codec(o, &soap_package,
@@ -4905,7 +4896,9 @@ static int cmd_list_all(const char* args)
     printf("Named Result Sets    : %s\n",setnumber==-1?"off":"on");
 
     /* piggy back options */
-    printf("ssub/lslb/mspn       : %d/%d/%d\n",smallSetUpperBound,largeSetLowerBound,mediumSetPresentNumber);
+    printf("ssub/lslb/mspn       : " ODR_INT_PRINTF "/" ODR_INT_PRINTF "/"
+           ODR_INT_PRINTF "\n",
+           smallSetUpperBound, largeSetLowerBound, mediumSetPresentNumber);
 
     /* print present related options */
     if (recordsyntax_size > 0)