X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=a3442dc3bf759a98271581a05a0f101b6ff63d51;hp=cd849a46ba77238365b85a83741961c953c76ee4;hb=b56b6242e4e9c0011b9a2dae6d67c3ef0789251f;hpb=b10a7695e0cd0a6f8a8db03388b10c5090522d0d diff --git a/client/client.c b/client/client.c index cd849a4..a3442dc 100644 --- a/client/client.c +++ b/client/client.c @@ -62,6 +62,7 @@ #include #include #include +#include #if HAVE_READLINE_READLINE_H #include @@ -751,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); @@ -782,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; @@ -903,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)) @@ -931,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) { @@ -1285,14 +1289,14 @@ 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; + 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")) { @@ -1608,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) { @@ -1619,46 +1641,41 @@ 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, attribute_index; - printf("UserFacets-1:"); - for (index = 0; index < fl->num ; index++) { - if (index) - printf(","); - if (!fl->elements[index]->attributes) { - Z_AttributeList *al = fl->elements[index]->attributes; - for (attribute_index = 0; attribute_index < al->num_attributes; attribute_index++) { - switch (al->attributes[attribute_index]->which) { - case Z_AttributeValue_complex: - break; - case Z_AttributeValue_numeric: - break; - default: - break; - }; - } - } + int index; + printf("Facets(%d): \n", fl->num); + for (index = 0; index < fl->num ; index++) { + display_facet(fl->elements[index]); } return 0; } @@ -2638,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); @@ -2661,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) { @@ -2673,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 { @@ -2685,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 @@ -2713,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", @@ -2732,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) { @@ -2841,45 +2858,13 @@ static int cmd_find(const char *arg) return 2; } -static Z_FacetField* parse_facet(ODR odr, char *facet, int length) -{ - YAZ_PQF_Parser pqf_parser = yaz_pqf_create(); - char buffer[length+1]; - Odr_oid *attributeSetId; - Z_FacetField *facet_field; - Z_AttributeList *attribute_list; - memcpy(buffer, facet, length); - buffer[length] = '\0'; - attribute_list = yaz_pqf_scan_attribute_list(pqf_parser, odr, &attributeSetId, buffer); - - if (!attribute_list) { - printf("Invalid facet definition: %s", facet); - return 0; - } - facet_field = odr_malloc(odr, sizeof(*facet_field)); - facet_field->attributes = attribute_list; - facet_field->num_terms = 0; - facet_field->terms = 0; - return facet_field; -} - -static int scan_facet_argument(const char *arg) { - int index; - int length = strlen(arg); - int count = 1; - for (index = 0; index < length; index++) { - if (arg[index] == ',') - count++; - } - return count; -} - static int cmd_facets(const char *arg) { int size = 0; if (!*arg) { - printf("Which facets?\n"); + facet_list = 0; + printf("Facets cleared.\n"); return 0; } size = strlen(arg); @@ -2890,34 +2875,14 @@ static int cmd_facets(const char *arg) } else { - int index = 0; - Z_FacetField **elements; - int num_elements ; - char *facet = arg; - // parse facets list + /* TODO Wrong odr. Loosing memory */ ODR odr = odr_createmem(ODR_ENCODE); - num_elements = scan_facet_argument(arg); - facet_list = odr_malloc(odr, sizeof(*facet_list)); - elements = odr_malloc(odr, num_elements * sizeof(*elements)); - for (index = 0; index < num_elements;) { - char *pos = strchr(facet, ','); - if (pos == 0) - pos = facet + strlen(facet); - elements[index] = parse_facet(odr, facet, (pos - facet)); - if (elements[index]) { - index++; - } - else - num_elements--; - facet = pos + 1; - } + facet_list = yaz_pqf_parse_facet_list(odr, arg); - if (!num_elements || !facet_list) { + if (!facet_list) { printf("Invalid facet list: %s", arg); return 0; } - facet_list->elements = elements; - facet_list->num = index; return 1; } return 2; @@ -3400,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); @@ -3442,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); @@ -3637,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); @@ -3650,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) @@ -3903,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;