X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=3461431976090687bb93fbc489dbca2dce1a2da9;hb=cf3ff0df41755297543b14f007842e1dc216ec25;hp=3547e0b2d5a78c66ec59c15e6fb1bf61ca132281;hpb=fb6d99a0c7e07d9cc4a315c447deaf6564a85505;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index 3547e0b..3461431 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom-c.c,v 1.45 2005-06-25 15:46:06 adam Exp $ + * $Id: zoom-c.c,v 1.50 2005-11-03 16:49:00 mike Exp $ */ /** * \file zoom-c.c @@ -645,8 +645,8 @@ ZOOM_connection_search(ZOOM_connection c, ZOOM_query q) } ZOOM_API(void) - ZOOM_resultset_sort(ZOOM_resultset r, - const char *sort_type, const char *sort_spec) +ZOOM_resultset_sort(ZOOM_resultset r, + const char *sort_type, const char *sort_spec) { ZOOM_connection c = r->connection; ZOOM_task task; @@ -1045,7 +1045,7 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c) ZOOM_options_get(c->options, "implementationName"), odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName)); - version = odr_strdup(c->odr_out, "$Revision: 1.45 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.50 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = odr_prepend(c->odr_out, @@ -2028,6 +2028,111 @@ static void handle_present_response (ZOOM_connection c, Z_PresentResponse *pr) handle_records (c, pr->records, 1); } +static void handle_queryExpressionTerm(ZOOM_options opt, const char *name, + Z_Term *term) +{ + switch (term->which) + { + case Z_Term_general: + ZOOM_options_setl(opt, name, + term->u.general->buf, term->u.general->len); + break; + case Z_Term_characterString: + ZOOM_options_set(opt, name, term->u.characterString); + break; + case Z_Term_numeric: + ZOOM_options_set_int(opt, name, *term->u.numeric); + break; + } +} + +static void handle_queryExpression(ZOOM_options opt, const char *name, + Z_QueryExpression *exp) +{ + char opt_name[80]; + + switch (exp->which) + { + case Z_QueryExpression_term: + if (exp->u.term && exp->u.term->queryTerm) + { + sprintf(opt_name, "%s.term", name); + handle_queryExpressionTerm(opt, opt_name, exp->u.term->queryTerm); + } + break; + case Z_QueryExpression_query: + break; + } +} + +static void handle_searchResult(ZOOM_connection c, ZOOM_resultset resultset, + Z_OtherInformation *o) +{ + int i; + for (i = 0; o && i < o->num_elements; i++) + { + if (o->list[i]->which == Z_OtherInfo_externallyDefinedInfo) + { + Z_External *ext = o->list[i]->information.externallyDefinedInfo; + + if (ext->which == Z_External_searchResult1) + { + int j; + Z_SearchInfoReport *sr = ext->u.searchResult1; + + if (sr->num) + ZOOM_options_set_int( + resultset->options, "searchresult.size", sr->num); + + for (j = 0; j < sr->num; j++) + { + Z_SearchInfoReport_s *ent = + ext->u.searchResult1->elements[j]; + char pref[80]; + + sprintf(pref, "searchresult.%d", j); + + if (ent->subqueryId) + { + char opt_name[80]; + sprintf(opt_name, "%s.id", pref); + ZOOM_options_set(resultset->options, opt_name, + ent->subqueryId); + } + if (ent->subqueryExpression) + { + char opt_name[80]; + sprintf(opt_name, "%s.subquery", pref); + handle_queryExpression(resultset->options, opt_name, + ent->subqueryExpression); + } + if (ent->subqueryInterpretation) + { + char opt_name[80]; + sprintf(opt_name, "%s.interpretation", pref); + handle_queryExpression(resultset->options, opt_name, + ent->subqueryInterpretation); + } + if (ent->subqueryRecommendation) + { + char opt_name[80]; + sprintf(opt_name, "%s.recommendation", pref); + handle_queryExpression(resultset->options, opt_name, + ent->subqueryRecommendation); + } + if (ent->subqueryCount) + { + char opt_name[80]; + sprintf(opt_name, "%s.count", pref); + ZOOM_options_set_int(resultset->options, opt_name, + *ent->subqueryCount); + } + } + } + } + } +} + static void handle_search_response (ZOOM_connection c, Z_SearchResponse *sr) { ZOOM_resultset resultset; @@ -2035,12 +2140,14 @@ static void handle_search_response (ZOOM_connection c, Z_SearchResponse *sr) if (!c->tasks || c->tasks->which != ZOOM_TASK_SEARCH) return ; - + event = ZOOM_Event_create(ZOOM_EVENT_RECV_SEARCH); ZOOM_connection_put_event(c, event); resultset = c->tasks->u.search.resultset; + handle_searchResult(c, resultset, sr->additionalSearchInfo); + resultset->size = *sr->resultCount; handle_records (c, sr->records, 0); } @@ -2648,7 +2755,7 @@ static Z_APDU *create_update_package(ZOOM_package p) record_buf = "void"; syntax_oid = VAL_SUTRS; } - if (syntax_oid != VAL_NONE) + if (syntax_oid == VAL_NONE) syntax_oid = VAL_TEXT_XML; if (num_db > 0) @@ -3410,6 +3517,12 @@ ZOOM_connection_option_get (ZOOM_connection c, const char *key) return ZOOM_options_get (c->options, key); } +ZOOM_API(const char *) +ZOOM_connection_option_getl (ZOOM_connection c, const char *key, int *lenp) +{ + return ZOOM_options_getl (c->options, key, lenp); +} + ZOOM_API(void) ZOOM_connection_option_set (ZOOM_connection c, const char *key, const char *val)