mirror of
https://github.com/psycopg/psycopg2.git
synced 2025-01-31 09:24:07 +03:00
Added support for NULL in arrays (closes: #154)
This commit is contained in:
parent
2883428791
commit
1c16009985
|
@ -1,6 +1,11 @@
|
|||
2007-01-19 Federico Di Gregorio <fog@initd.org>
|
||||
|
||||
* Release 2.0.6 beta 1.
|
||||
* psycopg/adapt_list.c: added support for None. And this closes
|
||||
the other half.
|
||||
|
||||
* psycopg/typecast_array.c: added support for detecting the NULL
|
||||
special string and converting it as a real NULL if not enclosed in
|
||||
quotes. This closes half of #154.
|
||||
|
||||
2007-01-16 Federico Di Gregorio <fog@initd.org>
|
||||
|
||||
|
|
|
@ -51,8 +51,12 @@ list_quote(listObject *self)
|
|||
tmp = PyTuple_New(len);
|
||||
|
||||
for (i=0; i<len; i++) {
|
||||
PyObject *quoted =
|
||||
microprotocol_getquoted(PyList_GET_ITEM(self->wrapped, i),
|
||||
PyObject *quoted;
|
||||
PyObject *wrapped = PyList_GET_ITEM(self->wrapped, i);
|
||||
if (wrapped == Py_None)
|
||||
quoted = PyString_FromString("NULL");
|
||||
else
|
||||
quoted = microprotocol_getquoted(wrapped,
|
||||
(connectionObject*)self->connection);
|
||||
if (quoted == NULL) goto error;
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ typecast_array_cleanup(char **str, int *len)
|
|||
|
||||
static int
|
||||
typecast_array_tokenize(char *str, int strlength,
|
||||
int *pos, char** token, int *length)
|
||||
int *pos, char** token, int *length, int *quotes)
|
||||
{
|
||||
/* FORTRAN glory */
|
||||
int i, j, q, b, l, res;
|
||||
|
@ -117,10 +117,12 @@ typecast_array_tokenize(char *str, int strlength,
|
|||
|
||||
tokenize:
|
||||
/* remove initial quoting character and calculate raw length */
|
||||
*quotes = 0;
|
||||
l = i - *pos;
|
||||
if (str[*pos] == '"') {
|
||||
*pos += 1;
|
||||
l -= 2;
|
||||
*quotes = 1;
|
||||
}
|
||||
|
||||
if (res == ASCAN_QUOTED) {
|
||||
|
@ -155,7 +157,7 @@ static int
|
|||
typecast_array_scan(char *str, int strlength,
|
||||
PyObject *curs, PyObject *base, PyObject *array)
|
||||
{
|
||||
int state, length = 0, pos = 0;
|
||||
int state, quotes, length = 0, pos = 0;
|
||||
char *token;
|
||||
|
||||
PyObject *stack[MAX_DIMENSIONS];
|
||||
|
@ -163,11 +165,20 @@ typecast_array_scan(char *str, int strlength,
|
|||
|
||||
while (1) {
|
||||
token = NULL;
|
||||
state = typecast_array_tokenize(str, strlength, &pos, &token, &length);
|
||||
state = typecast_array_tokenize(str, strlength,
|
||||
&pos, &token, &length, "es);
|
||||
Dprintf("typecast_array_scan: state = %d, length = %d, token = '%s'",
|
||||
state, length, token);
|
||||
if (state == ASCAN_TOKEN || state == ASCAN_QUOTED) {
|
||||
PyObject *obj = typecast_cast(base, token, length, curs);
|
||||
PyObject *obj;
|
||||
if (!quotes && length == 4
|
||||
&& (token[0] == 'n' || token[0] == 'N')
|
||||
&& (token[1] == 'u' || token[1] == 'U')
|
||||
&& (token[2] == 'l' || token[2] == 'L')
|
||||
&& (token[3] == 'l' || token[3] == 'L'))
|
||||
obj = typecast_cast(base, NULL, 0, curs);
|
||||
else
|
||||
obj = typecast_cast(base, token, length, curs);
|
||||
|
||||
/* before anything else we free the memory */
|
||||
if (state == ASCAN_QUOTED) PyMem_Free(token);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import psycopg2
|
||||
|
||||
conn = psycopg2.connect("dbname=test")
|
||||
conn = psycopg2.connect("port=5433 dbname=test")
|
||||
curs = conn.cursor()
|
||||
|
||||
#curs.execute("SELECT ARRAY[1,2,3] AS foo")
|
||||
|
@ -20,9 +20,12 @@ curs = conn.cursor()
|
|||
#print curs.description
|
||||
#print curs.fetchone()[0]
|
||||
|
||||
curs.execute("SELECT 1 AS foo, ARRAY[1,2] AS bar")
|
||||
print curs.fetchone()
|
||||
|
||||
curs.execute("SELECT * FROM test()")
|
||||
#curs.execute("SELECT 1 AS foo, ARRAY[1,2] AS bar")
|
||||
#print curs.fetchone()
|
||||
|
||||
#curs.execute("SELECT * FROM test()")
|
||||
#print curs.fetchone()
|
||||
|
||||
curs.execute("SELECT %s", ([1,2,None],))
|
||||
print curs.fetchone()
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[build_ext]
|
||||
define=PSYCOPG_EXTENSIONS,PSYCOPG_DISPLAY_SIZE,PSYCOPG_NEW_BOOLEAN,HAVE_PQFREEMEM,HAVE_PQPROTOCOL3
|
||||
define=PSYCOPG_DEBUG,PSYCOPG_EXTENSIONS,PSYCOPG_DISPLAY_SIZE,PSYCOPG_NEW_BOOLEAN,HAVE_PQFREEMEM,HAVE_PQPROTOCOL3
|
||||
# PSYCOPG_EXTENSIONS enables extensions to PEP-249 (you really want this)
|
||||
# PSYCOPG_DISPLAY_SIZE enable display size calculation (a little slower)
|
||||
# HAVE_PQFREEMEM should be defined on PostgreSQL >= 7.4
|
||||
|
|
Loading…
Reference in New Issue
Block a user