xmlconcat.patch

text/x-patch

Filename: xmlconcat.patch
Type: text/x-patch
Part: 0
Message: Re: xmlconcat (was 9.0 release notes done)

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
src/backend/utils/adt/xml.c 44 0
Index: src/backend/utils/adt/xml.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/xml.c,v
retrieving revision 1.97
diff -c -r1.97 xml.c
*** src/backend/utils/adt/xml.c	3 Mar 2010 17:29:45 -0000	1.97
--- src/backend/utils/adt/xml.c	24 Mar 2010 22:05:19 -0000
***************
*** 418,424 ****
--- 418,466 ----
  #endif
  }
  
+ #ifdef USE_LIBXML
+ static inline void
+ strip_dtd(char ** xmlstr)
+ {
+ 
+ 	xmlDocPtr	doc;
+ 	xmlChar *xmlbuff;
+ 	int buffersize;
+ 	bool        dtd_found = false;
+ 	xmlNodePtr child;
+ 	char * skip_xmldecl;
+ 
+ 	if (strstr(*xmlstr,"<!DOCTYPE") == NULL)
+ 		return ;
+ 
+ 	doc = xml_parse(cstring_to_text(*xmlstr), XMLOPTION_DOCUMENT, true, GetDatabaseEncoding());
+ 
+ 	for (child = doc->children; child != NULL; child = child->next)
+ 	{
+ 		if (child->type == XML_DOCUMENT_TYPE_NODE || 
+ 			child->type == XML_DTD_NODE)
+ 		{
+ 			xmlUnlinkNode(child);
+ 			xmlFreeNode(child);
+ 			dtd_found = true;
+ 		}
+ 	}
+ 	if (dtd_found)
+ 	{
+ 		pfree(*xmlstr);
+ 		xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 0);
+ 		if (strncmp((char *)xmlbuff,"<?xml",5) == 0)
+ 			skip_xmldecl = strstr((char *)xmlbuff,"?>\n") + 3;
+ 		else
+ 			skip_xmldecl = (char *) xmlbuff;
+ 		*xmlstr = pstrdup(skip_xmldecl);
+ 		xmlFree(xmlbuff);
+ 		
+ 	}
+ 	xmlFreeDoc(doc);
  
+ }
+ #endif
  
  /*
   * TODO: xmlconcat needs to merge the notations and unparsed entities
***************
*** 460,465 ****
--- 502,509 ----
  		else if (xmlStrcmp(version, global_version) != 0)
  			global_version_no_value = true;
  
+ 		strip_dtd(&str);
+ 
  		appendStringInfoString(&buf, str + len);
  		pfree(str);
  	}