X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fretrieval.c;h=d9026423874e38989e54ac93383fc6100d661fe4;hp=3ca6d8d59841e2c2193b72a808d173833b3b283a;hb=5008c98db7e9ca6291347b6ecddb946aff92d0fe;hpb=27481680fb1a69456e789e5bc8e1ec914337287d diff --git a/src/retrieval.c b/src/retrieval.c index 3ca6d8d..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.4 2006-05-07 17:45:41 adam Exp $ + * $Id: retrieval.c,v 1.10 2006-05-09 13:39:47 adam Exp $ */ /** * \file retrieval.c @@ -21,12 +21,10 @@ #include #include -#if HAVE_XSLT +#if HAVE_XML2 #include #include #include -#include -#include /** \brief The internal structure for yaz_retrieval_t */ struct yaz_retrieval_struct { @@ -53,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; @@ -117,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; @@ -139,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) @@ -241,20 +253,28 @@ int yaz_retrieval_request(yaz_retrieval_t p, int **backend_syntax) { struct yaz_retrieval_elem *el = p->list; - int syntax_matches = 0; int schema_matches = 0; + + wrbuf_rewind(p->wr_error); + if (!el) + return 0; for(; el; el = el->next) { 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; + 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; @@ -268,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) @@ -278,13 +301,17 @@ int yaz_retrieval_request(yaz_retrieval_t p, return 0; } } - if (syntax_matches && !schema_matches) - return 1; - if (!syntax_matches && schema_matches) + if (!syntax_matches && syntax) + { + char buf[OID_STR_MAX]; + wrbuf_printf(p->wr_error, "%s", oid_to_dotstring(syntax, buf)); return 2; - if (!syntax_matches && !schema_matches) - return 3; - return 4; + } + if (schema) + wrbuf_printf(p->wr_error, "%s", schema); + if (!schema_matches) + return 1; + return 3; } const char *yaz_retrieval_get_error(yaz_retrieval_t p)