aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/xml.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2007-01-19 16:58:46 +0000
committerPeter Eisentraut <peter_e@gmx.net>2007-01-19 16:58:46 +0000
commit4b48ad4fb2edf897b87d04467f8eaaaba82a258f (patch)
treeba5d42f78007a28afcb0f18adae57243c6559fb1 /src/backend/utils/adt/xml.c
parent5b4a08896bd6ee7d93f74c77f61d3518deda8fd5 (diff)
downloadpostgresql-4b48ad4fb2edf897b87d04467f8eaaaba82a258f.tar.gz
postgresql-4b48ad4fb2edf897b87d04467f8eaaaba82a258f.zip
Add support for converting binary values (i.e. bytea) into xml values,
with new GUC parameter "xmlbinary" that controls the output encoding, as per SQL/XML standard.
Diffstat (limited to 'src/backend/utils/adt/xml.c')
-rw-r--r--src/backend/utils/adt/xml.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index 03bbda97ddf..5f3fafe1e70 100644
--- a/src/backend/utils/adt/xml.c
+++ b/src/backend/utils/adt/xml.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.18 2007/01/18 13:59:11 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.19 2007/01/19 16:58:46 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -73,6 +73,8 @@ static xmlDocPtr xml_parse(text *data, bool is_document, bool preserve_whitespac
#endif /* USE_LIBXML */
+XmlBinaryType xmlbinary;
+
#define NO_XML_SUPPORT() \
ereport(ERROR, \
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \
@@ -1500,6 +1502,28 @@ map_sql_value_to_xml_value(Datum value, Oid type)
if (type == XMLOID)
return str;
+#ifdef USE_LIBXML
+ if (type == BYTEAOID)
+ {
+ xmlBufferPtr buf;
+ xmlTextWriterPtr writer;
+ char *result;
+
+ buf = xmlBufferCreate();
+ writer = xmlNewTextWriterMemory(buf, 0);
+
+ if (xmlbinary == XMLBINARY_BASE64)
+ xmlTextWriterWriteBase64(writer, VARDATA(value), 0, VARSIZE(value) - VARHDRSZ);
+ else
+ xmlTextWriterWriteBinHex(writer, VARDATA(value), 0, VARSIZE(value) - VARHDRSZ);
+
+ xmlFreeTextWriter(writer);
+ result = pstrdup((const char *) xmlBufferContent(buf));
+ xmlBufferFree(buf);
+ return result;
+ }
+#endif /* USE_LIBXML */
+
for (p = str; *p; p += pg_mblen(p))
{
switch (*p)