render_render: Change spec for base64 record embedding
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 19 Jun 2012 10:33:42 +0000 (12:33 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 19 Jun 2012 10:33:42 +0000 (12:33 +0200)
Syntax is now base64=x-path .. part of record_render. For example,
to produce embedded Turbomarc that comes in marc-8 encoding (usmarc
typically), you could use: txml; charset=marc-8; base64=myxpath .

include/yaz/record_render.h
src/record_render.c
test/test_embed_record.c

index 66eacab..7bbc48b 100644 (file)
@@ -51,7 +51,7 @@ YAZ_BEGIN_CDECL
 
     txml; charset=marc-8
     xml; charset=utf-8
 
     txml; charset=marc-8
     xml; charset=utf-8
-    xml; charset=utf-8; base64(/rec/my/text(), txml; charset=marc-8)
+    txml; charset=marc-8; base64=/rec/my/text()
 */
 YAZ_EXPORT
 const char *yaz_record_render(Z_NamePlusRecord *npr, const char *schema,
 */
 YAZ_EXPORT
 const char *yaz_record_render(Z_NamePlusRecord *npr, const char *schema,
index ba5311e..983667a 100644 (file)
@@ -252,16 +252,15 @@ static int replace_node(NMEM nmem, xmlNode *ptr,
     if (res)
     {
         xmlDoc *doc = xmlParseMemory(res, strlen(res));
     if (res)
     {
         xmlDoc *doc = xmlParseMemory(res, strlen(res));
-        xmlNode *nptr;
         if (doc)
         {
         if (doc)
         {
-            nptr = xmlCopyNode(xmlDocGetRootElement(doc), 1);
+            xmlNode *nptr = xmlCopyNode(xmlDocGetRootElement(doc), 1);
             xmlReplaceNode(ptr, nptr);
             xmlFreeDoc(doc);
         }
         else
         {
             xmlReplaceNode(ptr, nptr);
             xmlFreeDoc(doc);
         }
         else
         {
-            nptr = xmlNewText(BAD_CAST res);
+            xmlNode *nptr = xmlNewText(BAD_CAST res);
             xmlReplaceNode(ptr, nptr);
         }
         ret = 0;
             xmlReplaceNode(ptr, nptr);
         }
         ret = 0;
@@ -342,7 +341,6 @@ const char *yaz_record_render(Z_NamePlusRecord *npr, const char *schema,
     const char *ret = 0;
     NMEM nmem = 0;
     char *base64_xpath = 0;
     const char *ret = 0;
     NMEM nmem = 0;
     char *base64_xpath = 0;
-    char *base64_type_spec = 0;
     size_t i;
     char type[40];
     char charset[40];
     size_t i;
     char type[40];
     char charset[40];
@@ -386,34 +384,17 @@ const char *yaz_record_render(Z_NamePlusRecord *npr, const char *schema,
             }
             format[j] = '\0';
         } 
             }
             format[j] = '\0';
         } 
-        else if (!strncmp(cp + i, "base64", 6))
+        else if (!strncmp(cp + i, "base64=", 7))
         {
         {
-            i = i + 6;
+            size_t i0;
+            i = i + 7;
 
 
-            while (cp[i] == ' ')
-                i++;
-            if (cp[i] == '(')
-            {
-                size_t i0;
-                nmem = nmem_create();
+            i0 = i;
+            while (cp[i] && cp[i] != ';')
                 i++;
                 i++;
-                while (cp[i] == ' ')
-                    i++;
-                i0 = i;
-                while (cp[i] != ',' && cp[i])
-                    i++;
-                base64_xpath = nmem_strdupn(nmem, cp + i0, i - i0);
-                if (cp[i])
-                    i++;
-                while (cp[i] == ' ')
-                    i++;
-                i0 = i;
-                while (cp[i] != ')' && cp[i])
-                    i++;
-                base64_type_spec = nmem_strdupn(nmem, cp + i0, i - i0);
-                if (cp[i])
-                    i++;
-            }
+
+            nmem = nmem_create();
+            base64_xpath = nmem_strdupn(nmem, cp + i0, i - i0);
         } 
     }
     if (!strcmp(type, "database"))
         } 
     }
     if (!strcmp(type, "database"))
@@ -476,8 +457,17 @@ const char *yaz_record_render(Z_NamePlusRecord *npr, const char *schema,
     }
 
     if (base64_xpath)
     }
 
     if (base64_xpath)
-        ret = base64_render(nmem, wrbuf,
-                            ret, len, base64_xpath, base64_type_spec);
+    {
+        char *type_spec = nmem_malloc(nmem,
+                                      strlen(format) + strlen(charset) + 11);
+        strcpy(type_spec, type);
+        if (*charset)
+        {
+            strcat(type_spec, "; charset=");
+            strcat(type_spec, charset);
+        }
+        ret = base64_render(nmem, wrbuf, ret, len, base64_xpath, type_spec);
+    }
     nmem_destroy(nmem);
     return ret;
 }
     nmem_destroy(nmem);
     return ret;
 }
index aac2987..e5e6a02 100644 (file)
@@ -145,7 +145,7 @@ int main(int argc, char **argv)
     YAZ_CHECK(test_render("xml", 0, "<my/>", "<my/>"));
 
     YAZ_CHECK(test_render(
     YAZ_CHECK(test_render("xml", 0, "<my/>", "<my/>"));
 
     YAZ_CHECK(test_render(
-                  "xml; base64(/my/text(),xml)", 0,
+                  "xml; base64=/my/text()", 0,
                   "<my>"
                   "MDAxMzhuYW0gIDIyMDAwNzM4YSA0NTAwMDAxMDAxMzAwMDAwMDAzMDAwNDAwMDEzMTAwMDAxNzAw"
                   "MDE3MjQ1MDAzMDAwMDM0HiAgIDExMjI0NDY2IB5ETEMeMTAfYUphY2sgQ29sbGlucx4xMB9hSG93"
                   "<my>"
                   "MDAxMzhuYW0gIDIyMDAwNzM4YSA0NTAwMDAxMDAxMzAwMDAwMDAzMDAwNDAwMDEzMTAwMDAxNzAw"
                   "MDE3MjQ1MDAzMDAwMDM0HiAgIDExMjI0NDY2IB5ETEMeMTAfYUphY2sgQ29sbGlucx4xMB9hSG93"
@@ -165,7 +165,7 @@ int main(int argc, char **argv)
                   "</record></my>\n"));
 
     YAZ_CHECK(test_render(
                   "</record></my>\n"));
 
     YAZ_CHECK(test_render(
-                  "xml; charset=utf-8; base64(/my/text(),xml)", 0,
+                  "xml; charset=utf-8; base64=/my/text()", 0,
                   "<my>"
                   "MDAxMzhuYW0gIDIyMDAwNzM4YSA0NTAwMDAxMDAxMzAwMDAwMDAzMDAwNDAwMDEzMTAwMDAxNzAw"
                   "MDE3MjQ1MDAzMDAwMDM0HiAgIDExMjI0NDY2IB5ETEMeMTAfYUphY2sgQ29sbGlucx4xMB9hSG93"
                   "<my>"
                   "MDAxMzhuYW0gIDIyMDAwNzM4YSA0NTAwMDAxMDAxMzAwMDAwMDAzMDAwNDAwMDEzMTAwMDAxNzAw"
                   "MDE3MjQ1MDAzMDAwMDM0HiAgIDExMjI0NDY2IB5ETEMeMTAfYUphY2sgQ29sbGlucx4xMB9hSG93"
@@ -185,7 +185,7 @@ int main(int argc, char **argv)
                   "</record></my>\n"));
 
     YAZ_CHECK(test_render(
                   "</record></my>\n"));
 
     YAZ_CHECK(test_render(
-                  "xml; base64(/my/text(),xml);charset=utf-8", 0,
+                  "xml; base64=/my/text();charset=utf-8", 0,
                   "<my>"
                   "MDAxMzhuYW0gIDIyMDAwNzM4YSA0NTAwMDAxMDAxMzAwMDAwMDAzMDAwNDAwMDEzMTAwMDAxNzAw"
                   "MDE3MjQ1MDAzMDAwMDM0HiAgIDExMjI0NDY2IB5ETEMeMTAfYUphY2sgQ29sbGlucx4xMB9hSG93"
                   "<my>"
                   "MDAxMzhuYW0gIDIyMDAwNzM4YSA0NTAwMDAxMDAxMzAwMDAwMDAzMDAwNDAwMDEzMTAwMDAxNzAw"
                   "MDE3MjQ1MDAzMDAwMDM0HiAgIDExMjI0NDY2IB5ETEMeMTAfYUphY2sgQ29sbGlucx4xMB9hSG93"
@@ -205,7 +205,7 @@ int main(int argc, char **argv)
                   "</record></my>\n"));
 
     YAZ_CHECK(test_render(
                   "</record></my>\n"));
 
     YAZ_CHECK(test_render(
-                  "xml; base64(/my/text(),txml;charset=utf-8)", 0,
+                  "txml;base64=/my/text();charset=utf-8", 0,
                   "<my>"
                   "MDAxMzhuYW0gIDIyMDAwNzM4YSA0NTAwMDAxMDAxMzAwMDAwMDAzMDAwNDAwMDEzMTAwMDAxNzAw"
                   "MDE3MjQ1MDAzMDAwMDM0HiAgIDExMjI0NDY2IB5ETEMeMTAfYUphY2sgQ29sbGlucx4xMB9hSG93"
                   "<my>"
                   "MDAxMzhuYW0gIDIyMDAwNzM4YSA0NTAwMDAxMDAxMzAwMDAwMDAzMDAwNDAwMDEzMTAwMDAxNzAw"
                   "MDE3MjQ1MDAzMDAwMDM0HiAgIDExMjI0NDY2IB5ETEMeMTAfYUphY2sgQ29sbGlucx4xMB9hSG93"