From 1646586271ce980427ecce700aee48bbab974839 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Thu, 2 Dec 2004 22:21:12 +0000
Subject: [PATCH] Attached is a patch that adds the function
 xml_encode_special_chars to the xml2 contrib module. It's against 8.0beta4.
 It's intended for commit.

Markus Bertheau <twanger@bluetwanger.de>
---
 contrib/xml2/pgxml.sql.in |  3 +++
 contrib/xml2/xpath.c      | 29 +++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/contrib/xml2/pgxml.sql.in b/contrib/xml2/pgxml.sql.in
index 9951d6c0461..f9d8bd0e31a 100644
--- a/contrib/xml2/pgxml.sql.in
+++ b/contrib/xml2/pgxml.sql.in
@@ -3,6 +3,9 @@
 CREATE OR REPLACE FUNCTION xml_valid(text) RETURNS bool
 	AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict);
 
+CREATE OR REPLACE FUNCTION xml_encode_special_chars(text) RETURNS text
+	AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict);
+
 CREATE OR REPLACE FUNCTION xpath_string(text,text) RETURNS text
 	AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict);
 
diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c
index ca95d41c226..d3ac76b9ef5 100644
--- a/contrib/xml2/xpath.c
+++ b/contrib/xml2/xpath.c
@@ -40,6 +40,7 @@ static xmlXPathObjectPtr pgxml_xpath(text *document, xmlChar * xpath);
 
 
 Datum		xml_valid(PG_FUNCTION_ARGS);
+Datum		xml_encode_special_chars(PG_FUNCTION_ARGS);
 Datum		xpath_nodeset(PG_FUNCTION_ARGS);
 Datum		xpath_string(PG_FUNCTION_ARGS);
 Datum		xpath_number(PG_FUNCTION_ARGS);
@@ -186,6 +187,34 @@ xml_valid(PG_FUNCTION_ARGS)
 }
 
 
+/* Encodes special characters (<, >, &, " and \r) as XML entities */
+
+PG_FUNCTION_INFO_V1(xml_encode_special_chars);
+
+Datum
+xml_encode_special_chars(PG_FUNCTION_ARGS)
+{
+	text *tin = PG_GETARG_TEXT_P(0);
+	text *tout;
+	int32 ressize;
+	xmlChar *ts, *tt;
+
+	ts = pgxml_texttoxmlchar(tin);
+
+	tt = xmlEncodeSpecialChars(NULL, ts);
+
+	pfree(ts);
+
+	ressize = strlen(tt);
+	tout = (text *) palloc(ressize + VARHDRSZ);
+	memcpy(VARDATA(tout), tt, ressize);
+	VARATT_SIZEP(tout) = ressize + VARHDRSZ;
+
+	xmlFree(tt);
+
+	PG_RETURN_TEXT_P(tout);
+}
+
 static xmlChar
 *
 pgxmlNodeSetToText(xmlNodeSetPtr nodeset,
-- 
GitLab