X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=client%2Fclient.c;h=5b7594d1f3346bcefca7d316cebf6e76b5ac0758;hp=d1dfe502b62748282e28f3f328c262319e0bcfb2;hb=3fa5c310994e3449aac2926385f742fe34fb5757;hpb=3d536728dae01844f9a2b89337eb3b3fdb759382 diff --git a/client/client.c b/client/client.c index d1dfe50..5b7594d 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); @@ -1603,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) { @@ -1614,25 +1641,74 @@ 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 attrvalues attr_values; + attr_values.errcode = 0; + attr_values.limit = -1; + attr_values.useattr = 0; + attr_values.relation = "default"; + + facetattrs(al, &attr_values); + if (!attr_values.errcode) { + int term_index; + printf("Facet: %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++) { + if (index) + printf(","); + 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) { @@ -1646,30 +1722,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); } } } @@ -2805,6 +2860,94 @@ static int cmd_find(const char *arg) return 2; } +static Z_FacetField* parse_facet(ODR odr, const 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; + //debug_add_facet_term(odr, facet_field); + + return facet_field; +} + +#define FACET_DElIMITER ',' + +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] == FACET_DElIMITER) + count++; + } + return count; +} + +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 + { + int index = 0; + Z_FacetField **elements; + int num_elements ; + const char *facet = arg; + // parse facets list + 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;) { + const char *pos = strchr(facet, FACET_DElIMITER); + if (pos == 0) + pos = facet + strlen(facet); + elements[index] = parse_facet(odr, (const char *) facet, (pos - facet)); + if (elements[index]) { + index++; + } + else + num_elements--; + facet = pos + 1; + } + + if (!num_elements || !facet_list) { + printf("Invalid facet list: %s", arg); + return 0; + } + facet_list->elements = elements; + facet_list->num = index; + return 1; + } + return 2; +} + + static int cmd_delete(const char *arg) { if (only_z3950()) @@ -3189,6 +3332,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))) { @@ -3280,7 +3424,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); @@ -3322,7 +3466,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); @@ -4752,6 +4896,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},