From be463a2da13734d5b104a5fc9c58e7bbb8908323 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Thu, 19 Nov 2015 14:44:49 -0800 Subject: [PATCH 1/2] add PQunescapeByteaConn for unescaping bytes given a connection This commit adds an unescape method that takes a connection as a parameter. The connection may have settings on it (like allocators) that are important to unescaping the string. --- src/interfaces/libpq/exports.txt | 1 + src/interfaces/libpq/fe-exec.c | 21 +++++++++++++++++++-- src/interfaces/libpq/libpq-fe.h | 6 ++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/interfaces/libpq/exports.txt b/src/interfaces/libpq/exports.txt index d6a38d0df8..ba718f4071 100644 --- a/src/interfaces/libpq/exports.txt +++ b/src/interfaces/libpq/exports.txt @@ -172,3 +172,4 @@ PQsslAttribute 169 PQsetErrorContextVisibility 170 PQresultVerboseErrorMessage 171 PQencryptPasswordConn 172 +PQunescapeByteaConn 173 diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index e1e2d18e3a..464bdc635f 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -3651,8 +3651,9 @@ PQescapeBytea(const unsigned char *from, size_t from_length, size_t *to_length) * \ooo == a byte whose value = ooo (ooo is an octal number) * \x == x (x is any character not matched by the above transformations) */ -unsigned char * -PQunescapeBytea(const unsigned char *strtext, size_t *retbuflen) +static unsigned char * +PQunescapeByteaInternal(PGconn *conn, + const unsigned char *strtext, size_t *retbuflen) { size_t strtextlen, buflen; @@ -3762,3 +3763,19 @@ PQunescapeBytea(const unsigned char *strtext, size_t *retbuflen) *retbuflen = buflen; return tmpbuf; } + +unsigned char * +PQunescapeByteaConn(PGconn *conn, + const unsigned char *strtext, size_t *retbuflen) +{ + if (!conn) + return NULL; + + return PQunescapeByteaInternal(conn, strtext, retbuflen); +} + +unsigned char * +PQunescapeBytea(const unsigned char *strtext, size_t *retbuflen) +{ + return PQunescapeByteaInternal(NULL, strtext, retbuflen); +} diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h index 1d915e7915..7fce4b387e 100644 --- a/src/interfaces/libpq/libpq-fe.h +++ b/src/interfaces/libpq/libpq-fe.h @@ -527,13 +527,15 @@ extern char *PQescapeIdentifier(PGconn *conn, const char *str, size_t len); extern unsigned char *PQescapeByteaConn(PGconn *conn, const unsigned char *from, size_t from_length, size_t *to_length); -extern unsigned char *PQunescapeBytea(const unsigned char *strtext, - size_t *retbuflen); +extern unsigned char *PQunescapeByteaConn(PGconn *conn, + const unsigned char *strtext, size_t *retbuflen); /* These forms are deprecated! */ extern size_t PQescapeString(char *to, const char *from, size_t length); extern unsigned char *PQescapeBytea(const unsigned char *from, size_t from_length, size_t *to_length); +extern unsigned char *PQunescapeBytea(const unsigned char *strtext, + size_t *retbuflen); -- 2.11.0