X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=client%2Fclient.c;h=71432b4e2ca16f298089f51bfca017c6f49c3a8b;hb=c1ee92c068d11468080418f5a5a5c44028deafa7;hp=d9a98f8eb89b47c00d16093b36e7cc4e40ac29e4;hpb=2ad2651374674c895ad59b267da6fe2d8665fabd;p=yaz-moved-to-github.git diff --git a/client/client.c b/client/client.c index d9a98f8..71432b4 100644 --- a/client/client.c +++ b/client/client.c @@ -1,10 +1,13 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2010 Index Data + * Copyright (C) 1995-2011 Index Data * See the file LICENSE for details. */ /** \file client.c * \brief yaz-client program */ +#if HAVE_CONFIG_H +#include +#endif #include #include @@ -145,6 +148,8 @@ static int scan_size = 20; static char cur_host[200]; static Odr_int last_hit_count = 0; +static int pretty_xml = 0; + typedef enum { QueryType_Prefix, QueryType_CCL, @@ -284,7 +289,7 @@ int send_apdu(Z_APDU *a) do_hex_dump(buf, len); if (cs_put(conn, buf, len) < 0) { - fprintf(stderr, "cs_put: %s", cs_errmsg(cs_errno(conn))); + fprintf(stderr, "cs_put: %s\n", cs_errmsg(cs_errno(conn))); close_session(); return 0; } @@ -846,6 +851,31 @@ static void print_record(const char *buf, size_t len) printf("\n"); } +static void print_xml_record(const char *buf, size_t len) +{ + int has_printed = 0; +#if YAZ_HAVE_XML2 + if (pretty_xml) + { + xmlDocPtr doc; + xmlKeepBlanksDefault(0); /* get get xmlDocFormatMemory to work! */ + doc = xmlParseMemory(buf, len); + if (doc) + { + xmlChar *xml_mem; + int xml_size; + xmlDocDumpFormatMemory(doc, &xml_mem, &xml_size, 1); + fwrite(xml_mem, 1, xml_size, stdout); + xmlFree(xml_mem); + xmlFreeDoc(doc); + has_printed = 1; + } + } +#endif + if (!has_printed) + fwrite(buf, 1, len, stdout); +} + static void display_record(Z_External *r) { const Odr_oid *oid = r->direct_reference; @@ -905,7 +935,8 @@ static void display_record(Z_External *r) || !oid_oidcmp(oid, yaz_oid_recsyn_xml) || !oid_oidcmp(oid, yaz_oid_recsyn_html)) { - fwrite(octet_buf, 1, octet_len, stdout); + print_xml_record(octet_buf, octet_len); + } else if (yaz_oid_is_iso2709(oid)) { @@ -1284,7 +1315,7 @@ static int send_srw_host_path(Z_SRW_PDU *sr, const char *host_port, } else if (!yaz_matchstr(sru_method, "solr")) { - yaz_solr_encode(gdu->u.HTTP_Request, sr, out, charset); + yaz_solr_encode_request(gdu->u.HTTP_Request, sr, out, charset); } return send_gdu(gdu); @@ -1455,7 +1486,7 @@ static int send_SRW_searchRequest(const char *arg) return 0; } sr->u.request->maximumRecords = odr_intdup(out, 0); - + sr->u.request->facetList = facet_list; if (record_schema) sr->u.request->recordSchema = record_schema; if (recordsyntax_size == 1 && !yaz_matchstr(recordsyntax_list[0], "xml")) @@ -2280,6 +2311,22 @@ static int only_z3950(void) return 0; } +static int is_SRW(void) +{ + if (!conn) + { + printf("Not connected yet\n"); + return 1; + } + if (protocol == PROTO_HTTP && yaz_matchstr(sru_method, "solr")) + { + printf("Not supported by SRW\n"); + return 1; + } + return 0; +} + + static int cmd_update_common(const char *arg, int version); static int cmd_update(const char *arg) @@ -2887,6 +2934,8 @@ static int cmd_find(const char *arg) static int cmd_facets(const char *arg) { + /* TODO Wrong odr. Loosing memory */ + ODR odr = odr_createmem(ODR_ENCODE); int size = 0; if (!*arg) { @@ -2895,25 +2944,17 @@ static int cmd_facets(const char *arg) return 0; } size = strlen(arg); - if (only_z3950()) - { - printf("Currently only supported for Z39.50.\n"); - return 0; + if (is_SRW()) { + printf("WARN: No supported for SRW/SRU.\n"); } - else - { - /* TODO Wrong odr. Loosing memory */ - ODR odr = odr_createmem(ODR_ENCODE); - facet_list = yaz_pqf_parse_facet_list(odr, arg); + facet_list = yaz_pqf_parse_facet_list(odr, arg); - if (!facet_list) - { - printf("Invalid facet list: %s", arg); - return 0; - } - return 1; + if (!facet_list) + { + printf("Invalid facet list: %s", arg); + return 0; } - return 2; + return 1; } @@ -2975,21 +3016,50 @@ static int cmd_setnames(const char *arg) /* PRESENT SERVICE ----------------------------- */ +size_t check_token(const char *haystack, const char *token) +{ + size_t len = strlen(token); + size_t extra; + if (strncmp(haystack, token, len)) + return 0; + for (extra = 0; haystack[extra + len] != '\0'; extra++) + if (!strchr(" \r\n\t", haystack[extra + len])) + { + if (extra) + break; + else + return 0; /* no whitespace after token */ + } + return extra + len; +} + static int parse_show_args(const char *arg_c, char *setstring, Odr_int *start, Odr_int *number) { char *end_ptr; Odr_int start_position; + size_t token_len; if (setnumber >= 0) sprintf(setstring, "%d", setnumber); else *setstring = '\0'; + + token_len = check_token(arg_c, "format"); + if (token_len) + { + pretty_xml = 1; + arg_c += token_len; + } + else + pretty_xml = 0; - if (!strcmp(arg_c, "all")) + token_len = check_token(arg_c, "all"); + if (token_len) { *number = last_hit_count; *start = 1; + return 1; } start_position = odr_strtol(arg_c, &end_ptr, 10); if (end_ptr == arg_c) @@ -4272,7 +4342,7 @@ static void handle_srw_record(Z_SRW_record *rec) printf("\n"); if (rec->recordData_buf && rec->recordData_len) { - printf("%.*s", rec->recordData_len, rec->recordData_buf); + print_xml_record(rec->recordData_buf, rec->recordData_len); marc_file_write(rec->recordData_buf, rec->recordData_len); } else @@ -4305,6 +4375,9 @@ 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) { + display_facets(res->facetList); + } for (i = 0; inum_records; i++) handle_srw_record(res->records + i); } @@ -4369,7 +4442,7 @@ static void http_response(Z_HTTP_Response *hres) { Z_SRW_PDU *sr = 0; ODR o = odr_createmem(ODR_DECODE); - ret = yaz_solr_decode(o, hres, &sr); + ret = yaz_solr_decode_response(o, hres, &sr); if (ret == 0 && sr->which == Z_SRW_searchRetrieve_response) handle_srw_response(sr->u.response);