From 5008c98db7e9ca6291347b6ecddb946aff92d0fe Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 9 May 2006 13:39:46 +0000 Subject: [PATCH] Fixes for retrieval handling in SRU mode.. The "virtual" record syntax was not seen as XML , and, hence, there could be strange matches. Changed configuration format: schema and backendschema renamed to name and backendname respectively. --- etc/yazgfs.xml | 18 +++++++-------- include/yaz/retrieval.h | 6 ++--- src/retrieval.c | 56 ++++++++++++++++++++++++++++++++--------------- src/seshigh.c | 15 ++++++++----- test/tst_retrieval.c | 33 ++++++++++++++++++++++++++-- 5 files changed, 91 insertions(+), 37 deletions(-) diff --git a/etc/yazgfs.xml b/etc/yazgfs.xml index 5db6cfd..ad435c7 100644 --- a/etc/yazgfs.xml +++ b/etc/yazgfs.xml @@ -1,4 +1,4 @@ - + @@ -11,26 +11,26 @@ xsl/default.xsl - - - + + + backendsyntax="usmarc" backendname="F"> - + - + backendsyntax="usmarc" backendname="F"> diff --git a/include/yaz/retrieval.h b/include/yaz/retrieval.h index 46ab103..a0426e7 100644 --- a/include/yaz/retrieval.h +++ b/include/yaz/retrieval.h @@ -23,7 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. * - * $Id: retrieval.h,v 1.4 2006-05-08 19:48:26 adam Exp $ + * $Id: retrieval.h,v 1.5 2006-05-09 13:39:46 adam Exp $ */ /** * \file retrieval.h @@ -65,9 +65,9 @@ YAZ_EXPORT void yaz_retrieval_destroy(yaz_retrieval_t p); For retrieval: \verbatim - MARCXML diff --git a/src/retrieval.c b/src/retrieval.c index 525987a..d902642 100644 --- a/src/retrieval.c +++ b/src/retrieval.c @@ -2,7 +2,7 @@ * Copyright (C) 2005-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: retrieval.c,v 1.9 2006-05-09 11:35:28 adam Exp $ + * $Id: retrieval.c,v 1.10 2006-05-09 13:39:47 adam Exp $ */ /** * \file retrieval.c @@ -51,12 +51,12 @@ struct yaz_retrieval_struct { struct yaz_retrieval_elem { /** \brief schema identifier */ const char *identifier; - /** \brief schema short-hand (such sa "dc") */ - const char *schema; + /** \brief schema name , short-hand such sa "dc" */ + const char *name; /** \brief record syntax */ int *syntax; - /** \brief backend schema */ - const char *backend_schema; + /** \brief backend name */ + const char *backend_name; /** \brief backend syntax */ int *backend_syntax; @@ -115,8 +115,8 @@ static int conf_retrieval(yaz_retrieval_t p, const xmlNode *ptr) el->syntax = 0; el->identifier = 0; - el->schema = 0; - el->backend_schema = 0; + el->name = 0; + el->backend_name = 0; el->backend_syntax = 0; el->next = 0; @@ -137,16 +137,30 @@ static int conf_retrieval(yaz_retrieval_t p, const xmlNode *ptr) } } else if (!xmlStrcmp(attr->name, BAD_CAST "identifier") && - attr->children && attr->children->type == XML_TEXT_NODE) + attr->children && attr->children->type == XML_TEXT_NODE) el->identifier = nmem_strdup(p->nmem, (const char *) attr->children->content); else if (!xmlStrcmp(attr->name, BAD_CAST "schema") && attr->children && attr->children->type == XML_TEXT_NODE) - el->schema = + { + wrbuf_printf(p->wr_error, "Bad attribute 'schema'. " + "Use 'name' instead"); + return -1; + } + else if (!xmlStrcmp(attr->name, BAD_CAST "name") && + attr->children && attr->children->type == XML_TEXT_NODE) + el->name = nmem_strdup(p->nmem, (const char *) attr->children->content); else if (!xmlStrcmp(attr->name, BAD_CAST "backendschema") && attr->children && attr->children->type == XML_TEXT_NODE) - el->backend_schema = + { + wrbuf_printf(p->wr_error, "Bad attribute 'backendschema'. " + "Use 'backendname' instead"); + return -1; + } + else if (!xmlStrcmp(attr->name, BAD_CAST "backendname") && + attr->children && attr->children->type == XML_TEXT_NODE) + el->backend_name = nmem_strdup(p->nmem, (const char *) attr->children->content); else if (!xmlStrcmp(attr->name, BAD_CAST "backendsyntax") && attr->children && attr->children->type == XML_TEXT_NODE) @@ -250,14 +264,17 @@ int yaz_retrieval_request(yaz_retrieval_t p, int schema_ok = 0; int syntax_ok = 0; - if (schema && el->schema && !strcmp(schema, el->schema)) - schema_ok = 1; - if (schema && el->identifier && !strcmp(schema, el->identifier)) - schema_ok = 1; if (!schema) schema_ok = 1; - if (schema && !el->schema) - schema_ok = 1; + else + { + if (el->name && !strcmp(schema, el->name)) + schema_ok = 1; + if (el->identifier && !strcmp(schema, el->identifier)) + schema_ok = 1; + if (!el->name && !el->identifier) + schema_ok = 1; + } if (syntax && el->syntax && !oid_oidcmp(syntax, el->syntax)) syntax_ok = 1; @@ -271,9 +288,12 @@ int yaz_retrieval_request(yaz_retrieval_t p, if (syntax_ok && schema_ok) { *match_syntax = el->syntax; - *match_schema = el->schema; + if (el->identifier) + *match_schema = el->identifier; + else + *match_schema = 0; if (backend_schema) - *backend_schema = el->backend_schema; + *backend_schema = el->backend_name; if (backend_syntax) *backend_syntax = el->backend_syntax; if (rc) diff --git a/src/seshigh.c b/src/seshigh.c index f6dedb5..3cc1b38 100644 --- a/src/seshigh.c +++ b/src/seshigh.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: seshigh.c,v 1.79 2006-05-08 19:48:26 adam Exp $ + * $Id: seshigh.c,v 1.80 2006-05-09 13:39:47 adam Exp $ */ /** * \file seshigh.c @@ -582,6 +582,10 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) const char *match_schema = 0; int *match_syntax = 0; + if (!assoc->server) + { + yaz_log(YLOG_LOG, "no assoc->server"); + } if (assoc->server) { int r; @@ -591,6 +595,8 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) const char *backend_schema = 0; Odr_oid *backend_syntax = 0; + yaz_log(YLOG_LOG, "found assoc->server"); + r = yaz_retrieval_request(assoc->server->retrieval, input_schema, input_syntax_raw, @@ -671,6 +677,7 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) rr->output_format = oi ? oi->value : VAL_NONE; rr->output_format_raw = match_syntax; } + yaz_log(YLOG_LOG, "match_scheam=%s", match_schema); if (match_schema) rr->schema = odr_strdup(rr->stream, match_schema); return 0; @@ -691,7 +698,7 @@ static int srw_bend_fetch(association *assoc, int pos, rr.referenceId = 0; rr.request_format = VAL_TEXT_XML; rr.request_format_raw = yaz_oidval_to_z3950oid(assoc->decode, - CLASS_TRANSYN, + CLASS_RECSYN, VAL_TEXT_XML); rr.comp = (Z_RecordComposition *) odr_malloc(assoc->decode, sizeof(*rr.comp)); @@ -732,8 +739,6 @@ static int srw_bend_fetch(association *assoc, int pos, rr.len = 0; rr.record = 0; rr.last_in_set = 0; - rr.output_format = VAL_TEXT_XML; - rr.output_format_raw = 0; rr.errcode = 0; rr.errstring = 0; rr.surrogate_flag = 0; @@ -2235,7 +2240,7 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) assoc->init->implementation_name, odr_prepend(assoc->encode, "GFS", resp->implementationName)); - version = odr_strdup(assoc->encode, "$Revision: 1.79 $"); + version = odr_strdup(assoc->encode, "$Revision: 1.80 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; resp->implementationVersion = odr_prepend(assoc->encode, diff --git a/test/tst_retrieval.c b/test/tst_retrieval.c index db10872..32e9782 100644 --- a/test/tst_retrieval.c +++ b/test/tst_retrieval.c @@ -2,7 +2,7 @@ * Copyright (C) 2005-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: tst_retrieval.c,v 1.4 2006-05-07 17:45:41 adam Exp $ + * $Id: tst_retrieval.c,v 1.5 2006-05-09 13:39:47 adam Exp $ * */ #include @@ -168,7 +168,7 @@ static void tst_configure() YAZ_CHECK(conv_configure_test("" "" "" @@ -178,6 +178,35 @@ static void tst_configure() YAZ_CHECK(conv_configure_test("" "" + "" + "" + "", + 0, 0)); + + YAZ_CHECK(conv_configure_test("" + "" + "" + "" + "", + "Bad attribute 'backendschema'." + " Use 'backendname' instead", + 0)); + + + YAZ_CHECK(conv_configure_test("" + "" "" -- 1.7.10.4