Merge branch 'master' into sru_2_0
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 24 Sep 2013 13:06:40 +0000 (15:06 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 24 Sep 2013 13:06:40 +0000 (15:06 +0200)
1  2 
client/client.c

diff --combined client/client.c
@@@ -83,7 -83,6 +83,7 @@@ static file_history_t file_history = 0
  
  static char sru_method[10] = "soap";
  static char sru_version[10] = "1.2";
 +static char sru_recordPacking[10] = "";
  static char *codeset = 0;               /* character set for output */
  static int hex_dump = 0;
  static char *dump_file_prefix = 0;
@@@ -253,12 -252,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)
@@@ -321,9 -317,14 +321,9 @@@ static void print_refid(Z_ReferenceId *
  
  static Z_ReferenceId *set_refid(ODR out)
  {
 -    Z_ReferenceId *id;
      if (!refid)
          return 0;
 -    id = (Z_ReferenceId *) odr_malloc(out, sizeof(*id));
 -    id->size = id->len = strlen(refid);
 -    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 ------------------------------- */
@@@ -841,6 -842,50 +841,50 @@@ static void print_record(const char *bu
          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;
@@@ -929,7 -974,7 +973,7 @@@ static void display_record(Z_External *
          }
          else if (!oid_oidcmp(oid, yaz_oid_recsyn_mab))
          {
-             print_record(octet_buf, octet_len);
+             print_mab_record(octet_buf, octet_len);
          }
          else
          {
@@@ -1419,12 -1464,12 +1463,12 @@@ static int send_SRW_scanRequest(const c
      switch (queryType)
      {
      case QueryType_CQL:
 -        sr->u.scan_request->query_type = Z_SRW_query_type_cql;
 -        sr->u.scan_request->scanClause.cql = encode_SRW_term(out, arg);
 +        sr->u.scan_request->queryType = "cql";
 +        sr->u.scan_request->scanClause = encode_SRW_term(out, arg);
          break;
      case QueryType_Prefix:
 -        sr->u.scan_request->query_type = Z_SRW_query_type_pqf;
 -        sr->u.scan_request->scanClause.pqf = encode_SRW_term(out, arg);
 +        sr->u.scan_request->queryType = "pqf";
 +        sr->u.scan_request->scanClause = encode_SRW_term(out, arg);
          break;
      default:
          printf("Only CQL and PQF supported in SRW\n");
@@@ -1458,25 -1503,23 +1502,25 @@@ static int send_SRW_searchRequest(cons
      switch (queryType)
      {
      case QueryType_CQL:
 -        srw_sr->u.request->query_type = Z_SRW_query_type_cql;
 -        srw_sr->u.request->query.cql = encode_SRW_term(srw_sr_odr_out, arg);
 +        srw_sr->u.request->queryType = "cql";
 +        srw_sr->u.request->query = encode_SRW_term(srw_sr_odr_out, arg);
  
 -        sr->u.request->query_type = Z_SRW_query_type_cql;
 -        sr->u.request->query.cql = encode_SRW_term(srw_sr_odr_out, arg);
 +        sr->u.request->queryType = "cql";
 +        sr->u.request->query = encode_SRW_term(srw_sr_odr_out, arg);
          break;
      case QueryType_Prefix:
 -        srw_sr->u.request->query_type = Z_SRW_query_type_pqf;
 -        srw_sr->u.request->query.pqf = encode_SRW_term(srw_sr_odr_out, arg);
 +        srw_sr->u.request->queryType = "pqf";
 +        srw_sr->u.request->query = encode_SRW_term(srw_sr_odr_out, arg);
  
 -        sr->u.request->query_type = Z_SRW_query_type_pqf;
 -        sr->u.request->query.pqf = encode_SRW_term(srw_sr_odr_out, arg);
 +        sr->u.request->queryType = "pqf";
 +        sr->u.request->query = encode_SRW_term(srw_sr_odr_out, arg);
          break;
      default:
          printf("Only CQL and PQF supported in SRW\n");
          return 0;
      }
 +    if (*sru_recordPacking)
 +        sr->u.request->recordPacking = sru_recordPacking;
      sru_maximumRecords = 0;
      sr->u.request->maximumRecords = odr_intdup(out, 0);
      sr->u.request->facetList = facet_list;
@@@ -1561,12 -1604,12 +1605,12 @@@ static int send_Z3950_searchRequest(con
      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 = bigo.size = 2100;
 +        bigo.len = 2100;
          bigo.buf = big;
          req->referenceId = &bigo;
      }
      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:
@@@ -1868,7 -1911,7 +1912,7 @@@ static void print_referenceId(int iLeve
          int i;
  
          print_level(iLevel);
 -        printf("Ref Id (%d, %d): ", referenceId->len, referenceId->size);
 +        printf("Ref Id (%d): ", referenceId->len);
          for (i = 0; i < referenceId->len; i++)
              printf("%c", referenceId->buf[i]);
          printf("\n");
@@@ -2130,8 -2173,16 +2174,8 @@@ static Z_External *create_external_item
          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;
 -        r->u.single_ASN1_type->size = item_request_size;
 -        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;
@@@ -2175,8 -2226,18 +2219,8 @@@ static Z_External *create_external_ILL_
          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;
 -        r->u.single_ASN1_type->size = ill_request_size;
 -        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;
  }
@@@ -2465,8 -2526,16 +2509,8 @@@ static int send_Z3950_update(int versio
          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;
 -            notToKeep->elements[0]->u.opaque->size = strlen(recid);
 -            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;
          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;
 -            notToKeep->elements[0]->u.opaque->size = strlen(recid);
 -            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;
@@@ -2549,7 -2626,7 +2593,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);
@@@ -2792,8 -2869,7 +2836,8 @@@ static int cmd_sru(const char *arg
      }
      else
      {
 -        int r = sscanf(arg, "%9s %9s", sru_method, sru_version);
 +        int r = sscanf(arg, "%9s %9s %9s", sru_method, sru_version,
 +            sru_recordPacking);
          if (r >= 1)
          {
              if (!yaz_matchstr(sru_method, "post"))
@@@ -3136,8 -3212,6 +3180,8 @@@ static int send_SRW_presentRequest(cons
          return 0;
      if (!parse_show_args(arg, setstring, &setno, &nos))
          return 0;
 +    if (*sru_recordPacking)
 +        sr->u.request->recordPacking = sru_recordPacking;
      sr->u.request->startRecord = odr_intdup(out, setno);
      sru_maximumRecords = nos;
      sr->u.request->maximumRecords = odr_intdup(out, nos);
@@@ -3354,8 -3428,10 +3398,8 @@@ static int send_Z3950_scanrequest(cons
              req->termListAndStartPoint->term->u.general)
          {
              req->termListAndStartPoint->term->u.general->buf =
 -                (unsigned char *) odr_strdup(out, term);
 -            req->termListAndStartPoint->term->u.general->len =
 -                req->termListAndStartPoint->term->u.general->size =
 -                strlen(term);
 +                odr_strdup(out, term);
 +            req->termListAndStartPoint->term->u.general->len = strlen(term);
          }
      }
      req->referenceId = set_refid(out);
@@@ -4423,7 -4499,7 +4467,7 @@@ static void http_response(Z_HTTP_Respon
              Z_SOAP *soap_package = 0;
              ODR o = odr_createmem(ODR_DECODE);
              Z_SOAP_Handler soap_handlers[] = {
 -                {YAZ_XMLNS_SRU_v2_response, 0, (Z_SOAP_fun) yaz_srw_codec},
 +                {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},
                  {0, 0, 0}