summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2008-05-04 16:42:41 +0000
committerTom Lane2008-05-04 16:42:41 +0000
commit3bd17cbf5bfbaa866fffb3ce2158c0b9a6e87fab (patch)
treea3d9f8d5a7bfec898bca5fa62107aa74d3dac67f
parent9f9008e4a9cf7aab7e5814a69af5a3e02544ce11 (diff)
Use new cstring/text conversion functions in some additional places.
These changes assume that the varchar and xml data types are represented the same as text. (I did not, however, accept the portions of the proposed patch that wanted to assume bytea is the same as text --- tgl.) Brendan Jurd
-rw-r--r--contrib/pgcrypto/pgp-pgsql.c7
-rw-r--r--contrib/xml2/xpath.c21
-rw-r--r--contrib/xml2/xslt_proc.c17
-rw-r--r--src/backend/utils/adt/varchar.c8
-rw-r--r--src/backend/utils/adt/xml.c64
5 files changed, 21 insertions, 96 deletions
diff --git a/contrib/pgcrypto/pgp-pgsql.c b/contrib/pgcrypto/pgp-pgsql.c
index acfd151e55..8f5da31115 100644
--- a/contrib/pgcrypto/pgp-pgsql.c
+++ b/contrib/pgcrypto/pgp-pgsql.c
@@ -34,6 +34,7 @@
#include "fmgr.h"
#include "parser/scansup.h"
#include "mb/pg_wchar.h"
+#include "utils/builtins.h"
#include "mbuf.h"
#include "px.h"
@@ -140,7 +141,6 @@ static text *
convert_charset(text *src, int cset_from, int cset_to)
{
int src_len = VARSIZE(src) - VARHDRSZ;
- int dst_len;
unsigned char *dst;
unsigned char *csrc = (unsigned char *) VARDATA(src);
text *res;
@@ -149,10 +149,7 @@ convert_charset(text *src, int cset_from, int cset_to)
if (dst == csrc)
return src;
- dst_len = strlen((char *) dst);
- res = palloc(dst_len + VARHDRSZ);
- memcpy(VARDATA(res), dst, dst_len);
- SET_VARSIZE(res, dst_len + VARHDRSZ);
+ res = cstring_to_text((char *) dst);
pfree(dst);
return res;
}
diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c
index 601733ac87..98865bac7a 100644
--- a/contrib/xml2/xpath.c
+++ b/contrib/xml2/xpath.c
@@ -194,7 +194,6 @@ xml_encode_special_chars(PG_FUNCTION_ARGS)
{
text *tin = PG_GETARG_TEXT_P(0);
text *tout;
- int32 ressize;
xmlChar *ts,
*tt;
@@ -204,10 +203,7 @@ xml_encode_special_chars(PG_FUNCTION_ARGS)
pfree(ts);
- ressize = strlen((char *) tt);
- tout = (text *) palloc(ressize + VARHDRSZ);
- memcpy(VARDATA(tout), tt, ressize);
- SET_VARSIZE(tout, ressize + VARHDRSZ);
+ tout = cstring_to_text((char *) tt);
xmlFree(tt);
@@ -306,14 +302,7 @@ pgxmlNodeSetToText(xmlNodeSetPtr nodeset,
xmlChar *
pgxml_texttoxmlchar(text *textstring)
{
- xmlChar *res;
- int32 txsize;
-
- txsize = VARSIZE(textstring) - VARHDRSZ;
- res = (xmlChar *) palloc(txsize + 1);
- memcpy((char *) res, VARDATA(textstring), txsize);
- res[txsize] = '\0';
- return res;
+ return (xmlChar *) text_to_cstring(textstring);
}
/* Public visible XPath functions */
@@ -577,7 +566,6 @@ pgxml_result_to_text(xmlXPathObjectPtr res,
xmlChar * plainsep)
{
xmlChar *xpresstr;
- int32 ressize;
text *xpres;
if (res == NULL)
@@ -604,10 +592,7 @@ pgxml_result_to_text(xmlXPathObjectPtr res,
/* Now convert this result back to text */
- ressize = strlen((char *) xpresstr);
- xpres = (text *) palloc(ressize + VARHDRSZ);
- memcpy(VARDATA(xpres), xpresstr, ressize);
- SET_VARSIZE(xpres, ressize + VARHDRSZ);
+ xpres = cstring_to_text((char *) xpresstr);
/* Free various storage */
xmlCleanupParser();
diff --git a/contrib/xml2/xslt_proc.c b/contrib/xml2/xslt_proc.c
index f15fabcb3c..f498192426 100644
--- a/contrib/xml2/xslt_proc.c
+++ b/contrib/xml2/xslt_proc.c
@@ -39,8 +39,9 @@ PG_FUNCTION_INFO_V1(xslt_process);
Datum
xslt_process(PG_FUNCTION_ARGS)
{
-
-
+ text *doct = PG_GETARG_TEXT_P(0);
+ text *ssheet = PG_GETARG_TEXT_P(1);
+ text *paramstr;
const char *params[MAXPARAMS + 1]; /* +1 for the terminator */
xsltStylesheetPtr stylesheet = NULL;
xmlDocPtr doctree;
@@ -50,12 +51,6 @@ xslt_process(PG_FUNCTION_ARGS)
int resstat;
int reslen;
- text *doct = PG_GETARG_TEXT_P(0);
- text *ssheet = PG_GETARG_TEXT_P(1);
- text *paramstr;
- text *tres;
-
-
if (fcinfo->nargs == 3)
{
paramstr = PG_GETARG_TEXT_P(2);
@@ -124,11 +119,7 @@ xslt_process(PG_FUNCTION_ARGS)
if (resstat < 0)
PG_RETURN_NULL();
- tres = palloc(reslen + VARHDRSZ);
- memcpy(VARDATA(tres), resstr, reslen);
- SET_VARSIZE(tres, reslen + VARHDRSZ);
-
- PG_RETURN_TEXT_P(tres);
+ PG_RETURN_TEXT_P(cstring_to_text_with_len(resstr, reslen));
}
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c
index 680f031609..95b26834b4 100644
--- a/src/backend/utils/adt/varchar.c
+++ b/src/backend/utils/adt/varchar.c
@@ -566,7 +566,6 @@ varchar(PG_FUNCTION_ARGS)
VarChar *source = PG_GETARG_VARCHAR_PP(0);
int32 typmod = PG_GETARG_INT32(1);
bool isExplicit = PG_GETARG_BOOL(2);
- VarChar *result;
int32 len,
maxlen;
size_t maxmblen;
@@ -596,11 +595,8 @@ varchar(PG_FUNCTION_ARGS)
maxlen)));
}
- result = palloc(maxmblen + VARHDRSZ);
- SET_VARSIZE(result, maxmblen + VARHDRSZ);
- memcpy(VARDATA(result), s_data, maxmblen);
-
- PG_RETURN_VARCHAR_P(result);
+ PG_RETURN_VARCHAR_P((VarChar *) cstring_to_text_with_len(s_data,
+ maxmblen));
}
Datum
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index a3f588bd79..9ad3ff81fd 100644
--- a/src/backend/utils/adt/xml.c
+++ b/src/backend/utils/adt/xml.c
@@ -319,13 +319,7 @@ xml_recv(PG_FUNCTION_ARGS)
if (newstr != str)
{
pfree(result);
-
- nbytes = strlen(newstr);
-
- result = palloc(nbytes + VARHDRSZ);
- SET_VARSIZE(result, nbytes + VARHDRSZ);
- memcpy(VARDATA(result), newstr, nbytes);
-
+ result = (xmltype *) cstring_to_text(newstr);
pfree(newstr);
}
@@ -369,30 +363,14 @@ appendStringInfoText(StringInfo str, const text *t)
static xmltype *
stringinfo_to_xmltype(StringInfo buf)
{
- int32 len;
- xmltype *result;
-
- len = buf->len + VARHDRSZ;
- result = palloc(len);
- SET_VARSIZE(result, len);
- memcpy(VARDATA(result), buf->data, buf->len);
-
- return result;
+ return (xmltype *) cstring_to_text_with_len(buf->data, buf->len);
}
static xmltype *
cstring_to_xmltype(const char *string)
{
- int32 len;
- xmltype *result;
-
- len = strlen(string) + VARHDRSZ;
- result = palloc(len);
- SET_VARSIZE(result, len);
- memcpy(VARDATA(result), string, len - VARHDRSZ);
-
- return result;
+ return (xmltype *) cstring_to_text(string);
}
@@ -400,15 +378,8 @@ cstring_to_xmltype(const char *string)
static xmltype *
xmlBuffer_to_xmltype(xmlBufferPtr buf)
{
- int32 len;
- xmltype *result;
-
- len = xmlBufferLength(buf) + VARHDRSZ;
- result = palloc(len);
- SET_VARSIZE(result, len);
- memcpy(VARDATA(result), xmlBufferContent(buf), len - VARHDRSZ);
-
- return result;
+ return (xmltype *) cstring_to_text_with_len((char *) xmlBufferContent(buf),
+ xmlBufferLength(buf));
}
#endif
@@ -474,9 +445,7 @@ xmlconcat(List *args)
char *str;
len = VARSIZE(x) - VARHDRSZ;
- str = palloc(len + 1);
- memcpy(str, VARDATA(x), len);
- str[len] = '\0';
+ str = text_to_cstring((text *) x);
parse_xml_decl((xmlChar *) str, &len, &version, NULL, &standalone);
@@ -751,9 +720,7 @@ xmlroot(xmltype *data, text *version, int standalone)
StringInfoData buf;
len = VARSIZE(data) - VARHDRSZ;
- str = palloc(len + 1);
- memcpy(str, VARDATA(data), len);
- str[len] = '\0';
+ str = text_to_cstring((text *) data);
parse_xml_decl((xmlChar *) str, &len, &orig_version, NULL, &orig_standalone);
@@ -1237,19 +1204,12 @@ xml_parse(text *data, XmlOptionType xmloption_arg, bool preserve_whitespace,
/*
- * xmlChar<->text convertions
+ * xmlChar<->text conversions
*/
static xmlChar *
xml_text2xmlChar(text *in)
{
- int32 len = VARSIZE(in) - VARHDRSZ;
- xmlChar *res;
-
- res = palloc(len + 1);
- memcpy(res, VARDATA(in), len);
- res[len] = '\0';
-
- return (res);
+ return (xmlChar *) text_to_cstring(in);
}
@@ -3188,7 +3148,6 @@ xml_xmlnodetoxmltype(xmlNodePtr cur)
{
xmlChar *str;
xmltype *result;
- size_t len;
xmlBufferPtr buf;
if (cur->type == XML_ELEMENT_NODE)
@@ -3201,10 +3160,7 @@ xml_xmlnodetoxmltype(xmlNodePtr cur)
else
{
str = xmlXPathCastNodeToString(cur);
- len = strlen((char *) str);
- result = (xmltype *) palloc(len + VARHDRSZ);
- SET_VARSIZE(result, len + VARHDRSZ);
- memcpy(VARDATA(result), str, len);
+ result = (xmltype *) cstring_to_text((char *) str);
}
return result;