use xmlTree in xml_dump_other
authorTomas Mlcoch <tmlcoch@redhat.com>
Mon, 19 Mar 2012 09:05:01 +0000 (10:05 +0100)
committerTomas Mlcoch <tmlcoch@redhat.com>
Tue, 20 Mar 2012 13:16:46 +0000 (14:16 +0100)
src/xml_dump_other.c

index fcac8af..6d87837 100644 (file)
 #undef MODULE
 #define MODULE "xml_dump_other: "
 
+#define FORMAT_XML  1
 
-#define PROVIDES    0
-#define CONFLICTS   1
-#define OBSOLETES   2
-#define REQUIRES    3
+#define DATE_MAX_LEN    32
 
 
-void dump_changelog(xmlTextWriterPtr writer, Package *package)
+void dump_changelog(xmlNodePtr root, Package *package)
 {
-    int rc;
-
     if (!package->changelogs) {
         return;
     }
@@ -38,184 +34,89 @@ void dump_changelog(xmlTextWriterPtr writer, Package *package)
         // Element: Changelog
         // ************************************
 
-        // Open changelog element
-        rc = xmlTextWriterStartElement(writer, BAD_CAST "changelog");
-        if (rc < 0) {
-            g_critical(MODULE"dump_changelog: Error at xmlTextWriterWriteElement");
-            return;
-        }
+        xmlNodePtr changelog;
+
+        // Add changelog element
+        changelog = xmlNewTextChild(root, NULL, BAD_CAST "changelog", BAD_CAST ((entry->changelog) ? entry->changelog : ""));
 
         // Write param author
-        rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "author", "%s", (entry->author) ? entry->author : "");
-        if (rc < 0) {
-             g_critical(MODULE"dump_changelog: Error at xmlTextWriterWriteAttribute");
-             return;
-        }
+        xmlNewProp(changelog, BAD_CAST "author", BAD_CAST ((entry->author) ? entry->author : ""));
 
         // Write param date
-        rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "date", "%lld", (long long int) entry->date);
-        if (rc < 0) {
-             g_critical(MODULE"dump_changelog: Error at xmlTextWriterWriteFormatAttribute");
-             return;
-        }
-
-        // Write changelog text
-        rc = xmlTextWriterWriteFormatString(writer, "%s", (entry->changelog) ? entry->changelog : "");
-        if (rc < 0) {
-             g_critical(MODULE"dump_changelog: Error at xmlTextWriterWriteFormatString");
-             return;
-        }
-
-        // Close changelog element
-        rc = xmlTextWriterEndElement(writer);
-        if (rc < 0) {
-            g_critical(MODULE"dump_changelog: Error at xmlTextWriterEndElement");
-            return;
-        }
+        char date_str[DATE_MAX_LEN];
+        g_snprintf(date_str, DATE_MAX_LEN, "%lld", (long long int) entry->date);
+        xmlNewProp(changelog, BAD_CAST "date", BAD_CAST date_str);
     }
 }
 
 
-void dump_other_items(xmlTextWriterPtr writer, Package *package)
+void dump_other_items(xmlNodePtr root, Package *package)
 {
-    int rc;
-
-    rc = xmlTextWriterStartDocument(writer, NULL, NULL, NULL);
-    if (rc < 0) {
-        g_critical(MODULE"dump_other_items: Error at xmlTextWriterStartDocument");
-        return;
-    }
-
-
     /***********************************
-    Element: package
+     Element: package
     ************************************/
 
-    // Open package element
-    rc = xmlTextWriterStartElement(writer, BAD_CAST "package");
-    if (rc < 0) {
-        g_critical(MODULE"dump_other_items: Error at xmlTextWriterStartElement");
-        return;
-    }
-
     // Add pkgid attribute
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "pkgid", "%s", (package->pkgId) ? package->pkgId : "");
-    if (rc < 0) {
-         g_critical(MODULE"dump_other_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
+    xmlNewProp(root, BAD_CAST "pkgid", BAD_CAST ((package->pkgId) ? package->pkgId : ""));
 
     // Add name attribute
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "name", "%s", (package->name) ? package->name : "");
-    if (rc < 0) {
-         g_critical(MODULE"dump_other_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
+    xmlNewProp(root, BAD_CAST "name", BAD_CAST ((package->name) ? package->name : ""));
 
     // Add arch attribute
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "arch", "%s", (package->arch) ? package->arch : "");
-    if (rc < 0) {
-         g_critical(MODULE"dump_other_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
+    xmlNewProp(root, BAD_CAST "arch", BAD_CAST ((package->arch) ? package->arch : ""));
 
 
     /***********************************
-    Element: version
+     Element: version
     ************************************/
 
-    // Open version element
-    rc = xmlTextWriterStartElement(writer, BAD_CAST "version");
-    if (rc < 0) {
-        g_critical(MODULE"dump_other_items: Error at xmlTextWriterStartElement");
-        return;
-    }
+    xmlNodePtr version;
+
+    // Add version element
+    version = xmlNewChild(root, NULL, BAD_CAST "version", NULL);
 
     // Write version attribute epoch
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "epoch", "%s", (package->epoch) ? package->epoch : "0");
-    if (rc < 0) {
-        g_critical(MODULE"dump_other_items: Error at xmlTextWriterWrite(Format)Attribute");
-        return;
-    }
+    xmlNewProp(version, BAD_CAST "epoch", BAD_CAST ((package->epoch) ? package->epoch : ""));
 
     // Write version attribute ver
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "ver", "%s", (package->version) ? package->version : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_other_items: Error at xmlTextWriterWriteFormatAttribute");
-        return;
-    }
+    xmlNewProp(version, BAD_CAST "ver", BAD_CAST ((package->version) ? package->version : ""));
 
     // Write version attribute rel
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "rel", "%s", (package->release) ? package->release : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_other_items: Error at xmlTextWriterWriteFormatAttribute");
-        return;
-    }
+    xmlNewProp(version, BAD_CAST "rel", BAD_CAST ((package->release) ? package->release : ""));
 
-    // Close version element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_other_items: Error at xmlTextWriterEndElement");
-        return;
-    }
 
+    // Changelog dump
 
-    // Files dump
+    dump_changelog(root, package);
+}
 
-    dump_changelog(writer, package);
 
+char *xml_dump_other(Package *package)
+{
+    xmlNodePtr root = NULL;
+    root = xmlNewNode(NULL, BAD_CAST "package");
 
-    // Close package element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_other_items: Error at xmlTextWriterEndElement");
-        return;
-    }
 
-    // Close document (and every still opened tags)
-    rc = xmlTextWriterEndDocument(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_other_items: Error at xmlTextWriterEndDocument");
-        return;
-    }
-}
+    // Dump IT!
 
+    dump_other_items(root, package);
 
-char *xml_dump_other(Package *package)
-{
+    char *result;
     xmlBufferPtr buf = xmlBufferCreate();
     if (buf == NULL) {
         g_critical(MODULE"xml_dump_other: Error creating the xml buffer");
         return NULL;
     }
-
-    xmlTextWriterPtr writer = xmlNewTextWriterMemory(buf, 0);
-    if (writer == NULL) {
-        g_critical(MODULE"xml_dump_other: Error creating the xml writer");
-        return NULL;
-    }
-
-
-    // Dump IT!
-
-    dump_other_items(writer, package);
-
-
-    xmlFreeTextWriter(writer);
-
-
-    // Get XML from xmlBuffer without <?xml ...?> header
-
+    // Seems to be little bit faster than xmlDocDumpFormatMemory
+    xmlNodeDump(buf, NULL, root, 1, FORMAT_XML);
     assert(buf->content);
+    result = g_strdup((char *) buf->content);
+    xmlBufferFree(buf);
 
-    char *pkg_str = strstr((const char*) buf->content, "<package");
-    if (!pkg_str) {
-        pkg_str = (char*) buf->content;
-    }
 
-    char *result = g_strdup(pkg_str);
+    // Cleanup
 
-    xmlBufferFree(buf);
+    xmlFreeNode(root);
 
     return result;
 }