record_conv: modify new API for conversion types
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 2 Mar 2012 10:17:28 +0000 (11:17 +0100)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 2 Mar 2012 10:17:28 +0000 (11:17 +0100)
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
include/yaz/retrieval.h
src/record_conv.c
src/retrieval.c

index aab75a1..d6af158 100644 (file)
@@ -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
index fa93e16..f71f32f 100644 (file)
@@ -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
index 3caf06c..5ef8913 100644 (file)
@@ -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;
 }
 
index 1515664..26d28fd 100644 (file)
@@ -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,