mirror of
				https://github.com/psycopg/psycopg2.git
				synced 2025-11-04 17:57:30 +03:00 
			
		
		
		
	Adaptation fixes (a lot.)
This commit is contained in:
		
							parent
							
								
									1ec3c83720
								
							
						
					
					
						commit
						cd672525e1
					
				
							
								
								
									
										19
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								ChangeLog
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,3 +1,22 @@
 | 
			
		|||
2005-03-01  Federico Di Gregorio  <fog@debian.org>
 | 
			
		||||
 | 
			
		||||
	* psycopg/microprotocols.c (microprotocols_adapt): fixed small
 | 
			
		||||
	typo that made adaptation using __conform__ impossible.
 | 
			
		||||
 | 
			
		||||
2005-02-28  Federico Di Gregorio  <fog@debian.org>
 | 
			
		||||
 | 
			
		||||
	* lib/extras.py: removed AsIs adapter (now a built-in); also
 | 
			
		||||
	removed prepare() method from the adapters that don't use it to
 | 
			
		||||
	avoid an extra method call at mogrification time.
 | 
			
		||||
 | 
			
		||||
	* psycopg/psycopgmodule.c (psyco_adapters_init): added
 | 
			
		||||
	initialization of the AsIs adapter (adapts int, long, float and
 | 
			
		||||
	*wonder* None!)
 | 
			
		||||
 | 
			
		||||
	* psycopg/cursor_type.c (_mogrify_getquoted): reorganized the code
 | 
			
		||||
	to adapt and then call .getquoted() to obtain the quoted data into
 | 
			
		||||
	this new function.
 | 
			
		||||
 | 
			
		||||
2005-2-27  Federico Di Gregorio  <fog@initd.org>
 | 
			
		||||
 | 
			
		||||
	* examples/myfirstrecipe.py: fixed adapter registration. 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								NEWS
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -11,6 +11,8 @@ What's new in psycopg 1.99.12
 | 
			
		|||
  connect to an old protocol 2 database and will detect it and use the
 | 
			
		||||
  right code.
 | 
			
		||||
 | 
			
		||||
* getquoted() called for real by the mogrification code.
 | 
			
		||||
 | 
			
		||||
What's new in psycopg 1.99.11
 | 
			
		||||
-----------------------------
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,12 @@ import sys, psycopg
 | 
			
		|||
import psycopg.extensions
 | 
			
		||||
import whrandom
 | 
			
		||||
 | 
			
		||||
# importing psycopg.extras will give us a nice tuple adapter: this is wrong
 | 
			
		||||
# because the adapter is meant to be used in SQL IN clauses while we use
 | 
			
		||||
# tuples to represent points but it works and the example is about Rect, not
 | 
			
		||||
# "Point"
 | 
			
		||||
import psycopg.extras
 | 
			
		||||
 | 
			
		||||
if len(sys.argv) > 1:
 | 
			
		||||
    DSN = sys.argv[1]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +49,7 @@ conn.commit()
 | 
			
		|||
# usually a function, but we use a class, just to demonstrate the
 | 
			
		||||
# flexibility of the psycopg casting system
 | 
			
		||||
 | 
			
		||||
class Rect:
 | 
			
		||||
class Rect(object):
 | 
			
		||||
    """Very simple rectangle.
 | 
			
		||||
 | 
			
		||||
    Note that we use this type as a data holder, as an adapter of itself for
 | 
			
		||||
| 
						 | 
				
			
			@ -59,7 +65,6 @@ class Rect:
 | 
			
		|||
 | 
			
		||||
    def __conform__(self, proto):
 | 
			
		||||
        """This is a terrible hack, just ignore proto and return self."""
 | 
			
		||||
        print "CONFORMIG!"
 | 
			
		||||
        return self
 | 
			
		||||
    
 | 
			
		||||
    def from_points(self, x0, y0, x1, y1):
 | 
			
		||||
| 
						 | 
				
			
			@ -82,11 +87,6 @@ class Rect:
 | 
			
		|||
            self.x, self.y, self.x + self.width, self.y + self.height)
 | 
			
		||||
        return s
 | 
			
		||||
 | 
			
		||||
    __str__ = getquoted
 | 
			
		||||
    
 | 
			
		||||
    def prepare(self, conn):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    def show(self):
 | 
			
		||||
        """Format a description of the box."""
 | 
			
		||||
        s = "X: %d\tY: %d\tWidth: %d\tHeight: %d" % (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,30 +71,12 @@ class DictRow(list):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AsIs(object):
 | 
			
		||||
    """An adapter that just return the object 'as is'.
 | 
			
		||||
 | 
			
		||||
    psycopg 1.99.9 has some optimizations that make impossible to call adapt()
 | 
			
		||||
    without adding some basic adapters externally. This limitation will be
 | 
			
		||||
    lifted in a future release. In the meantime you can use the AsIs adapter.
 | 
			
		||||
    """
 | 
			
		||||
    def __init__(self, obj):
 | 
			
		||||
        self.__obj = obj
 | 
			
		||||
    def getquoted(self):
 | 
			
		||||
        return str(self.__obj)
 | 
			
		||||
    def prepare(self, conn):
 | 
			
		||||
	pass
 | 
			
		||||
    __str__ = getquoted
 | 
			
		||||
 | 
			
		||||
class SQL_IN(object):
 | 
			
		||||
    """Adapt any iterable to an SQL quotable object."""
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, seq):
 | 
			
		||||
	self._seq = seq
 | 
			
		||||
	
 | 
			
		||||
    def prepare(self, conn):
 | 
			
		||||
	pass
 | 
			
		||||
    
 | 
			
		||||
    def getquoted(self):
 | 
			
		||||
        # this is the important line: note how every object in the
 | 
			
		||||
        # list is adapted and then how getquoted() is called on it
 | 
			
		||||
| 
						 | 
				
			
			@ -104,7 +86,4 @@ class SQL_IN(object):
 | 
			
		|||
 | 
			
		||||
    __str__ = getquoted
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
_RA(tuple, SQL_IN)
 | 
			
		||||
_RA(int, AsIs)
 | 
			
		||||
_RA(float, AsIs)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										223
									
								
								psycopg/adapter_asis.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								psycopg/adapter_asis.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,223 @@
 | 
			
		|||
/* adapter_asis.c - adapt types as they are
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2003-2004 Federico Di Gregorio <fog@debian.org>
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of psycopg.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License
 | 
			
		||||
 * as published by the Free Software Foundation; either version 2,
 | 
			
		||||
 * or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <Python.h>
 | 
			
		||||
#include <structmember.h>
 | 
			
		||||
#include <stringobject.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#define PSYCOPG_MODULE
 | 
			
		||||
#include "psycopg/config.h"
 | 
			
		||||
#include "psycopg/python.h"
 | 
			
		||||
#include "psycopg/psycopg.h"
 | 
			
		||||
#include "psycopg/adapter_asis.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** the AsIs object **/
 | 
			
		||||
 | 
			
		||||
static PyObject *
 | 
			
		||||
asis_str(asisObject *self)
 | 
			
		||||
{
 | 
			
		||||
    if (self->wrapped == Py_None) {
 | 
			
		||||
        return PyString_FromString("NULL");
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return PyObject_Repr(self->wrapped);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PyObject *
 | 
			
		||||
asis_getquoted(asisObject *self, PyObject *args)
 | 
			
		||||
{
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "")) return NULL;
 | 
			
		||||
    return asis_str(self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PyObject *
 | 
			
		||||
asis_prepare(asisObject *self, PyObject *args)
 | 
			
		||||
{
 | 
			
		||||
    PyObject *fake;
 | 
			
		||||
    
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "O", &fake)) return NULL;
 | 
			
		||||
 | 
			
		||||
    Py_INCREF(Py_None);
 | 
			
		||||
    return Py_None;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** the AsIs object */
 | 
			
		||||
 | 
			
		||||
/* object member list */
 | 
			
		||||
 | 
			
		||||
static struct PyMemberDef asisObject_members[] = {
 | 
			
		||||
    {"adapted", T_OBJECT, offsetof(asisObject, wrapped), RO},
 | 
			
		||||
    {NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* object method table */
 | 
			
		||||
 | 
			
		||||
static PyMethodDef asisObject_methods[] = {
 | 
			
		||||
    {"getquoted", (PyCFunction)asis_getquoted, METH_VARARGS,
 | 
			
		||||
     "getquoted() -> wrapped object value as SQL-quoted string"},
 | 
			
		||||
    /*    {"prepare", (PyCFunction)asis_prepare, METH_VARARGS,
 | 
			
		||||
          "prepare(conn) -> currently does nothing"}, */
 | 
			
		||||
    {NULL}  /* Sentinel */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* initialization and finalization methods */
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
asis_setup(asisObject *self, PyObject *obj)
 | 
			
		||||
{
 | 
			
		||||
    Dprintf("asis_setup: init asis object at %p, refcnt = %d",
 | 
			
		||||
            self, ((PyObject *)self)->ob_refcnt);
 | 
			
		||||
 | 
			
		||||
    self->wrapped = obj;
 | 
			
		||||
    Py_INCREF(self->wrapped);
 | 
			
		||||
    
 | 
			
		||||
    Dprintf("asis_setup: good asis object at %p, refcnt = %d",
 | 
			
		||||
            self, ((PyObject *)self)->ob_refcnt);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
asis_dealloc(PyObject* obj)
 | 
			
		||||
{
 | 
			
		||||
    asisObject *self = (asisObject *)obj;
 | 
			
		||||
 | 
			
		||||
    Py_XDECREF(self->wrapped);
 | 
			
		||||
    
 | 
			
		||||
    Dprintf("asis_dealloc: deleted asis object at %p, refcnt = %d",
 | 
			
		||||
            obj, obj->ob_refcnt);
 | 
			
		||||
    
 | 
			
		||||
    obj->ob_type->tp_free(obj);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
asis_init(PyObject *obj, PyObject *args, PyObject *kwds)
 | 
			
		||||
{
 | 
			
		||||
    PyObject *o;
 | 
			
		||||
    
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "O", &o))
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
    return asis_setup((asisObject *)obj, o);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject *
 | 
			
		||||
asis_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 | 
			
		||||
{    
 | 
			
		||||
    return type->tp_alloc(type, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
asis_del(PyObject* self)
 | 
			
		||||
{
 | 
			
		||||
    PyObject_Del(self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject *
 | 
			
		||||
asis_repr(asisObject *self)
 | 
			
		||||
{
 | 
			
		||||
    return PyString_FromFormat("<psycopg.AsIs object at %p>", self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* object type */
 | 
			
		||||
 | 
			
		||||
#define asisType_doc \
 | 
			
		||||
"psycopg.AsIs(str) -> new AsIs adapter object"
 | 
			
		||||
 | 
			
		||||
PyTypeObject asisType = {
 | 
			
		||||
    PyObject_HEAD_INIT(NULL)
 | 
			
		||||
    0,
 | 
			
		||||
    "psycopg._psycopg.AsIs",
 | 
			
		||||
    sizeof(asisObject),
 | 
			
		||||
    0,
 | 
			
		||||
    asis_dealloc, /*tp_dealloc*/
 | 
			
		||||
    0,          /*tp_print*/
 | 
			
		||||
 | 
			
		||||
    0,          /*tp_getattr*/
 | 
			
		||||
    0,          /*tp_setattr*/ 
 | 
			
		||||
 | 
			
		||||
    0,          /*tp_compare*/
 | 
			
		||||
 | 
			
		||||
    (reprfunc)asis_repr, /*tp_repr*/
 | 
			
		||||
    0,          /*tp_as_number*/
 | 
			
		||||
    0,          /*tp_as_sequence*/
 | 
			
		||||
    0,          /*tp_as_mapping*/
 | 
			
		||||
    0,          /*tp_hash */
 | 
			
		||||
 | 
			
		||||
    0,          /*tp_call*/
 | 
			
		||||
    (reprfunc)asis_str, /*tp_str*/
 | 
			
		||||
    
 | 
			
		||||
    0,          /*tp_getattro*/
 | 
			
		||||
    0,          /*tp_setattro*/
 | 
			
		||||
    0,          /*tp_as_buffer*/
 | 
			
		||||
 | 
			
		||||
    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
 | 
			
		||||
    asisType_doc, /*tp_doc*/
 | 
			
		||||
    
 | 
			
		||||
    0,          /*tp_traverse*/
 | 
			
		||||
    0,          /*tp_clear*/
 | 
			
		||||
 | 
			
		||||
    0,          /*tp_richcompare*/
 | 
			
		||||
    0,          /*tp_weaklistoffset*/
 | 
			
		||||
 | 
			
		||||
    0,          /*tp_iter*/
 | 
			
		||||
    0,          /*tp_iternext*/
 | 
			
		||||
 | 
			
		||||
    /* Attribute descriptor and subclassing stuff */
 | 
			
		||||
 | 
			
		||||
    asisObject_methods, /*tp_methods*/
 | 
			
		||||
    asisObject_members, /*tp_members*/
 | 
			
		||||
    0,          /*tp_getset*/
 | 
			
		||||
    0,          /*tp_base*/
 | 
			
		||||
    0,          /*tp_dict*/
 | 
			
		||||
    
 | 
			
		||||
    0,          /*tp_descr_get*/
 | 
			
		||||
    0,          /*tp_descr_set*/
 | 
			
		||||
    0,          /*tp_dictoffset*/
 | 
			
		||||
    
 | 
			
		||||
    asis_init, /*tp_init*/
 | 
			
		||||
    PyType_GenericAlloc, /*tp_alloc*/
 | 
			
		||||
    asis_new, /*tp_new*/
 | 
			
		||||
    (freefunc)asis_del, /*tp_free  Low-level free-memory routine */
 | 
			
		||||
    0,          /*tp_is_gc For PyObject_IS_GC */
 | 
			
		||||
    0,          /*tp_bases*/
 | 
			
		||||
    0,          /*tp_mro method resolution order */
 | 
			
		||||
    0,          /*tp_cache*/
 | 
			
		||||
    0,          /*tp_subclasses*/
 | 
			
		||||
    0           /*tp_weaklist*/
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** module-level functions **/
 | 
			
		||||
 | 
			
		||||
PyObject *
 | 
			
		||||
psyco_AsIs(PyObject *module, PyObject *args)
 | 
			
		||||
{
 | 
			
		||||
    PyObject *obj;
 | 
			
		||||
     
 | 
			
		||||
    if (!PyArg_ParseTuple(args, "O", &obj))
 | 
			
		||||
        return NULL;
 | 
			
		||||
  
 | 
			
		||||
    return PyObject_CallFunction((PyObject *)&asisType, "O", obj);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								psycopg/adapter_asis.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								psycopg/adapter_asis.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
/* adapter_asis.h - definition for the psycopg AsIs type wrapper
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2003-2005 Federico Di Gregorio <fog@debian.org>
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of psycopg.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License
 | 
			
		||||
 * as published by the Free Software Foundation; either version 2,
 | 
			
		||||
 * or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef PSYCOPG_ASIS_H
 | 
			
		||||
#define PSYCOPG_ASIS_H 1
 | 
			
		||||
 | 
			
		||||
#include <Python.h>
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern PyTypeObject asisType;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    PyObject HEAD;
 | 
			
		||||
 | 
			
		||||
    /* this is the real object we wrap */
 | 
			
		||||
    PyObject *wrapped;
 | 
			
		||||
 | 
			
		||||
} asisObject;
 | 
			
		||||
 | 
			
		||||
/* functions exported to psycopgmodule.c */
 | 
			
		||||
    
 | 
			
		||||
extern PyObject *psyco_AsIs(PyObject *module, PyObject *args);
 | 
			
		||||
#define psyco_AsIs_doc \
 | 
			
		||||
    "psycopg.AsIs(obj) -> new AsIs wrapper object"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* !defined(PSYCOPG_ASIS_H) */
 | 
			
		||||
| 
						 | 
				
			
			@ -190,8 +190,8 @@ static struct PyMemberDef binaryObject_members[] = {
 | 
			
		|||
static PyMethodDef binaryObject_methods[] = {
 | 
			
		||||
    {"getquoted", (PyCFunction)binary_getquoted, METH_VARARGS,
 | 
			
		||||
     "getquoted() -> wrapped object value as SQL-quoted binary string"},
 | 
			
		||||
    {"prepare", (PyCFunction)binary_prepare, METH_VARARGS,
 | 
			
		||||
     "prepare(conn) -> currently does nothing"},
 | 
			
		||||
    /*    {"prepare", (PyCFunction)binary_prepare, METH_VARARGS,
 | 
			
		||||
          "prepare(conn) -> currently does nothing"},*/
 | 
			
		||||
    {NULL}  /* Sentinel */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -108,8 +108,8 @@ static struct PyMemberDef pydatetimeObject_members[] = {
 | 
			
		|||
static PyMethodDef pydatetimeObject_methods[] = {
 | 
			
		||||
    {"getquoted", (PyCFunction)pydatetime_getquoted, METH_VARARGS,
 | 
			
		||||
     "getquoted() -> wrapped object value as SQL date/time"},
 | 
			
		||||
    {"prepare", (PyCFunction)pydatetime_prepare, METH_VARARGS,
 | 
			
		||||
     "prepare(conn) -> currently does nothing"},
 | 
			
		||||
    /*    {"prepare", (PyCFunction)pydatetime_prepare, METH_VARARGS,
 | 
			
		||||
          "prepare(conn) -> currently does nothing"}, */
 | 
			
		||||
    {NULL}  /* Sentinel */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -84,8 +84,8 @@ static struct PyMemberDef mxdatetimeObject_members[] = {
 | 
			
		|||
static PyMethodDef mxdatetimeObject_methods[] = {
 | 
			
		||||
    {"getquoted", (PyCFunction)mxdatetime_getquoted, METH_VARARGS,
 | 
			
		||||
     "getquoted() -> wrapped object value as SQL date/time"},
 | 
			
		||||
    {"prepare", (PyCFunction)mxdatetime_prepare, METH_VARARGS,
 | 
			
		||||
     "prepare(conn) -> currently does nothing"},
 | 
			
		||||
    /*    {"prepare", (PyCFunction)mxdatetime_prepare, METH_VARARGS,
 | 
			
		||||
          "prepare(conn) -> currently does nothing"}, */
 | 
			
		||||
    {NULL}  /* Sentinel */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -76,8 +76,8 @@ static struct PyMemberDef pbooleanObject_members[] = {
 | 
			
		|||
static PyMethodDef pbooleanObject_methods[] = {
 | 
			
		||||
    {"getquoted", (PyCFunction)pboolean_getquoted, METH_VARARGS,
 | 
			
		||||
     "getquoted() -> wrapped object value as SQL-quoted string"},
 | 
			
		||||
    {"prepare", (PyCFunction)pboolean_prepare, METH_VARARGS,
 | 
			
		||||
     "prepare(conn) -> currently does nothing"},
 | 
			
		||||
    /*    {"prepare", (PyCFunction)pboolean_prepare, METH_VARARGS,
 | 
			
		||||
          "prepare(conn) -> currently does nothing"}, */
 | 
			
		||||
    {NULL}  /* Sentinel */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,6 +61,38 @@ psyco_curs_close(cursorObject *self, PyObject *args)
 | 
			
		|||
 | 
			
		||||
/* mogrify a query string and build argument array or dict */
 | 
			
		||||
 | 
			
		||||
static PyObject*
 | 
			
		||||
_mogrify_getquoted(PyObject *obj, connectionObject *conn)
 | 
			
		||||
{
 | 
			
		||||
    PyObject *res = NULL;
 | 
			
		||||
    PyObject *tmp = microprotocols_adapt(
 | 
			
		||||
        obj, (PyObject*)&isqlquoteType, NULL);
 | 
			
		||||
    
 | 
			
		||||
    if (tmp != NULL) {
 | 
			
		||||
        Dprintf("_mogrify: adapted to %s", tmp->ob_type->tp_name);
 | 
			
		||||
 | 
			
		||||
        /* if requested prepare the object passing it the connection */
 | 
			
		||||
        if (PyObject_HasAttrString(tmp, "prepare")) {
 | 
			
		||||
            res = PyObject_CallMethod(tmp, "prepare", "O", (PyObject*)conn);
 | 
			
		||||
            if (res == NULL) {
 | 
			
		||||
                Py_DECREF(tmp);
 | 
			
		||||
                return NULL;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                Py_DECREF(res);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* call the getquoted method on tmp (that should exist because we
 | 
			
		||||
           adapted to the right protocol) */
 | 
			
		||||
        res = PyObject_CallMethod(tmp, "getquoted", NULL);
 | 
			
		||||
        Py_DECREF(tmp);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* we return res with one extra reference, the caller shall free it */
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
_mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -131,28 +163,17 @@ _mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new)
 | 
			
		|||
                        if (*d) *d = 's';
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        t = microprotocols_adapt(value,
 | 
			
		||||
                                                 (PyObject*)&isqlquoteType,
 | 
			
		||||
                                                 NULL);
 | 
			
		||||
                        t = _mogrify_getquoted(value, conn);
 | 
			
		||||
 | 
			
		||||
                        if (t != NULL) {
 | 
			
		||||
                            /* t is a new object, refcnt = 1 */
 | 
			
		||||
                            Dprintf("_mogrify: adapted to %s",
 | 
			
		||||
                                t->ob_type->tp_name);
 | 
			
		||||
 | 
			
		||||
                            /* prepare the object passing it the connection */
 | 
			
		||||
                            PyObject_CallMethod(t, "prepare", "O",
 | 
			
		||||
                                                (PyObject*)conn);
 | 
			
		||||
 | 
			
		||||
                            PyDict_SetItem(n, key, t);
 | 
			
		||||
                            /* both key and t refcnt +1, key is at 2 now */
 | 
			
		||||
                        }
 | 
			
		||||
                        else {
 | 
			
		||||
                            /* we did not found an adapter but we don't raise
 | 
			
		||||
                               an exception; just pass the original value */
 | 
			
		||||
                            PyErr_Clear();
 | 
			
		||||
                            PyDict_SetItem(n, key, value);
 | 
			
		||||
                            Dprintf("_mogrify: set value refcnt: %d",
 | 
			
		||||
                                    value->ob_refcnt);
 | 
			
		||||
                            /* no adapter found, raise a BIG exception */
 | 
			
		||||
                            Py_XDECREF(value); 
 | 
			
		||||
                            Py_DECREF(n);
 | 
			
		||||
                            return -1;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -200,20 +221,16 @@ _mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new)
 | 
			
		|||
                Py_DECREF(value);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                PyObject *t = microprotocols_adapt(value,
 | 
			
		||||
                                                   (PyObject*)&isqlquoteType,
 | 
			
		||||
                                                   NULL);
 | 
			
		||||
                if (t != NULL) {
 | 
			
		||||
                    /* prepare the object passing it the connection */
 | 
			
		||||
                    PyObject_CallMethod(t, "prepare", "O", (PyObject*)conn);
 | 
			
		||||
                PyObject *t = _mogrify_getquoted(value, conn);
 | 
			
		||||
 | 
			
		||||
                if (t != NULL) {
 | 
			
		||||
                    PyTuple_SET_ITEM(n, index, t);
 | 
			
		||||
                    Py_DECREF(value);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    PyErr_Clear();
 | 
			
		||||
                    PyTuple_SET_ITEM(n, index, value);
 | 
			
		||||
                    /* here we steal value ref, no need to DECREF */
 | 
			
		||||
                    Py_DECREF(n);
 | 
			
		||||
                    Py_DECREF(value);
 | 
			
		||||
                    return -1;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            c = d;
 | 
			
		||||
| 
						 | 
				
			
			@ -228,7 +245,7 @@ _mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new)
 | 
			
		|||
        n = PyTuple_New(0);
 | 
			
		||||
    *new = n;
 | 
			
		||||
    
 | 
			
		||||
    return 0;;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
#define psyco_curs_execute_doc \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,8 +58,7 @@ microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
 | 
			
		|||
{
 | 
			
		||||
    if (proto == NULL) proto = (PyObject*)&isqlquoteType;
 | 
			
		||||
 | 
			
		||||
    Dprintf("microprotocols_add: cast %p for (%s, ?)",
 | 
			
		||||
            cast, type->tp_name);
 | 
			
		||||
    Dprintf("microprotocols_add: cast %p for (%s, ?)", cast, type->tp_name);
 | 
			
		||||
 | 
			
		||||
    PyDict_SetItem(psyco_adapters,
 | 
			
		||||
                   Py_BuildValue("(OO)", (PyObject*)type, proto),
 | 
			
		||||
| 
						 | 
				
			
			@ -78,6 +77,8 @@ microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt)
 | 
			
		|||
       because the ISQLQuote type is abstract and there is no way to get a
 | 
			
		||||
       quotable object to be its instance */
 | 
			
		||||
 | 
			
		||||
    Dprintf("microprotocols_adapt: trying to adapt %s", obj->ob_type->tp_name);
 | 
			
		||||
    
 | 
			
		||||
    /* look for an adapter in the registry */
 | 
			
		||||
    key = Py_BuildValue("(OO)", (PyObject*)obj->ob_type, proto);
 | 
			
		||||
    adapter = PyDict_GetItem(psyco_adapters, key);
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +98,7 @@ microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt)
 | 
			
		|||
 | 
			
		||||
    /* and finally try to have the object adapt itself */   
 | 
			
		||||
    if (PyObject_HasAttrString(obj, "__conform__")) {
 | 
			
		||||
        PyObject *adapted = PyObject_CallMethod(proto, "__conform__","O", obj);
 | 
			
		||||
        PyObject *adapted = PyObject_CallMethod(obj, "__conform__","O", proto);
 | 
			
		||||
        if (adapted && adapted != Py_None) return adapted;
 | 
			
		||||
        if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError))
 | 
			
		||||
            return NULL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -106,8 +106,8 @@ static struct PyMethodDef isqlquoteObject_methods[] = {
 | 
			
		|||
     METH_VARARGS, psyco_isqlquote_getbinary_doc},
 | 
			
		||||
    {"getbuffer", (PyCFunction)psyco_isqlquote_getbuffer,
 | 
			
		||||
     METH_VARARGS, psyco_isqlquote_getbuffer_doc},
 | 
			
		||||
    {"prepare", (PyCFunction)psyco_isqlquote_prepare,
 | 
			
		||||
     METH_VARARGS, psyco_isqlquote_prepare_doc},
 | 
			
		||||
    /*    {"prepare", (PyCFunction)psyco_isqlquote_prepare,
 | 
			
		||||
          METH_VARARGS, psyco_isqlquote_prepare_doc}, */
 | 
			
		||||
    {NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,7 @@
 | 
			
		|||
#include "psycopg/adapter_qstring.h"
 | 
			
		||||
#include "psycopg/adapter_binary.h"
 | 
			
		||||
#include "psycopg/adapter_pboolean.h"
 | 
			
		||||
#include "psycopg/adapter_asis.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_MXDATETIME
 | 
			
		||||
| 
						 | 
				
			
			@ -187,6 +188,10 @@ psyco_adapters_init(PyObject *mod)
 | 
			
		|||
{
 | 
			
		||||
    PyObject *call;
 | 
			
		||||
    
 | 
			
		||||
    microprotocols_add(&PyFloat_Type, NULL, (PyObject*)&asisType);
 | 
			
		||||
    microprotocols_add(&PyInt_Type, NULL, (PyObject*)&asisType);
 | 
			
		||||
    microprotocols_add(&PyLong_Type, NULL, (PyObject*)&asisType);
 | 
			
		||||
 | 
			
		||||
    microprotocols_add(&PyString_Type, NULL, (PyObject*)&qstringType);
 | 
			
		||||
    microprotocols_add(&PyUnicode_Type, NULL, (PyObject*)&qstringType);
 | 
			
		||||
    microprotocols_add(&PyBuffer_Type, NULL, (PyObject*)&binaryType);
 | 
			
		||||
| 
						 | 
				
			
			@ -225,6 +230,9 @@ static encodingPair encodings[] = {
 | 
			
		|||
    {"SQL_ASCII",    "ascii"},
 | 
			
		||||
    {"LATIN1",       "latin_1"},
 | 
			
		||||
    {"UNICODE",      "utf_8"},
 | 
			
		||||
    /* some compatibility stuff */
 | 
			
		||||
    {"latin-1",      "latin_1"},
 | 
			
		||||
    
 | 
			
		||||
    {NULL, NULL}
 | 
			
		||||
};
 | 
			
		||||
static void psyco_encodings_fill(PyObject *dict)
 | 
			
		||||
| 
						 | 
				
			
			@ -329,6 +337,8 @@ static PyMethodDef psycopgMethods[] = {
 | 
			
		|||
    {"new_type", (PyCFunction)typecast_from_python,
 | 
			
		||||
     METH_VARARGS|METH_KEYWORDS},
 | 
			
		||||
 | 
			
		||||
    {"AsIs",  (PyCFunction)psyco_AsIs,
 | 
			
		||||
     METH_VARARGS, psyco_AsIs_doc},
 | 
			
		||||
    {"QuotedString",  (PyCFunction)psyco_QuotedString,
 | 
			
		||||
     METH_VARARGS, psyco_QuotedString_doc},
 | 
			
		||||
    {"Boolean",  (PyCFunction)psyco_Boolean,
 | 
			
		||||
| 
						 | 
				
			
			@ -390,6 +400,7 @@ init_psycopg(void)
 | 
			
		|||
    qstringType.ob_type    = &PyType_Type;
 | 
			
		||||
    binaryType.ob_type     = &PyType_Type;
 | 
			
		||||
    isqlquoteType.ob_type  = &PyType_Type;
 | 
			
		||||
    asisType.ob_type       = &PyType_Type;
 | 
			
		||||
    
 | 
			
		||||
    if (PyType_Ready(&connectionType) == -1) return;
 | 
			
		||||
    if (PyType_Ready(&cursorType) == -1) return;
 | 
			
		||||
| 
						 | 
				
			
			@ -397,6 +408,7 @@ init_psycopg(void)
 | 
			
		|||
    if (PyType_Ready(&qstringType) == -1) return;
 | 
			
		||||
    if (PyType_Ready(&binaryType) == -1) return;
 | 
			
		||||
    if (PyType_Ready(&isqlquoteType) == -1) return;
 | 
			
		||||
    if (PyType_Ready(&asisType) == -1) return;
 | 
			
		||||
    
 | 
			
		||||
#ifdef HAVE_PYBOOL
 | 
			
		||||
    pbooleanType.ob_type   = &PyType_Type;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								setup.py
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -47,7 +47,7 @@ from distutils.core import setup, Extension
 | 
			
		|||
from distutils.sysconfig import get_python_inc
 | 
			
		||||
import distutils.ccompiler
 | 
			
		||||
 | 
			
		||||
PSYCOPG_VERSION = '1.99.11'
 | 
			
		||||
PSYCOPG_VERSION = '1.99.11/devel'
 | 
			
		||||
 | 
			
		||||
have_pydatetime = False
 | 
			
		||||
have_mxdatetime = False
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +114,8 @@ sources = [
 | 
			
		|||
    'psycopgmodule.c', 'pqpath.c',  'typecast.c',
 | 
			
		||||
    'microprotocols.c', 'microprotocols_proto.c', 
 | 
			
		||||
    'connection_type.c', 'connection_int.c', 'cursor_type.c', 'cursor_int.c',
 | 
			
		||||
    'adapter_qstring.c', 'adapter_pboolean.c', 'adapter_binary.c']
 | 
			
		||||
    'adapter_qstring.c', 'adapter_pboolean.c', 'adapter_binary.c',
 | 
			
		||||
    'adapter_asis.c']
 | 
			
		||||
 | 
			
		||||
# check for mx package
 | 
			
		||||
mxincludedir = os.path.join(get_python_inc(plat_specific=1), "mx")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user