X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-z3950.c;h=9db63198382ac1aefe4f60bf8f4c3629925a77f0;hp=bf31a7c4e84bbe20ee294ca88b4b2981967948c6;hb=47d9d5ac3241f8db09ba19a1a5c1fdd5e140e75f;hpb=b7ac19e96f5e53975064b3dec2be6cbd2c1eccb8 diff --git a/src/zoom-z3950.c b/src/zoom-z3950.c index bf31a7c..9db6319 100644 --- a/src/zoom-z3950.c +++ b/src/zoom-z3950.c @@ -1,11 +1,14 @@ /* 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 zoom-z3950.c * \brief Implements ZOOM Z39.50 handling */ +#if HAVE_CONFIG_H +#include +#endif #include #include @@ -21,9 +24,6 @@ #include #include #include -#include -#include -#include #include #include #include @@ -324,12 +324,15 @@ static Z_APDU *create_update_package(ZOOM_package p) p->odr_out); } if (!syntax_oid) + { + ZOOM_set_error(p->connection, ZOOM_ERROR_ES_INVALID_SYNTAX, syntax_str); return 0; + } if (num_db > 0) first_db = db[0]; - switch(*version) + switch (*version) { case '1': package_oid = yaz_oid_extserv_database_update_first_version; @@ -348,6 +351,7 @@ static Z_APDU *create_update_package(ZOOM_package p) package_oid = yaz_oid_extserv_database_update; break; default: + ZOOM_set_error(p->connection, ZOOM_ERROR_ES_INVALID_VERSION, version); return 0; } @@ -362,7 +366,10 @@ static Z_APDU *create_update_package(ZOOM_package p) else if (!strcmp(action, "specialUpdate")) action_no = Z_IUOriginPartToKeep_specialUpdate; else + { + ZOOM_set_error(p->connection, ZOOM_ERROR_ES_INVALID_ACTION, action); return 0; + } apdu = create_es_package(p, package_oid); if (apdu) @@ -666,24 +673,24 @@ zoom_ret ZOOM_connection_Z3950_send_search(ZOOM_connection c) if (facet_list) { Z_OtherInformation **oi; yaz_oi_APDU(apdu, &oi); - if (facet_list) { - yaz_oi_set_facetlist(oi, c->odr_out, facet_list); - } + yaz_oi_set_facetlist(oi, c->odr_out, facet_list); } + else + yaz_log(YLOG_WARN, "Unable to parse facets: %s", facets); } assert(r); assert(r->query); /* prepare query for the search request */ - search_req->query = r->query->z_query; + search_req->query = ZOOM_query_get_Z_Query(r->query); if (!search_req->query) { ZOOM_set_error(c, ZOOM_ERROR_INVALID_QUERY, 0); return zoom_complete; } - if (r->query->z_query->which == Z_Query_type_1 || - r->query->z_query->which == Z_Query_type_101) + if (search_req->query->which == Z_Query_type_1 || + search_req->query->which == Z_Query_type_101) { const char *cp = ZOOM_options_get(r->options, "rpnCharset"); if (cp) @@ -811,6 +818,7 @@ zoom_ret ZOOM_connection_Z3950_send_scan(ZOOM_connection c) ZOOM_scanset scan; Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_scanRequest); Z_ScanRequest *req = apdu->u.scanRequest; + Z_Query *z_query; yaz_log(c->log_details, "%p send_scan", c); if (!c->tasks) @@ -818,11 +826,13 @@ zoom_ret ZOOM_connection_Z3950_send_scan(ZOOM_connection c) assert (c->tasks->which == ZOOM_TASK_SCAN); scan = c->tasks->u.scan.scan; + z_query = ZOOM_query_get_Z_Query(scan->query); + /* Z39.50 scan can only carry RPN */ - if (scan->query->z_query->which == Z_Query_type_1 || - scan->query->z_query->which == Z_Query_type_101) + if (z_query->which == Z_Query_type_1 || + z_query->which == Z_Query_type_101) { - Z_RPNQuery *rpn = scan->query->z_query->u.type_1; + Z_RPNQuery *rpn = z_query->u.type_1; const char *cp = ZOOM_options_get(scan->options, "rpnCharset"); if (cp) { @@ -981,63 +991,60 @@ static void response_diag(ZOOM_connection c, Z_DiagRec *p) } static int es_response_taskpackage_update(ZOOM_connection c, - Z_IUUpdateTaskPackage *utp) + Z_IUUpdateTaskPackage *utp) { - if (utp && utp->targetPart) - { - Z_IUTargetPart *targetPart = utp->targetPart; - switch ( *targetPart->updateStatus ) { - case Z_IUTargetPart_success: - ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "success"); - break; - case Z_IUTargetPart_partial: - ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "partial"); - break; - case Z_IUTargetPart_failure: - ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "failure"); - if (targetPart->globalDiagnostics && targetPart->num_globalDiagnostics > 0) - response_diag(c, targetPart->globalDiagnostics[0]); - break; - } - // NOTE: Individual record status, surrogate diagnostics, and supplemental diagnostics ARE NOT REPORTED. - } + if (utp && utp->targetPart) + { + Z_IUTargetPart *targetPart = utp->targetPart; + switch ( *targetPart->updateStatus ) { + case Z_IUTargetPart_success: + ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "success"); + break; + case Z_IUTargetPart_partial: + ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "partial"); + break; + case Z_IUTargetPart_failure: + ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "failure"); + if (targetPart->globalDiagnostics && targetPart->num_globalDiagnostics > 0) + response_diag(c, targetPart->globalDiagnostics[0]); + break; + } + /* NOTE: Individual record status, surrogate diagnostics, and supplemental diagnostics ARE NOT REPORTED. */ + } return 1; } static int es_response_taskpackage(ZOOM_connection c, Z_TaskPackage *taskPackage) { - // targetReference - Odr_oct *id = taskPackage->targetReference; - if (id) - ZOOM_options_setl(c->tasks->u.package->options, - "targetReference", (char*) id->buf, id->len); - - // taskStatus - switch ( *taskPackage->taskStatus ) { - case Z_TaskPackage_pending: - ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "pending"); - break; - case Z_TaskPackage_active: - ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "active"); - break; - case Z_TaskPackage_complete: - ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "complete"); - break; - case Z_TaskPackage_aborted: - ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "aborted"); - if ( taskPackage->num_packageDiagnostics && taskPackage->packageDiagnostics ) - response_diag(c, taskPackage->packageDiagnostics[0]); - break; - } - - // taskSpecificParameters - // NOTE: Only Update implemented, no others. - if ( taskPackage->taskSpecificParameters->which == Z_External_update ) { - Z_IUUpdateTaskPackage *utp = taskPackage->taskSpecificParameters->u.update->u.taskPackage; - es_response_taskpackage_update(c, utp); - } - return 1; + Odr_oct *id = taskPackage->targetReference; + if (id) + ZOOM_options_setl(c->tasks->u.package->options, + "targetReference", (char*) id->buf, id->len); + + switch ( *taskPackage->taskStatus ) { + case Z_TaskPackage_pending: + ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "pending"); + break; + case Z_TaskPackage_active: + ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "active"); + break; + case Z_TaskPackage_complete: + ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "complete"); + break; + case Z_TaskPackage_aborted: + ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "aborted"); + if ( taskPackage->num_packageDiagnostics && taskPackage->packageDiagnostics ) + response_diag(c, taskPackage->packageDiagnostics[0]); + break; + } + /* NOTE: Only Update implemented, no others. */ + if ( taskPackage->taskSpecificParameters->which == Z_External_update ) + { + Z_IUUpdateTaskPackage *utp = taskPackage->taskSpecificParameters->u.update->u.taskPackage; + es_response_taskpackage_update(c, utp); + } + return 1; } @@ -1046,18 +1053,19 @@ static int handle_Z3950_es_response(ZOOM_connection c, { if (!c->tasks || c->tasks->which != ZOOM_TASK_PACKAGE) return 0; - switch (*res->operationStatus) { - case Z_ExtendedServicesResponse_done: - ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "done"); - break; - case Z_ExtendedServicesResponse_accepted: - ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "accepted"); - break; - case Z_ExtendedServicesResponse_failure: - ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "failure"); - if (res->diagnostics && res->num_diagnostics > 0) - response_diag(c, res->diagnostics[0]); - break; + switch (*res->operationStatus) + { + case Z_ExtendedServicesResponse_done: + ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "done"); + break; + case Z_ExtendedServicesResponse_accepted: + ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "accepted"); + break; + case Z_ExtendedServicesResponse_failure: + ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "failure"); + if (res->diagnostics && res->num_diagnostics > 0) + response_diag(c, res->diagnostics[0]); + break; } if (res->taskPackage && res->taskPackage->which == Z_External_extendedService) @@ -1136,6 +1144,22 @@ static ZOOM_facet_field get_zoom_facet_field(ODR odr, Z_FacetField *facet) { return facet_field; } +/* Can be share with SOLR/SRU/SRW requests */ +void handle_facet_list(ZOOM_resultset r, Z_FacetList *fl) { + int j; + r->num_facets = fl->num; + yaz_log(YLOG_DEBUG, "Facets found: %d", fl->num); + r->facets = odr_malloc(r->odr, r->num_facets * sizeof(*r->facets)); + r->facets_names = odr_malloc(r->odr, r->num_facets * sizeof(*r->facets_names)); + for (j = 0; j < fl->num; j++) + { + r->facets[j] = get_zoom_facet_field(r->odr, fl->elements[j]); + if (!r->facets[j]) + yaz_log(YLOG_DEBUG, "Facet field missing on index %d !", j); + r->facets_names[j] = (char *) ZOOM_facet_field_name(r->facets[j]); + } +} + static void handle_facet_result(ZOOM_connection c, ZOOM_resultset r, Z_OtherInformation *o) { @@ -1147,19 +1171,7 @@ static void handle_facet_result(ZOOM_connection c, ZOOM_resultset r, Z_External *ext = o->list[i]->information.externallyDefinedInfo; if (ext->which == Z_External_userFacets) { - int j; - Z_FacetList *fl = ext->u.facetList; - r->num_facets = fl->num; - yaz_log(YLOG_DEBUG, "Facets found: %d", fl->num); - r->facets = odr_malloc(r->odr, r->num_facets * sizeof(*r->facets)); - r->facets_names = odr_malloc(r->odr, r->num_facets * sizeof(*r->facets_names)); - for (j = 0; j < fl->num; j++) - { - r->facets[j] = get_zoom_facet_field(r->odr, fl->elements[j]); - if (!r->facets[j]) - yaz_log(YLOG_DEBUG, "Facet field missing on index %d !", j); - r->facets_names[j] = (char *) ZOOM_facet_field_name(r->facets[j]); - } + handle_facet_list(r, ext->u.facetList); } } }