X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=a3442dc3bf759a98271581a05a0f101b6ff63d51;hp=144c0f484750a4be912e42f64977044a989ad6b1;hb=b56b6242e4e9c0011b9a2dae6d67c3ef0789251f;hpb=d9af31fa7067266b3bad4a734c0b61ac6bc5d67d diff --git a/client/client.c b/client/client.c index 144c0f4..a3442dc 100644 --- a/client/client.c +++ b/client/client.c @@ -62,6 +62,7 @@ #include #include #include +#include #if HAVE_READLINE_READLINE_H #include @@ -104,6 +105,7 @@ static int smallSetUpperBound = 0; static int largeSetLowerBound = 1; static int mediumSetPresentNumber = 0; static Z_ElementSetNames *elementSetNames = 0; +static Z_FacetList *facet_list = 0; static Odr_int setno = 1; /* current set offset */ static enum oid_proto protocol = PROTO_Z3950; /* current app protocol */ #define RECORDSYNTAX_MAX 20 @@ -243,10 +245,14 @@ static void do_hex_dump(const char* buf, size_t len) void add_otherInfos(Z_APDU *a) { Z_OtherInformation **oi; - int i; + int i = 0; yaz_oi_APDU(a, &oi); - for(i=0; i 0) yaz_oi_set_string_oid(oi, out, extraOtherInfos[i].oid, @@ -746,6 +752,9 @@ int cmd_open(const char *arg) strncpy(cur_host, arg, sizeof(cur_host)-1); cur_host[sizeof(cur_host)-1] = 0; } + /* TODO Make facet definition survive the open command without crashing */ + /* TODO Fix deallocation */ + facet_list = 0; set_base(""); r = session_connect(cur_host); @@ -777,7 +786,7 @@ int cmd_authentication(const char *arg) auth->which = Z_IdAuthentication_anonymous; auth->u.anonymous = odr_nullval(); printf("Authentication set to Anonymous\n"); - } + } else { auth->which = Z_IdAuthentication_open; @@ -898,7 +907,7 @@ static void display_record(Z_External *r) yaz_iconv_t cd = 0; yaz_marc_t mt = yaz_marc_create(); const char *from = 0; - + if (marcCharset && !strcmp(marcCharset, "auto")) { if (!oid_oidcmp(oid, yaz_oid_recsyn_usmarc)) @@ -926,7 +935,7 @@ static void display_record(Z_External *r) printf("\n"); } } - + if (yaz_marc_decode_buf(mt, octet_buf, octet_len, &result, &rlen)> 0) { @@ -1280,17 +1289,34 @@ static int send_SRW_redirect(const char *uri, Z_HTTP_Response *cookie_hres) const char *username = 0; const char *password = 0; struct Z_HTTP_Header *h; + char *combined_cookies = 0; + int combined_cookies_len = 0; Z_GDU *gdu = get_HTTP_Request_url(out, uri); gdu->u.HTTP_Request->method = odr_strdup(out, "GET"); z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, "Accept", "text/xml"); - + for (h = cookie_hres->headers; h; h = h->next) { - if (!strcmp(h->name, "Set-Cookie")) - z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, - "Cookie", h->value); + if (!strcmp(h->name, "Set-Cookie")) { + char *cp; + + if (!(cp = strchr(h->value, ';'))) + cp = h->value + strlen(h->value); + if (cp - h->value >= 1) { + combined_cookies = xrealloc(combined_cookies, combined_cookies_len + cp - h->value + 3); + memcpy(combined_cookies+combined_cookies_len, h->value, cp - h->value); + combined_cookies[combined_cookies_len + cp - h->value] = '\0'; + strcat(combined_cookies,"; "); + combined_cookies_len = strlen(combined_cookies); + } + } + } + if (combined_cookies_len) + { + z_HTTP_header_add(out, &gdu->u.HTTP_Request->headers, "Cookie", combined_cookies); + xfree(combined_cookies); } if (auth) @@ -1586,6 +1612,24 @@ static int send_searchRequest(const char *arg) return 2; } +static void display_term(Z_Term *term) { + switch (term->which) + { + case Z_Term_general: + printf(" %.*s", term->u.general->len, term->u.general->buf); + break; + case Z_Term_characterString: + printf(" %s", term->u.characterString); + break; + case Z_Term_numeric: + printf(" " ODR_INT_PRINTF, *term->u.numeric); + break; + case Z_Term_null: + printf(" null"); + break; + } +} + /* display Query Expression as part of searchResult-1 */ static void display_queryExpression(const char *lead, Z_QueryExpression *qe) { @@ -1597,25 +1641,72 @@ static void display_queryExpression(const char *lead, Z_QueryExpression *qe) if (qe->u.term->queryTerm) { Z_Term *term = qe->u.term->queryTerm; - switch (term->which) - { - case Z_Term_general: - printf("%.*s", term->u.general->len, term->u.general->buf); - break; - case Z_Term_characterString: - printf("%s", term->u.characterString); - break; - case Z_Term_numeric: - printf(ODR_INT_PRINTF, *term->u.numeric); - break; - case Z_Term_null: - printf("null"); - break; + display_term(term); + } + } +} + +static void display_facet(Z_FacetField *facet) { + if (facet->attributes) { + Z_AttributeList *al = facet->attributes; + struct yaz_facet_attr attr_values; + attr_values.errcode = 0; + attr_values.limit = -1; + attr_values.useattr = 0; + 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); + for (term_index = 0 ; term_index < facet->num_terms; term_index++) { + Z_FacetTerm *facetTerm = facet->terms[term_index]; + display_term(facetTerm->term); + printf(" (" NMEM_INT_PRINTF ")\n", *facetTerm->count); } } + } } +static void* display_facets(Z_FacetList *fl) +{ + int index; + printf("Facets(%d): \n", fl->num); + + for (index = 0; index < fl->num ; index++) { + display_facet(fl->elements[index]); + } + return 0; +} + +void display_searchResult1(Z_SearchInfoReport *sr) +{ + int j; + printf("SearchResult-1:"); + for (j = 0; j < sr->num; j++) + { + if (j) + printf(","); + if (!sr->elements[j]->subqueryExpression) + printf("%d", j); + display_queryExpression("term", + sr->elements[j]->subqueryExpression); + display_queryExpression("interpretation", + sr->elements[j]->subqueryInterpretation); + display_queryExpression("recommendation", + sr->elements[j]->subqueryRecommendation); + if (sr->elements[j]->subqueryCount) + printf(" cnt=" ODR_INT_PRINTF, + *sr->elements[j]->subqueryCount); + if (sr->elements[j]->subqueryId) + printf(" id=%s ", sr->elements[j]->subqueryId); + } + printf("\n"); +} + + + /* see if we can find USR:SearchResult-1 */ static void display_searchResult(Z_OtherInformation *o) { @@ -1629,30 +1720,9 @@ static void display_searchResult(Z_OtherInformation *o) Z_External *ext = o->list[i]->information.externallyDefinedInfo; if (ext->which == Z_External_searchResult1) - { - int j; - Z_SearchInfoReport *sr = ext->u.searchResult1; - printf("SearchResult-1:"); - for (j = 0; j < sr->num; j++) - { - if (j) - printf(","); - if (!sr->elements[j]->subqueryExpression) - printf("%d", j); - display_queryExpression("term", - sr->elements[j]->subqueryExpression); - display_queryExpression("interpretation", - sr->elements[j]->subqueryInterpretation); - display_queryExpression("recommendation", - sr->elements[j]->subqueryRecommendation); - if (sr->elements[j]->subqueryCount) - printf(" cnt=" ODR_INT_PRINTF, - *sr->elements[j]->subqueryCount); - if (sr->elements[j]->subqueryId) - printf(" id=%s ", sr->elements[j]->subqueryId); - } - printf("\n"); - } + display_searchResult1(ext->u.searchResult1); + else if (ext->which == Z_External_userFacets) + display_facets(ext->u.facetList); } } } @@ -2585,11 +2655,11 @@ static Z_GDU *get_HTTP_Request_url(ODR odr, const char *url) cp0 = cp0+3; else cp0 = host; - + cp1 = strchr(cp0, '/'); if (!cp1) cp1 = cp0 + strlen(cp0); - + if (cp0 && cp1) { char *h = (char*) odr_malloc(odr, cp1 - cp0 + 1); @@ -2608,7 +2678,7 @@ static WRBUF get_url(const char *uri, WRBUF username, WRBUF password, ODR out = odr_createmem(ODR_ENCODE); ODR in = odr_createmem(ODR_DECODE); Z_GDU *gdu = get_HTTP_Request_url(out, uri); - + gdu->u.HTTP_Request->method = odr_strdup(out, "GET"); if (username && password) { @@ -2620,7 +2690,7 @@ static WRBUF get_url(const char *uri, WRBUF username, WRBUF password, "text/xml"); if (!z_GDU(out, &gdu, 0, 0)) { - yaz_log(YLOG_WARN, "Can not encode HTTP request URL:%s", uri); + yaz_log(YLOG_WARN, "Can not encode HTTP request URL:%s", uri); } else { @@ -2632,7 +2702,7 @@ static WRBUF get_url(const char *uri, WRBUF username, WRBUF password, { int len; char *buf = odr_getbuf(out, &len, 0); - + if (cs_put(conn, buf, len) < 0) yaz_log(YLOG_WARN, "cs_put failed URL:%s", uri); else @@ -2660,7 +2730,7 @@ static WRBUF get_url(const char *uri, WRBUF username, WRBUF password, result = wrbuf_alloc(); if (show_headers) { - + wrbuf_printf(result, "HTTP %d\n", res->code); for (h = res->headers; h; h = h->next) wrbuf_printf(result, "%s: %s\n", @@ -2679,7 +2749,7 @@ static WRBUF get_url(const char *uri, WRBUF username, WRBUF password, odr_destroy(in); return result; } - + static int cmd_url(const char *arg) { @@ -2788,6 +2858,37 @@ static int cmd_find(const char *arg) return 2; } +static int cmd_facets(const char *arg) +{ + int size = 0; + if (!*arg) + { + facet_list = 0; + printf("Facets cleared.\n"); + return 0; + } + size = strlen(arg); + if (only_z3950()) + { + printf("Currently only supported for Z39.50.\n"); + return 0; + } + else + { + /* TODO Wrong odr. Loosing memory */ + ODR odr = odr_createmem(ODR_ENCODE); + facet_list = yaz_pqf_parse_facet_list(odr, arg); + + if (!facet_list) { + printf("Invalid facet list: %s", arg); + return 0; + } + return 1; + } + return 2; +} + + static int cmd_delete(const char *arg) { if (only_z3950()) @@ -3172,6 +3273,7 @@ int send_scanrequest(const char *set, const char *query, { YAZ_PQF_Parser pqf_parser = yaz_pqf_create(); + if (!(req->termListAndStartPoint = yaz_pqf_scan(pqf_parser, out, &req->attributeSet, query))) { @@ -3263,7 +3365,7 @@ int send_sortrequest(const char *arg, int newset) return 2; } -void display_term(Z_TermInfo *t) +void display_term_info(Z_TermInfo *t) { if (t->displayTerm) printf("%s", t->displayTerm); @@ -3305,7 +3407,7 @@ void process_scanResponse(Z_ScanResponse *res) if (entries[i]->which == Z_Entry_termInfo) { printf("%c ", i + 1 == pos_term ? '*' : ' '); - display_term(entries[i]->u.termInfo); + display_term_info(entries[i]->u.termInfo); } else display_diagrecs(&entries[i]->u.surrogateDiagnostic, 1); @@ -3500,7 +3602,7 @@ int cmd_format(const char *arg) while (sscanf(cp, "%40s%n", form_str, &nor) >= 1 && nor > 0 && idx < RECORDSYNTAX_MAX) { - if (strcmp(form_str, "none") && + if (strcmp(form_str, "none") && !yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN, form_str, out)) { printf("Bad format: %s\n", form_str); @@ -3513,7 +3615,7 @@ int cmd_format(const char *arg) xfree(recordsyntax_list[i]); recordsyntax_list[i] = 0; } - + cp = arg; while (sscanf(cp, "%40s%n", form_str, &nor) >= 1 && nor > 0 && idx < RECORDSYNTAX_MAX) @@ -3766,7 +3868,7 @@ int cmd_source(const char* arg, int echo ) return -1; } - while (fgets(line, sizeof(line), includeFile)) + while (fgets(line, sizeof(line), includeFile)) { if (strlen(line) < 2) continue; @@ -4735,6 +4837,7 @@ static struct { {"open", cmd_open, "('tcp'|'ssl')':[':'][/]",NULL,0,NULL}, {"quit", cmd_quit, "",NULL,0,NULL}, {"find", cmd_find, "",NULL,0,NULL}, + {"facets", cmd_facets, "",NULL,0,NULL}, {"delete", cmd_delete, "",NULL,0,NULL}, {"base", cmd_base, "",NULL,0,NULL}, {"show", cmd_show, "['+'<#recs>['+']]",NULL,0,NULL},