From a3e65bcd3250b107397675bc65b35b5939355025 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 2 Mar 2012 11:17:28 +0100 Subject: [PATCH] record_conv: modify new API for conversion types The conversion types may be passed in new functions yaz_record_conv_configure_t and yaz_retrieval_configure_t. Removing yaz_record_conv_add_type . --- include/yaz/record_conv.h | 51 +++++++++++++++++------------- include/yaz/retrieval.h | 17 +++++++++- src/record_conv.c | 75 +++++++++++++++++---------------------------- src/retrieval.c | 17 +++++++--- 4 files changed, 85 insertions(+), 75 deletions(-) diff --git a/include/yaz/record_conv.h b/include/yaz/record_conv.h index aab75a1..d6af158 100644 --- a/include/yaz/record_conv.h +++ b/include/yaz/record_conv.h @@ -55,6 +55,22 @@ YAZ_EXPORT yaz_record_conv_t yaz_record_conv_create(void); YAZ_EXPORT void yaz_record_conv_destroy(yaz_record_conv_t p); #if YAZ_HAVE_XML2 +/** record conversion type */ +struct yaz_record_conv_type { + /** \brief pointer to next type ; NULL for last */ + struct yaz_record_conv_type *next; + + /** \brief construct and configure a type of ours */ + void * (*construct)(yaz_record_conv_t , const xmlNode *, const char *path, + WRBUF error_msg); + + /** \brief converts a record */ + int (*convert)(void *info, WRBUF record, WRBUF error_msg); + + /** \brief destroys our conversion handler */ + void (*destroy)(void *info); +}; + /** configures record conversion \param p record conversion handle \param node xmlNode pointer (root element of XML config) @@ -80,6 +96,19 @@ YAZ_EXPORT void yaz_record_conv_destroy(yaz_record_conv_t p); */ YAZ_EXPORT int yaz_record_conv_configure(yaz_record_conv_t p, const xmlNode *node); + +/** configures record conversion with user-defined conversion types + \param p record conversion handle + \param node xmlNode pointer (root element of XML config) + \param types conversion types + \retval 0 success + \retval -1 failure + +*/ +YAZ_EXPORT +int yaz_record_conv_configure_t(yaz_record_conv_t p, const xmlNode *node, + struct yaz_record_conv_type *types); + #endif /** performs record conversion on record buffer (OCTET aligned) @@ -132,28 +161,6 @@ void yaz_record_conv_set_path(yaz_record_conv_t p, const char *path); \param type info */ -#if YAZ_HAVE_XML2 -/** record conversion type */ -struct yaz_record_conv_type { - /** \brief internal; no need to set */ - struct yaz_record_conv_type *next; - - /** \brief construct and configure a type of ours */ - void * (*construct)(yaz_record_conv_t , const xmlNode *, const char *path, - WRBUF error_msg); - - /** \brief converts a record */ - int (*convert)(void *info, WRBUF record, WRBUF error_msg); - - /** \brief destroys our conversion handler */ - void (*destroy)(void *info); -}; - -YAZ_EXPORT -void yaz_record_conv_add_type(yaz_record_conv_t p, - struct yaz_record_conv_type *type); - -#endif YAZ_END_CDECL #endif diff --git a/include/yaz/retrieval.h b/include/yaz/retrieval.h index fa93e16..f71f32f 100644 --- a/include/yaz/retrieval.h +++ b/include/yaz/retrieval.h @@ -61,7 +61,7 @@ YAZ_EXPORT void yaz_retrieval_destroy(yaz_retrieval_t p); \retval 0 success \retval -1 failure - On failure, use yaz_retrieval_get_error to get error string. + On failure, call yaz_retrieval_get_error to get error string. For retrieval: \verbatim @@ -87,6 +87,21 @@ YAZ_EXPORT void yaz_retrieval_destroy(yaz_retrieval_t p); */ YAZ_EXPORT int yaz_retrieval_configure(yaz_retrieval_t p, const xmlNode *node); + + +/** configures retrieval with user-defined conversion types + \param p retrieval handle + \param node xmlNode pointer (root element of XML config) + \param types record conversion types + \retval 0 success + \retval -1 failure + + On failure, use yaz_retrieval_get_error to get error string. +*/ +YAZ_EXPORT +int yaz_retrieval_configure_t(yaz_retrieval_t p, const xmlNode *node, + struct yaz_record_conv_type *types); + #endif /** performs retrieval request based on schema and format diff --git a/src/record_conv.c b/src/record_conv.c index 3caf06c..5ef8913 100644 --- a/src/record_conv.c +++ b/src/record_conv.c @@ -49,9 +49,6 @@ struct yaz_record_conv_struct { /** \brief path for opening files */ char *path; - - /** \brief handlers */ - struct yaz_record_conv_type *types; }; struct marc_info { @@ -86,33 +83,14 @@ static void yaz_record_conv_reset(yaz_record_conv_t p) p->rules_p = &p->rules; } -void yaz_record_conv_add_type(yaz_record_conv_t p, - struct yaz_record_conv_type *type) -{ - struct yaz_record_conv_type **tp = &p->types; - while (*tp) - tp = &(*tp)->next; - *tp = xmalloc(sizeof(*type)); - memcpy(*tp, type, sizeof(*type)); - (*tp)->next = 0; -} - void yaz_record_conv_destroy(yaz_record_conv_t p) { if (p) { - struct yaz_record_conv_type *t = p->types; - yaz_record_conv_reset(p); nmem_destroy(p->nmem); wrbuf_destroy(p->wr_error); - while (t) - { - struct yaz_record_conv_type *t_next = t->next; - xfree(t); - t = t_next; - } xfree(p->path); xfree(p); } @@ -479,8 +457,27 @@ static void destroy_marc(void *info) nmem_destroy(mi->nmem); } -int yaz_record_conv_configure(yaz_record_conv_t p, const xmlNode *ptr) +int yaz_record_conv_configure_t(yaz_record_conv_t p, const xmlNode *ptr, + struct yaz_record_conv_type *types) { + struct yaz_record_conv_type bt[2]; + + /* register marc */ + bt[0].construct = construct_marc; + bt[0].convert = convert_marc; + bt[0].destroy = destroy_marc; + +#if YAZ_HAVE_XSLT + /* register xslt */ + bt[0].next = &bt[1]; + bt[1].next = types; + bt[1].construct = construct_xslt; + bt[1].convert = convert_xslt; + bt[1].destroy = destroy_xslt; +#else + bt[0].next = types; +#endif + yaz_record_conv_reset(p); /* parsing element children */ @@ -491,7 +488,7 @@ int yaz_record_conv_configure(yaz_record_conv_t p, const xmlNode *ptr) void *info = 0; if (ptr->type != XML_ELEMENT_NODE) continue; - for (t = p->types; t; t = t->next) + for (t = &bt[0]; t; t = t->next) { wrbuf_rewind(p->wr_error); info = t->construct(p, ptr, p->path, p->wr_error); @@ -511,13 +508,19 @@ int yaz_record_conv_configure(yaz_record_conv_t p, const xmlNode *ptr) r = (struct yaz_record_conv_rule *) nmem_malloc(p->nmem, sizeof(*r)); r->next = 0; r->info = info; - r->type = t; + r->type = nmem_malloc(p->nmem, sizeof(*t)); + memcpy(r->type, t, sizeof(*t)); *p->rules_p = r; p->rules_p = &r->next; } return 0; } +int yaz_record_conv_configure(yaz_record_conv_t p, const xmlNode *ptr) +{ + return yaz_record_conv_configure_t(p, ptr, 0); +} + static int yaz_record_conv_record_rule(yaz_record_conv_t p, struct yaz_record_conv_rule *r, const char *input_record_buf, @@ -602,31 +605,9 @@ yaz_record_conv_t yaz_record_conv_create() p->wr_error = wrbuf_alloc(); p->rules = 0; p->path = 0; - p->types = 0; - #if YAZ_HAVE_EXSLT exsltRegisterAll(); #endif - { /* register marc */ - struct yaz_record_conv_type t; - - t.construct = construct_marc; - t.convert = convert_marc; - t.destroy = destroy_marc; - - yaz_record_conv_add_type(p, &t); - } -#if YAZ_HAVE_XSLT - { /* register xslt */ - struct yaz_record_conv_type t; - - t.construct = construct_xslt; - t.convert = convert_xslt; - t.destroy = destroy_xslt; - - yaz_record_conv_add_type(p, &t); - } -#endif return p; } diff --git a/src/retrieval.c b/src/retrieval.c index 1515664..26d28fd 100644 --- a/src/retrieval.c +++ b/src/retrieval.c @@ -108,7 +108,8 @@ void yaz_retrieval_reset(yaz_retrieval_t p) } /** \brief parse retrieval XML config */ -static int conf_retrieval(yaz_retrieval_t p, const xmlNode *ptr) +static int conf_retrieval(yaz_retrieval_t p, const xmlNode *ptr, + struct yaz_record_conv_type *types) { struct _xmlAttr *attr; struct yaz_retrieval_elem *el = (struct yaz_retrieval_elem *) @@ -229,10 +230,10 @@ static int conf_retrieval(yaz_retrieval_t p, const xmlNode *ptr) /* parsing internal of record conv */ 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)) + if (yaz_record_conv_configure_t(el->record_conv, ptr, types)) { wrbuf_printf(p->wr_error, "%s", yaz_record_conv_get_error(el->record_conv)); @@ -247,7 +248,8 @@ static int conf_retrieval(yaz_retrieval_t p, const xmlNode *ptr) return 0; } -int yaz_retrieval_configure(yaz_retrieval_t p, const xmlNode *ptr) +int yaz_retrieval_configure_t(yaz_retrieval_t p, const xmlNode *ptr, + struct yaz_record_conv_type *types) { yaz_retrieval_reset(p); @@ -260,7 +262,7 @@ int yaz_retrieval_configure(yaz_retrieval_t p, const xmlNode *ptr) continue; if (!strcmp((const char *) ptr->name, "retrieval")) { - if (conf_retrieval(p, ptr)) + if (conf_retrieval(p, ptr, types)) return -1; } else @@ -280,6 +282,11 @@ int yaz_retrieval_configure(yaz_retrieval_t p, const xmlNode *ptr) return 0; } +int yaz_retrieval_configure(yaz_retrieval_t p, const xmlNode *ptr) +{ + return yaz_retrieval_configure_t(p, ptr, 0); +} + int yaz_retrieval_request(yaz_retrieval_t p, const char *schema, Odr_oid *syntax, const char **match_schema, Odr_oid **match_syntax, -- 1.7.10.4