From 0de95154d8512ee46d6b706fe019f8d1ffc18827 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 5 May 2006 18:37:08 +0000 Subject: [PATCH] Implement yaz_retrieval_configure. --- include/yaz/retrieval.h | 10 ++-- src/retrieval.c | 150 ++++++++++++++++++++++++++++++++++++++++++++--- test/tst_record_conv.c | 16 +++-- test/tst_retrieval.c | 54 ++++++++++++----- 4 files changed, 197 insertions(+), 33 deletions(-) diff --git a/include/yaz/retrieval.h b/include/yaz/retrieval.h index 8ef3a98..dc4a1fe 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.1 2006-05-04 20:00:45 adam Exp $ + * $Id: retrieval.h,v 1.2 2006-05-05 18:37:08 adam Exp $ */ /** * \file retrieval.h @@ -65,11 +65,11 @@ YAZ_EXPORT void yaz_retrieval_destroy(yaz_retrieval_t p); For retrieval: \verbatim - MARCXML - @@ -87,14 +87,14 @@ int yaz_retrieval_configure(yaz_retrieval_t p, const void *node); /** performs retrieval request based on schema and format \param p retrieval handle \param schema record schema / element set name (Z39.50) - \param format record format (syntax) + \param syntax record syntax (format) \param rc record conversion reference (holds conversion upon success) \retval 0 success \retval -1 falure */ YAZ_EXPORT int yaz_retrieval_request(yaz_retrieval_t p, const char *schema, - const char *format, yaz_record_conv_t *rc); + const char *syntax, yaz_record_conv_t *rc); /** returns error string (for last error) \param p record conversion handle diff --git a/src/retrieval.c b/src/retrieval.c index 696e824..cc0b09b 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.1 2006-05-04 20:00:45 adam Exp $ + * $Id: retrieval.c,v 1.2 2006-05-05 18:37:08 adam Exp $ */ /** * \file retrieval.c @@ -35,16 +35,46 @@ struct yaz_retrieval_struct { /** \brief string buffer for error messages */ WRBUF wr_error; + /** \brief path for opening files */ + char *path; + + /** \brief retrieval list */ + struct yaz_retrieval_elem *list; + + /** \brief last pointer in retrieval list */ + struct yaz_retrieval_elem **list_p; +}; + +/** \brief information per 'retrieval' construct */ +struct yaz_retrieval_elem { + /** \brief schema identifier */ + const char *identifier; + /** \brief schema short-hand (such sa "dc") */ + const char *schema; + /** \brief record syntax */ + const char *syntax; + /** \brief backend schema */ + const char *backend_schema; + /** \brief backend syntax */ + const char *backend_syntax; + /** \brief record conversion */ yaz_record_conv_t record_conv; + + /** \breif next element in list */ + struct yaz_retrieval_elem *next; }; +static void yaz_retrieval_reset(yaz_retrieval_t p); + yaz_retrieval_t yaz_retrieval_create() { yaz_retrieval_t p = xmalloc(sizeof(*p)); p->nmem = nmem_create(); p->wr_error = wrbuf_alloc(); - p->record_conv = yaz_record_conv_create(); + p->list = 0; + p->path = 0; + yaz_retrieval_reset(p); return p; } @@ -52,22 +82,123 @@ void yaz_retrieval_destroy(yaz_retrieval_t p) { if (p) { + yaz_retrieval_reset(p); nmem_destroy(p->nmem); wrbuf_free(p->wr_error, 1); - yaz_record_conv_destroy(p->record_conv); + xfree(p->path); xfree(p); } } -int yaz_retrieval_configure(yaz_retrieval_t p, const void *node) +void yaz_retrieval_reset(yaz_retrieval_t p) { + struct yaz_retrieval_elem *el = p->list; + for(; el; el = el->next) + yaz_record_conv_destroy(el->record_conv); + wrbuf_rewind(p->wr_error); - wrbuf_printf(p->wr_error, "yaz_retrieval_request: not implemented"); - return -1; + nmem_reset(p->nmem); + + p->list = 0; + p->list_p = &p->list; +} + +/** \brief parse retrieval XML config */ +static int conf_retrieval(yaz_retrieval_t p, const xmlNode *ptr) +{ + + struct _xmlAttr *attr; + struct yaz_retrieval_elem *el = nmem_malloc(p->nmem, sizeof(*el)); + + el->syntax = 0; + el->identifier = 0; + el->schema = 0; + el->backend_schema = 0; + el->backend_syntax = 0; + + el->next = 0; + + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!xmlStrcmp(attr->name, BAD_CAST "syntax") && + attr->children && attr->children->type == XML_TEXT_NODE) + el->syntax = + nmem_strdup(p->nmem, (const char *) attr->children->content); + else if (!xmlStrcmp(attr->name, BAD_CAST "identifier") && + 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 = + 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 = + 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) + el->backend_syntax = + nmem_strdup(p->nmem, (const char *) attr->children->content); + else + { + wrbuf_printf(p->wr_error, "Bad attribute '%s'.", attr->name); + return -1; + } + } + el->record_conv = yaz_record_conv_create(); + + yaz_record_conv_set_path(el->record_conv, p->path); + + if (yaz_record_conv_configure(el->record_conv, ptr->children)) + { + wrbuf_printf(p->wr_error, "%s", + yaz_record_conv_get_error(el->record_conv)); + yaz_record_conv_destroy(el->record_conv); + return -1; + } + + *p->list_p = el; + p->list_p = &el->next; + return 0; +} + +int yaz_retrieval_configure(yaz_retrieval_t p, const void *ptr_v) +{ + const xmlNode *ptr = ptr_v; + + yaz_retrieval_reset(p); + + if (ptr && ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "retrievalinfo")) + { + for (ptr = ptr->children; ptr; ptr = ptr->next) + { + if (ptr->type != XML_ELEMENT_NODE) + continue; + if (!strcmp((const char *) ptr->name, "retrieval")) + { + if (conf_retrieval(p, ptr)) + return -1; + } + else + { + wrbuf_printf(p->wr_error, "Bad element '%s'." + " Expected 'retrieval'", ptr->name); + return -1; + } + } + } + else + { + wrbuf_printf(p->wr_error, "Missing 'retrievalinfo' element"); + return -1; + } + return 0; } int yaz_retrieval_request(yaz_retrieval_t p, const char *schema, - const char *format, yaz_record_conv_t *rc) + const char *syntax, yaz_record_conv_t *rc) { wrbuf_rewind(p->wr_error); wrbuf_printf(p->wr_error, "yaz_retrieval_request: not implemented"); @@ -81,7 +212,10 @@ const char *yaz_retrieval_get_error(yaz_retrieval_t p) void yaz_retrieval_set_path(yaz_retrieval_t p, const char *path) { - yaz_record_conv_set_path(p->record_conv, path); + xfree(p->path); + p->path = 0; + if (path) + p->path = xstrdup(path); } #endif diff --git a/test/tst_record_conv.c b/test/tst_record_conv.c index fcfb692..c6d9ac0 100644 --- a/test/tst_record_conv.c +++ b/test/tst_record_conv.c @@ -2,7 +2,7 @@ * Copyright (C) 2005-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: tst_record_conv.c,v 1.4 2006-05-04 20:00:45 adam Exp $ + * $Id: tst_record_conv.c,v 1.5 2006-05-05 18:37:08 adam Exp $ * */ #include @@ -91,13 +91,14 @@ int conv_configure_test(const char *xmlstring, const char *expect_error, } else { - if (pt) - *pt = p; - else - yaz_record_conv_destroy(p); ret = 1; } } + if (pt) + *pt = p; + else + yaz_record_conv_destroy(p); + wrbuf_free(w, 1); return ret; } @@ -218,6 +219,7 @@ static void tst_convert() "", 0, &p)); YAZ_CHECK(conv_convert_test(p, marcxml_rec, iso2709_rec)); + yaz_record_conv_destroy(p); YAZ_CHECK(conv_configure_test("" "", 0, &p)); YAZ_CHECK(conv_convert_test(p, iso2709_rec, marcxml_rec)); + yaz_record_conv_destroy(p); YAZ_CHECK(conv_configure_test("" @@ -249,7 +252,7 @@ static void tst_convert() "", 0, &p)); YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec)); - + yaz_record_conv_destroy(p); YAZ_CHECK(conv_configure_test("" @@ -268,6 +271,7 @@ static void tst_convert() "", 0, &p)); YAZ_CHECK(conv_convert_test(p, marcxml_rec, marcxml_rec)); + yaz_record_conv_destroy(p); } #endif diff --git a/test/tst_retrieval.c b/test/tst_retrieval.c index 7482535..aecb773 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.1 2006-05-04 20:00:45 adam Exp $ + * $Id: tst_retrieval.c,v 1.2 2006-05-05 18:37:08 adam Exp $ * */ #include @@ -104,22 +104,36 @@ int conv_configure_test(const char *xmlstring, const char *expect_error, static void tst_configure() { - YAZ_CHECK(conv_configure_test("", "Missing 'convert' element", 0)); - YAZ_CHECK(conv_configure_test("", 0, 0)); - YAZ_CHECK(conv_configure_test("", + YAZ_CHECK(conv_configure_test("", + "Missing 'retrievalinfo' element", 0)); + + YAZ_CHECK(conv_configure_test("", 0, 0)); + + YAZ_CHECK(conv_configure_test("", "Bad element 'bad'." - "Expected marc, xslt, ..", 0)); - YAZ_CHECK(conv_configure_test("" + " Expected 'retrieval'", 0)); + + YAZ_CHECK(conv_configure_test("" + "" + "" "" "" - "", - "Attribute 'inputformat' required", 0)); - YAZ_CHECK(conv_configure_test("" + "" + "" + "", + 0, 0)); + + YAZ_CHECK(conv_configure_test("" + "" + "" "" "" - "", + "" + "" + "" + "" + "" + "" + "" + "" + "", 0, 0)); -#endif } #endif -- 1.7.10.4