Dropped PSYCOPG_OWN_QUOTING.

It was deprecated for version 2.1. There are bugs to be fixed made more
complex by its presence and it doesn't keep into account PostgreSQL 9.0
new binary format.

Time to go!
This commit is contained in:
Daniele Varrazzo 2010-10-08 12:27:47 +01:00
parent baf65a0dda
commit 6e71b3db05
6 changed files with 2 additions and 165 deletions

View File

@ -1,5 +1,7 @@
2010-10-08 Daniele Varrazzo <daniele.varrazzo@gmail.com> 2010-10-08 Daniele Varrazzo <daniele.varrazzo@gmail.com>
* dropped PSYCOPG_OWN_QUOTING.
* psycopg/connection_int.c: Fixed access to freed memory in * psycopg/connection_int.c: Fixed access to freed memory in
conn_get_isolation_level(). Bug reported by Anton Kovalev. conn_get_isolation_level(). Bug reported by Anton Kovalev.

View File

@ -41,7 +41,6 @@
/** the quoting code */ /** the quoting code */
#ifndef PSYCOPG_OWN_QUOTING
static unsigned char * static unsigned char *
binary_escape(unsigned char *from, size_t from_length, binary_escape(unsigned char *from, size_t from_length,
size_t *to_length, PGconn *conn) size_t *to_length, PGconn *conn)
@ -53,82 +52,6 @@ binary_escape(unsigned char *from, size_t from_length,
#endif #endif
return PQescapeBytea(from, from_length, to_length); return PQescapeBytea(from, from_length, to_length);
} }
#else
static unsigned char *
binary_escape(unsigned char *from, size_t from_length,
size_t *to_length, PGconn *conn)
{
unsigned char *quoted, *chptr, *newptr;
size_t i, space, new_space;
space = from_length + 2;
Py_BEGIN_ALLOW_THREADS;
quoted = (unsigned char*)calloc(space, sizeof(char));
if (quoted == NULL) return NULL;
chptr = quoted;
for (i = 0; i < from_length; i++) {
if (chptr - quoted > space - 6) {
new_space = space * ((space) / (i + 1)) + 2 + 6;
if (new_space - space < 1024) space += 1024;
else space = new_space;
newptr = (unsigned char *)realloc(quoted, space);
if (newptr == NULL) {
free(quoted);
return NULL;
}
/* chptr has to be moved to the new location*/
chptr = newptr + (chptr - quoted);
quoted = newptr;
Dprintf("binary_escape: reallocated %i bytes at %p", space,quoted);
}
if (from[i]) {
if (from[i] >= ' ' && from[i] <= '~') {
if (from[i] == '\'') {
*chptr = '\'';
chptr++;
*chptr = '\'';
chptr++;
}
else if (from[i] == '\\') {
memcpy(chptr, "\\\\\\\\", 4);
chptr += 4;
}
else {
/* leave it as it is if ascii printable */
*chptr = from[i];
chptr++;
}
}
else {
unsigned char c;
/* escape to octal notation \nnn */
*chptr++ = '\\';
*chptr++ = '\\';
c = from[i];
*chptr = ((c >> 6) & 0x07) + 0x30; chptr++;
*chptr = ((c >> 3) & 0x07) + 0x30; chptr++;
*chptr = ( c & 0x07) + 0x30; chptr++;
}
}
else {
/* escape null as \\000 */
memcpy(chptr, "\\\\000", 5);
chptr += 5;
}
}
*chptr = '\0';
Py_END_ALLOW_THREADS;
*to_length = chptr - quoted + 1;
return quoted;
}
#endif
/* binary_quote - do the quote process on plain and unicode strings */ /* binary_quote - do the quote process on plain and unicode strings */

View File

@ -174,18 +174,12 @@ conn_get_standard_conforming_strings(PGconn *pgconn)
* not escaped strings (e.g. '\001' -> "\001"), relying on the * not escaped strings (e.g. '\001' -> "\001"), relying on the
* fact that the '\' will pass untouched the string parser. * fact that the '\' will pass untouched the string parser.
* In this case the E'' quotes are NOT to be used. * In this case the E'' quotes are NOT to be used.
*
* The PSYCOPG_OWN_QUOTING implementation always returns escaped strings.
*/ */
scs = PQparameterStatus(pgconn, "standard_conforming_strings"); scs = PQparameterStatus(pgconn, "standard_conforming_strings");
Dprintf("conn_connect: server standard_conforming_strings parameter: %s", Dprintf("conn_connect: server standard_conforming_strings parameter: %s",
scs ? scs : "unavailable"); scs ? scs : "unavailable");
#ifndef PSYCOPG_OWN_QUOTING
equote = (scs && (0 == strcmp("off", scs))); equote = (scs && (0 == strcmp("off", scs)));
#else
equote = (scs != NULL);
#endif
Dprintf("conn_connect: server requires E'' quotes: %s", Dprintf("conn_connect: server requires E'' quotes: %s",
equote ? "YES" : "NO"); equote ? "YES" : "NO");

View File

@ -110,55 +110,6 @@ PyTypeObject chunkType = {
chunk_doc /* tp_doc */ chunk_doc /* tp_doc */
}; };
/* the function typecast_BINARY_cast_unescape is used when libpq does not
provide PQunescapeBytea: it convert all the \xxx octal sequences to the
proper byte value */
#ifdef PSYCOPG_OWN_QUOTING
static unsigned char *
typecast_BINARY_cast_unescape(unsigned char *str, size_t *to_length)
{
char *dstptr, *dststr;
int len, i;
len = strlen(str);
dststr = (char*)calloc(len, sizeof(char));
dstptr = dststr;
if (dststr == NULL) return NULL;
Py_BEGIN_ALLOW_THREADS;
for (i = 0; i < len; i++) {
if (str[i] == '\\') {
if ( ++i < len) {
if (str[i] == '\\') {
*dstptr = '\\';
}
else {
*dstptr = 0;
*dstptr |= (str[i++] & 7) << 6;
*dstptr |= (str[i++] & 7) << 3;
*dstptr |= (str[i] & 7);
}
}
}
else {
*dstptr = str[i];
}
dstptr++;
}
Py_END_ALLOW_THREADS;
*to_length = (size_t)(dstptr-dststr);
return dststr;
}
#define PQunescapeBytea typecast_BINARY_cast_unescape
#endif
static PyObject * static PyObject *
typecast_BINARY_cast(const char *s, Py_ssize_t l, PyObject *curs) typecast_BINARY_cast(const char *s, Py_ssize_t l, PyObject *curs)
{ {

View File

@ -50,7 +50,6 @@ psycopg_escape_string(PyObject *obj, const char *from, Py_ssize_t len,
return NULL; return NULL;
} }
#ifndef PSYCOPG_OWN_QUOTING
{ {
#if PG_VERSION_HEX >= 0x080104 #if PG_VERSION_HEX >= 0x080104
int err; int err;
@ -60,37 +59,6 @@ psycopg_escape_string(PyObject *obj, const char *from, Py_ssize_t len,
#endif #endif
ql = PQescapeString(to+eq+1, from, len); ql = PQescapeString(to+eq+1, from, len);
} }
#else
{
int i, j;
for (i=0, j=eq+1; i<len; i++) {
switch(from[i]) {
case '\'':
to[j++] = '\'';
to[j++] = '\'';
break;
case '\\':
to[j++] = '\\';
to[j++] = '\\';
break;
case '\0':
/* do nothing, embedded \0 are discarded */
break;
default:
to[j++] = from[i];
}
}
to[j] = '\0';
Dprintf("qstring_quote: to = %s", to);
ql = strlen(to);
}
#endif
if (eq) if (eq)
to[0] = 'E'; to[0] = 'E';

View File

@ -6,7 +6,6 @@ define=PSYCOPG_EXTENSIONS,PSYCOPG_NEW_BOOLEAN,HAVE_PQFREEMEM,HAVE_PQPROTOCOL3
# HAVE_PQFREEMEM should be defined on PostgreSQL >= 7.4 # HAVE_PQFREEMEM should be defined on PostgreSQL >= 7.4
# HAVE_PQPROTOCOL3 should be defined on PostgreSQL >= 7.4 # HAVE_PQPROTOCOL3 should be defined on PostgreSQL >= 7.4
# PSYCOPG_DEBUG can be added to enable verbose debug information # PSYCOPG_DEBUG can be added to enable verbose debug information
# PSYCOPG_OWN_QUOTING can be added, but it is deprecated (will go away in 2.1)
# PSYCOPG_NEW_BOOLEAN to format booleans as true/false vs 't'/'f' # PSYCOPG_NEW_BOOLEAN to format booleans as true/false vs 't'/'f'
# Set to 1 to use Python datatime objects for default date/time representation. # Set to 1 to use Python datatime objects for default date/time representation.