full switch to xmltree
authorTomas Mlcoch <tmlcoch@redhat.com>
Tue, 20 Mar 2012 13:17:48 +0000 (14:17 +0100)
committerTomas Mlcoch <tmlcoch@redhat.com>
Tue, 20 Mar 2012 13:17:48 +0000 (14:17 +0100)
src/xml_dump.c
src/xml_dump.h
src/xml_dump_filelists.c
src/xml_dump_primary.c

index 49454d9..e832008 100644 (file)
@@ -10,9 +10,9 @@
 #define MODULE "xml_dump: "
 
 
-void dump_files(xmlTextWriterPtr writer, Package *package, int primary)
+void dump_files(xmlNodePtr node, Package *package, int primary)
 {
-    if (!package->files) {
+    if (!node || !package->files) {
         return;
     }
 
@@ -51,40 +51,13 @@ void dump_files(xmlTextWriterPtr writer, Package *package, int primary)
         // Element: file
         // ************************************
 
-        int rc;
-        rc = xmlTextWriterStartElement(writer, BAD_CAST "file");
-        if (rc < 0) {
-            g_critical(MODULE"dump_files: Error at xmlTextWriterWriteElement");
-            g_free(fullname);
-            return;
-        }
+        xmlNodePtr file_node;
+        file_node = xmlNewTextChild(node, NULL, BAD_CAST "file", BAD_CAST fullname);
+        g_free(fullname);
 
         // Write type (skip type if type value is empty of "file")
         if (entry->type && entry->type[0] != '\0' && strcmp(entry->type, "file")) {
-            //rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "type", "%s", entry->type);
-            rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "type", BAD_CAST entry->type);
-            if (rc < 0) {
-                 g_critical(MODULE"dump_files: Error at xmlTextWriterWriteFormatAttribute");
-                 g_free(fullname);
-                 return;
-            }
-
-        }
-
-        // Write text (file path)
-        //rc = xmlTextWriterWriteFormatString(writer, "%s", fullname);
-        rc = xmlTextWriterWriteString(writer, BAD_CAST fullname);
-        g_free(fullname);
-        if (rc < 0) {
-            g_critical(MODULE"dump_files: Error at xmlTextWriterWriteFormatString\n");
-            return;
-        }
-
-        // Close file element
-        rc = xmlTextWriterEndElement(writer);
-        if (rc < 0) {
-            g_critical(MODULE"dump_files: Error at xmlTextWriterEndElement\n");
-            return;
+            xmlNewProp(file_node, BAD_CAST "type", BAD_CAST entry->type);
         }
     }
 }
index b993b7f..a8be7a6 100644 (file)
@@ -20,7 +20,7 @@ struct XmlStruct{
 };
 
 
-void dump_files(xmlTextWriterPtr, Package *, int);
+void dump_files(xmlNodePtr, Package *, int);
 
 char *xml_dump_primary(Package *);
 char *xml_dump_filelists(Package *);
index 3bb0a26..65b44b6 100644 (file)
 #undef MODULE
 #define MODULE "xml_dump_filelists: "
 
-#define PROVIDES    0
-#define CONFLICTS   1
-#define OBSOLETES   2
-#define REQUIRES    3
+#define FORMAT_XML  1
 
 
-void dump_filelists_items(xmlTextWriterPtr writer, Package *package)
+void dump_filelists_items(xmlNodePtr root, Package *package)
 {
-    int rc;
-
-    rc = xmlTextWriterStartDocument(writer, NULL, NULL, NULL);
-    if (rc < 0) {
-        g_critical(MODULE"dump_filelists_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_filelists_items: Error at xmlTextWriterStartElement");
-        return;
-    }
-
-    // Write param pkgid
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "pkgid", "%s", (package->pkgId) ? package->pkgId : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_filelists_items: Error at xmlTextWriterWriteFormatAttribute");
-        return;
-    }
+    // Add pkgid attribute
+    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_filelists_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_filelists_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_filelists_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_filelists_items: Error at xmlTextWriterWriteFormatAttribute");
-        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_filelists_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_filelists_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_filelists_items: Error at xmlTextWriterEndElement");
-        return;
-    }
 
     // Files dump
-    dump_files(writer, package, 0);
-
-    // Close package element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_filelists_items: Error at xmlTextWriterEndElement");
-        return;
-    }
 
-    // Close document (and every still opened tags)
-    rc = xmlTextWriterEndDocument(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_filelists_items: Error at xmlTextWriterEndDocument");
-        return;
-    }
+    dump_files(root, package, 0);
 }
 
 
 char *xml_dump_filelists(Package *package)
 {
-    xmlBufferPtr buf = xmlBufferCreate();
-    if (buf == NULL) {
-        g_critical(MODULE"xml_dump_filelists: Error creating the xml buffer");
-        return NULL;
-    }
+    xmlNodePtr root = NULL;
+    root = xmlNewNode(NULL, BAD_CAST "package");
 
-    xmlTextWriterPtr writer = xmlNewTextWriterMemory(buf, 0);
-    if (writer == NULL) {
-        g_critical(MODULE"xml_dump_filelists: Error creating the xml writer");
-        return NULL;
-    }
 
     // Dump IT!
 
-    dump_filelists_items(writer, package);
-
-    xmlFreeTextWriter(writer);
-
-
-    // Get XML from xmlBuffer without <?xml ...?> header
+    dump_filelists_items(root, package);
 
+    char *result;
+    xmlBufferPtr buf = xmlBufferCreate();
+    if (buf == NULL) {
+        g_critical(MODULE"xml_dump_filelists: Error creating the xml buffer");
+        return NULL;
+    }
+    // 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;
 }
index fc337e4..e7d6ca2 100644 (file)
 #define OBSOLETES   2
 #define REQUIRES    3
 
+#define FORMAT_XML  1
 
-void dump_pco(xmlTextWriterPtr writer, Package *package, int pcotype)
+#define DATE_STR_MAX_LEN    32
+#define SIZE_STR_MAX_LEN    32
+
+
+void dump_pco(xmlNodePtr root, Package *package, int pcotype)
 {
-    int rc;
     const char *elem_name = NULL;
     GSList *files = NULL;
 
@@ -53,11 +57,9 @@ void dump_pco(xmlTextWriterPtr writer, Package *package, int pcotype)
      PCOR Element: provides, oboletes, conflicts, requires
     ************************************/
 
-    rc = xmlTextWriterStartElement(writer, BAD_CAST elem_name);
-    if (rc < 0) {
-        g_critical(MODULE"dump_pco: Error at xmlTextWriterWriteElement");
-        return;
-    }
+    xmlNodePtr pcor_node;
+
+    pcor_node = xmlNewChild(root, NULL, BAD_CAST elem_name, NULL);
 
     GSList *element = NULL;
     for(element = files; element; element=element->next) {
@@ -75,521 +77,278 @@ void dump_pco(xmlTextWriterPtr writer, Package *package, int pcotype)
         Element: entry
         ************************************/
 
-        rc = xmlTextWriterStartElement(writer, BAD_CAST "rpm:entry");
-        if (rc < 0) {
-            g_critical(MODULE"dump_pco: Error at xmlTextWriterWriteElement");
-            return;
-        }
+        xmlNodePtr entry_node;
 
-        rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "name", "%s", entry->name);
-        if (rc < 0) {
-             g_critical(MODULE"dump_pco: Error at xmlTextWriterWriteFormatAttribute");
-             return;
-        }
+        entry_node = xmlNewChild(pcor_node, NULL, BAD_CAST "rpm:entry", NULL);
+        xmlNewProp(entry_node, BAD_CAST "name", BAD_CAST entry->name);
 
         if (entry->flags && entry->flags[0] != '\0') {
-            rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "flags", "%s", entry->flags);
-            if (rc < 0) {
-                 g_critical(MODULE"dump_pco: Error at xmlTextWriterWriteFormatAttribute");
-                 return;
-            }
+            xmlNewProp(entry_node, BAD_CAST "flags", BAD_CAST entry->flags);
 
             if (entry->epoch && entry->epoch[0] != '\0') {
-                rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "epoch", "%s", entry->epoch);
-                if (rc < 0) {
-                     g_critical(MODULE"dump_pco: Error at xmlTextWriterWriteFormatAttribute");
-                     return;
-                }
+                xmlNewProp(entry_node, BAD_CAST "epoch", BAD_CAST entry->epoch);
             }
 
             if (entry->version && entry->version[0] != '\0') {
-                rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "ver", "%s", entry->version);
-                if (rc < 0) {
-                     g_critical(MODULE"dump_pco: Error at xmlTextWriterWriteFormatAttribute");
-                     return;
-                }
+                xmlNewProp(entry_node, BAD_CAST "ver", BAD_CAST entry->version);
             }
 
             if (entry->release && entry->release[0] != '\0') {
-                rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "rel", "%s", entry->release);
-                if (rc < 0) {
-                     g_critical(MODULE"dump_pco: Error at xmlTextWriterWriteFormatAttribute");
-                     return;
-                }
+                xmlNewProp(entry_node, BAD_CAST "rel", BAD_CAST entry->release);
             }
         }
 
         if (pcotype == REQUIRES) {
             // Add pre attribute
-            rc = 0;
-            if (entry->pre) {
-                rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "pre", BAD_CAST "1");
-            } else {
-                rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "pre", BAD_CAST "0");
-            }
-            if (rc < 0) {
-                 g_critical(MODULE"dump_pco: Error at xmlTextWriterWriteAttribute");
-                 return;
-            }
-        }
-
-        // Close entry element
-        rc = xmlTextWriterEndElement(writer);
-        if (rc < 0) {
-            g_critical(MODULE"dump_pco: Error at xmlTextWriterEndElement");
-            return;
+            xmlNewProp(entry_node, BAD_CAST "pre", BAD_CAST ((entry->pre) ? "1" : "0"));
         }
     }
-
-    // Close PCOR element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_pco: Error at xmlTextWriterEndElement");
-        return;
-    }
 }
 
 
 
-void dump_base_items(xmlTextWriterPtr writer, Package *package)
+void dump_base_items(xmlNodePtr root, Package *package)
 {
-    int rc;
-
-    rc = xmlTextWriterStartDocument(writer, NULL, NULL, NULL);
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterStartDocument");
-        return;
-    }
-
-
     /***********************************
-    Element: package
+     Element: package
     ************************************/
 
-    // Start element package
-    rc = xmlTextWriterStartElement(writer, BAD_CAST "package");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterStartElement");
-        return;
-    }
-
     // Add an attribute with type to package
-    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "type", BAD_CAST "rpm");
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteAttribute");
-         return;
-    }
+    xmlNewProp(root, BAD_CAST "type", BAD_CAST "rpm");
 
 
     /***********************************
-    Element: name
+     Element: name
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "name", "%s", (package->name) ? package->name : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(root, NULL,  BAD_CAST "name", BAD_CAST ((package->name) ? package->name : ""));
 
 
     /***********************************
-    Element: arch
+     Element: arch
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "arch", "%s", (package->arch) ? package->arch : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(root, NULL,  BAD_CAST "arch", BAD_CAST ((package->arch) ? package->arch : ""));
 
 
     /***********************************
-    Element: version
+     Element: version
     ************************************/
 
-    rc = xmlTextWriterStartElement(writer, BAD_CAST "version");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_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_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         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_base_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_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
-
-    // Close version element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterEndElement");
-        return;
-    }
+    xmlNewProp(version, BAD_CAST "rel", BAD_CAST ((package->release) ? package->release : ""));
 
 
     /***********************************
-    Element: checksum
+     Element: checksum
     ************************************/
 
-    rc = xmlTextWriterStartElement(writer, BAD_CAST "checksum");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterStartElement");
-        return;
-    }
+    xmlNodePtr checksum;
+
+    checksum = xmlNewTextChild(root, NULL,  BAD_CAST "checksum", BAD_CAST ((package->pkgId) ? package->pkgId : ""));
 
     // Write checksum attribute checksum_type
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "type", "%s", (package->checksum_type) ? package->checksum_type : "");
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
+    xmlNewProp(checksum, BAD_CAST "type", BAD_CAST ((package->checksum_type) ? package->checksum_type : ""));
 
     // Write checksum attribute pkgid
-    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "pkgid", BAD_CAST "YES");
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteAttribute");
-         return;
-    }
-
-    // Write element string
-    rc = xmlTextWriterWriteFormatString(writer, "%s", (package->pkgId) ? package->pkgId : "");
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatString");
-         return;
-    }
-
-    // Close checksum element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterEndElement");
-        return;
-    }
+    xmlNewProp(checksum, BAD_CAST "pkgid", BAD_CAST "YES");
 
 
     /***********************************
-    Element: summary
+     Element: summary
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "summary", "%s", (package->summary) ? package->summary : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(root, NULL,  BAD_CAST "summary", BAD_CAST ((package->summary) ? package->summary : ""));
 
 
     /***********************************
     Element: description
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "description", "%s", (package->description) ? package->description : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(root, NULL,  BAD_CAST "description", BAD_CAST ((package->description) ? package->description : ""));
 
 
     /***********************************
-    Element: packager
+     Element: packager
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "packager", "%s", (package->rpm_packager) ? package->rpm_packager : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(root, NULL,  BAD_CAST "packager", BAD_CAST ((package->rpm_packager) ? package->rpm_packager : ""));
 
 
     /***********************************
-    Element: url
+     Element: url
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "url", "%s", (package->url) ? package->url : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(root, NULL,  BAD_CAST "url", BAD_CAST ((package->url) ? package->url : ""));
 
 
     /***********************************
-    Element: time
+     Element: time
     ************************************/
 
-    rc = xmlTextWriterStartElement(writer, BAD_CAST "time");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterStartElement");
-        return;
-    }
+    xmlNodePtr time;
+    char date_str[DATE_STR_MAX_LEN];
+
+    time = xmlNewChild(root, NULL, BAD_CAST "time", NULL);
 
     // Write time attribute file
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "file", "%lld", (long long int) package->time_file);
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
+    g_snprintf(date_str, DATE_STR_MAX_LEN, "%lld", (long long int) package->time_file);
+    xmlNewProp(time, BAD_CAST "file", BAD_CAST date_str);
 
     // Write time attribute build
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "build", "%lld", (long long int) package->time_build);
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
-
-    // Close time element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterEndElement");
-        return;
-    }
+    g_snprintf(date_str, DATE_STR_MAX_LEN, "%lld", (long long int) package->time_build);
+    xmlNewProp(time, BAD_CAST "build", BAD_CAST date_str);
 
 
     /***********************************
-    Element: size
+     Element: size
     ************************************/
 
-    rc = xmlTextWriterStartElement(writer, BAD_CAST "size");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterStartElement");
-        return;
-    }
+    xmlNodePtr size;
+    char size_str[SIZE_STR_MAX_LEN];
+
+    size = xmlNewChild(root, NULL, BAD_CAST "size", NULL);
 
     // Write size attribute package
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "package", "%lld", (long long int)  package->size_package);
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
+    g_snprintf(size_str, SIZE_STR_MAX_LEN, "%lld", (long long int) package->size_package);
+    xmlNewProp(size, BAD_CAST "package", BAD_CAST size_str);
 
     // Write size attribute installed
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "installed", "%lld", (long long int) package->size_installed);
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
+    g_snprintf(size_str, SIZE_STR_MAX_LEN, "%lld", (long long int) package->size_installed);
+    xmlNewProp(size, BAD_CAST "installed", BAD_CAST size_str);
 
     // Write size attribute archive
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "archive", "%lld", (long long int) package->size_archive);
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
-
-    // Close size element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterEndElement");
-        return;
-    }
+    g_snprintf(size_str, SIZE_STR_MAX_LEN, "%lld", (long long int) package->size_archive);
+    xmlNewProp(size, BAD_CAST "archive", BAD_CAST size_str);
 
 
     /***********************************
-    Element: location
+     Element: location
     ************************************/
 
-    rc = xmlTextWriterStartElement(writer, BAD_CAST "location");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterStartElement");
-        return;
-    }
+    xmlNodePtr location;
+
+    location = xmlNewChild(root, NULL, BAD_CAST "location", NULL);
 
     // Write location attribute href
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "href", "%s", (package->location_href) ? package->location_href : "");
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
+    xmlNewProp(location, BAD_CAST "href", BAD_CAST ((package->location_href) ? package->location_href : ""));
 
     // Write location attribute base
     if (package->location_base && package->location_base[0] != '\0') {
-        rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "xml:base", "%s", package->location_base);
-        if (rc < 0) {
-             g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatAttribute");
-             return;
-        }
-    }
-
-    /* Close location element */
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterEndElement");
-        return;
+        xmlNewProp(location, BAD_CAST "xml:base", BAD_CAST package->location_base);
     }
 
 
     /***********************************
-    Element: format
+     Element: format
     ************************************/
 
-    rc = xmlTextWriterStartElement(writer, BAD_CAST "format");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterStartElement");
-        return;
-    }
+    xmlNodePtr format;
+
+    format = xmlNewChild(root, NULL, BAD_CAST "format", NULL);
 
 
     /***********************************
-    Element: license
+     Element: license
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "rpm:license", "%s", (package->rpm_license) ? package->rpm_license : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(format, NULL,  BAD_CAST "rpm:license", BAD_CAST ((package->rpm_license) ? package->rpm_license : ""));
 
 
     /***********************************
-    Element: vendor
+     Element: vendor
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "rpm:vendor", "%s", (package->rpm_vendor) ? package->rpm_vendor : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(format, NULL,  BAD_CAST "rpm:vendor", BAD_CAST ((package->rpm_vendor) ? package->rpm_vendor : ""));
 
 
     /***********************************
-    Element: group
+     Element: group
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "rpm:group", "%s", (package->rpm_group) ? package->rpm_group : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(format, NULL,  BAD_CAST "rpm:group", BAD_CAST ((package->rpm_group) ? package->rpm_group : ""));
 
 
     /***********************************
-    Element: buildhost
+     Element: buildhost
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "rpm:buildhost", "%s", (package->rpm_buildhost) ? package->rpm_buildhost : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(format, NULL,  BAD_CAST "rpm:buildhost", BAD_CAST ((package->rpm_buildhost) ? package->rpm_buildhost : ""));
 
 
     /***********************************
-    Element: sourcerpm
+     Element: sourcerpm
     ************************************/
 
-    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "rpm:sourcerpm", "%s", (package->rpm_sourcerpm) ? package->rpm_sourcerpm : "");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatElement");
-        return;
-    }
+    xmlNewTextChild(format, NULL,  BAD_CAST "rpm:sourcerpm", BAD_CAST ((package->rpm_sourcerpm) ? package->rpm_sourcerpm : ""));
 
 
     /***********************************
-    Element: header-range
+     Element: header-range
     ************************************/
 
-    rc = xmlTextWriterStartElement(writer, BAD_CAST "rpm:header-range");
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterStartElement");
-        return;
-    }
+    xmlNodePtr header_range;
+
+    header_range = xmlNewChild(format, NULL, BAD_CAST "rpm:header-range", NULL);
 
     // Write header-range attribute hdrstart
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "start", "%lld", (long long int) package->rpm_header_start);
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
+    g_snprintf(size_str, SIZE_STR_MAX_LEN, "%lld", (long long int) package->rpm_header_start);
+    xmlNewProp(header_range, BAD_CAST "start", BAD_CAST size_str);
 
     // Write header-range attribute hdrend
-    rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "end", "%lld", (long long int)  package->rpm_header_end);
-    if (rc < 0) {
-         g_critical(MODULE"dump_base_items: Error at xmlTextWriterWriteFormatAttribute");
-         return;
-    }
-
-    // Close header-range element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterEndElement");
-        return;
-    }
+    g_snprintf(size_str, SIZE_STR_MAX_LEN, "%lld", (long long int) package->rpm_header_end);
+    xmlNewProp(header_range, BAD_CAST "end", BAD_CAST size_str);
 
 
     // Files dump
 
-    dump_pco(writer,   package, PROVIDES);
-    dump_pco(writer,   package, REQUIRES);
-    dump_pco(writer,   package, CONFLICTS);
-    dump_pco(writer,   package, OBSOLETES);
-    dump_files(writer, package, 1);
+    dump_pco(format,   package, PROVIDES);
+    dump_pco(format,   package, REQUIRES);
+    dump_pco(format,   package, CONFLICTS);
+    dump_pco(format,   package, OBSOLETES);
+    dump_files(format, package, 1);
+}
 
 
-    // Close format element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterEndElement");
-        return;
-    }
 
-    // Close package element
-    rc = xmlTextWriterEndElement(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterEndElement");
-        return;
-    }
+char *xml_dump_primary(Package *package)
+{
+    xmlNodePtr root = NULL;
+    root = xmlNewNode(NULL, BAD_CAST "package");
 
-    // Close document (and every still opened tags)
-    rc = xmlTextWriterEndDocument(writer);
-    if (rc < 0) {
-        g_critical(MODULE"dump_base_items: Error at xmlTextWriterEndDocument");
-        return;
-    }
-}
 
+    // Dump IT!
 
+    dump_base_items(root, package);
 
-char *xml_dump_primary(Package *package)
-{
+    char *result;
     xmlBufferPtr buf = xmlBufferCreate();
     if (buf == NULL) {
-        g_critical(MODULE"xml_dump_primary: Error creating the xml buffer");
+        g_critical(MODULE"xml_dump_other: Error creating the xml buffer");
         return NULL;
     }
+    // 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);
 
-    xmlTextWriterPtr writer = xmlNewTextWriterMemory(buf, 0);
-    if (writer == NULL) {
-        g_critical(MODULE"xml_dump_primary: Error creating the xml writer");
-        return NULL;
-    }
-
-    dump_base_items(writer, package);
-
-    xmlFreeTextWriter(writer);
-
-
-    // Get XML from xmlBuffer without <?xml ...?> header
 
-    char *pkg_str = strstr((const char*) buf->content, "<package");
-    if (!pkg_str) {
-        pkg_str = (char*) buf->content;
-    }
+    // Cleanup
 
-    char *result = g_strdup(pkg_str);
-
-    xmlBufferFree(buf);
+    xmlFreeNode(root);
 
     return result;
+
 }