X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=71c3910f11b406e78e01e5e4e7127d9c39a1994d;hp=56178dada8263cf5eddbeb059105cbe52bb838ab;hb=a2ee2bb752aefcfcec36b8880982a50c9ba1e4ff;hpb=c6f7e21560c74ac3cd856c5d0bf9120fc2dfce9f diff --git a/client/client.c b/client/client.c index 56178da..71c3910 100644 --- a/client/client.c +++ b/client/client.c @@ -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) @@ -838,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; @@ -926,7 +973,7 @@ static void display_record(Z_External *r) } else if (!oid_oidcmp(oid, yaz_oid_recsyn_mab)) { - print_record(octet_buf, octet_len); + print_mab_record(octet_buf, octet_len); } else { @@ -1477,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); @@ -2632,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"; @@ -2903,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; } @@ -3138,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); @@ -4283,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"); @@ -4340,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) @@ -4423,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, @@ -4852,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)