/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2010 Index Data
+ * Copyright (C) 1995-2012 Index Data
* See the file LICENSE for details.
*/
/**
* \file zoom-z3950.c
* \brief Implements ZOOM Z39.50 handling
*/
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <assert.h>
#include <string.h>
#include <yaz/diagbib1.h>
#include <yaz/charneg.h>
#include <yaz/ill.h>
-#include <yaz/srw.h>
-#include <yaz/cql.h>
-#include <yaz/ccl.h>
#include <yaz/query-charset.h>
#include <yaz/copy_types.h>
#include <yaz/snprintf.h>
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;
package_oid = yaz_oid_extserv_database_update;
break;
default:
+ ZOOM_set_error(p->connection, ZOOM_ERROR_ES_INVALID_VERSION, version);
return 0;
}
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)
}
if (c->odr_print)
z_APDU(c->odr_print, &a, 0, 0);
+ if (c->odr_save)
+ z_APDU(c->odr_save, &a, 0, 0);
yaz_log(c->log_details, "%p encoding_APDU encoding OK", c);
return 0;
}
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)
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)
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)
{
}
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;
}
{
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)
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)
{
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);
}
}
}
yaz_log(c->log_api, "%p handle_Z3950_apdu Close PDU", c);
if (!ZOOM_test_reconnect(c))
{
- ZOOM_set_error(c, ZOOM_ERROR_CONNECTION_LOST, c->host_port);
+ ZOOM_set_dset_error(c, ZOOM_ERROR_CONNECTION_LOST, "ZOOM", c->host_port, apdu->u.close->diagnosticInformation);
ZOOM_connection_close(c);
}
break;