X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=c778d7703c6ee489082595b9432cd1ba1af2f99c;hp=ed7a0c7b637c02f0ed684feee70c5580f0c31638;hb=70167dec477969519b27873537a7d9d7d7e686c1;hpb=77eb8faa2fa82a314874df3243cac0ca153adccf diff --git a/client/client.c b/client/client.c index ed7a0c7..c778d77 100644 --- a/client/client.c +++ b/client/client.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2011 Index Data + * Copyright (C) 1995-2012 Index Data * See the file LICENSE for details. */ /** \file client.c @@ -48,7 +48,6 @@ #include #include -#define NO_OID 1 #include #include #include @@ -143,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, @@ -285,7 +284,6 @@ int send_apdu(Z_APDU *a) buf = odr_getbuf(out, &len, 0); if (ber_file) odr_dumpBER(ber_file, buf, len); - /* printf ("sending APDU of size %d\n", len); */ do_hex_dump(buf, len); if (cs_put(conn, buf, len) < 0) { @@ -1415,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; @@ -1436,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); } @@ -1481,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) @@ -1663,16 +1662,16 @@ static void display_term(Z_Term *term) switch (term->which) { case Z_Term_general: - printf(" %.*s", term->u.general->len, term->u.general->buf); + printf("%.*s", term->u.general->len, term->u.general->buf); break; case Z_Term_characterString: - printf(" %s", term->u.characterString); + printf("%s", term->u.characterString); break; case Z_Term_numeric: - printf(" " ODR_INT_PRINTF, *term->u.numeric); + printf(ODR_INT_PRINTF, *term->u.numeric); break; case Z_Term_null: - printf(" null"); + printf("null"); break; } } @@ -1701,17 +1700,18 @@ static void display_facet(Z_FacetField *facet) struct yaz_facet_attr attr_values; attr_values.errcode = 0; attr_values.limit = -1; - attr_values.useattr = 0; + attr_values.useattr = "NONE"; attr_values.relation = "default"; 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]; + printf(" "); display_term(facetTerm->term); printf(" (" NMEM_INT_PRINTF ")\n", *facetTerm->count); } @@ -2130,6 +2130,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; @@ -2378,9 +2379,9 @@ static int cmd_update_common(const char *arg, int version) #if YAZ_HAVE_XML2 if (protocol == PROTO_HTTP) - return send_SRW_update(action_no, recid_buf, rec_buf, rec_len); + return send_SRW_update(action_no, recid, rec_buf, rec_len); #endif - return send_Z3950_update(version, action_no, recid_buf, rec_buf, rec_len); + return send_Z3950_update(version, action_no, recid, rec_buf, rec_len); } #if YAZ_HAVE_XML2 @@ -3175,6 +3176,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; @@ -3322,13 +3324,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; @@ -3398,7 +3401,7 @@ static int send_Z3950_scanrequest(const char *set, const char *query, req->num_databaseNames = num_databaseNames; req->databaseNames = databaseNames; req->numberOfTermsRequested = # - req->preferredPositionInResponse = &pp; + req->preferredPositionInResponse = pos; req->stepSize = odr_intdup(out, scan_stepSize); if (set) @@ -3573,9 +3576,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; } @@ -3589,6 +3600,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 @@ -3596,16 +3629,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; @@ -3626,19 +3651,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; } } @@ -4264,6 +4279,8 @@ static void initialize(const char *rc_file) exit(1); } + strcpy(scan_position, "1"); + setvbuf(stdout, 0, _IONBF, 0); if (apdu_file) odr_setprint(print, apdu_file); @@ -4350,11 +4367,21 @@ static void handle_srw_response(Z_SRW_searchRetrieveResponse *res) } if (res->numberOfRecords) printf("Number of hits: " ODR_INT_PRINTF "\n", *res->numberOfRecords); - if (res->facetList) { + if (res->facetList) display_facets(res->facetList); - } - for (i = 0; inum_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) @@ -4432,8 +4459,9 @@ 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] = { + Z_SOAP_Handler soap_handlers[4] = { {YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec}, + {YAZ_XMLNS_SRU_v2_response, 0, (Z_SOAP_fun) yaz_srw_codec}, {YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec}, {0, 0, 0} };