mirror of
https://github.com/psycopg/psycopg2.git
synced 2024-11-25 02:13:44 +03:00
Dropped support for Python 2.4
This commit is contained in:
parent
e65392e0d8
commit
b6873ee1ab
1
NEWS
1
NEWS
|
@ -28,6 +28,7 @@ Bug fixes:
|
||||||
Other changes:
|
Other changes:
|
||||||
|
|
||||||
- Added support for Python 3.3.
|
- Added support for Python 3.3.
|
||||||
|
- Dropped support for Python 2.4. Please use Psycopg 2.4.x if you need it.
|
||||||
- `~psycopg2.errorcodes` map updated to PostgreSQL 9.2.
|
- `~psycopg2.errorcodes` map updated to PostgreSQL 9.2.
|
||||||
- Dropped Zope adapter from source repository. ZPsycopgDA now has its own
|
- Dropped Zope adapter from source repository. ZPsycopgDA now has its own
|
||||||
project at <http://github.com/psycopg/ZPsycopgDA>.
|
project at <http://github.com/psycopg/ZPsycopgDA>.
|
||||||
|
|
|
@ -14,7 +14,7 @@ mature as the C implementation yet.
|
||||||
|
|
||||||
The current `!psycopg2` implementation supports:
|
The current `!psycopg2` implementation supports:
|
||||||
|
|
||||||
- Python 2 versions from 2.4 to 2.7
|
- Python 2 versions from 2.5 to 2.7
|
||||||
- Python 3 versions from 3.1 to 3.3
|
- Python 3 versions from 3.1 to 3.3
|
||||||
- PostgreSQL versions from 7.4 to 9.2
|
- PostgreSQL versions from 7.4 to 9.2
|
||||||
|
|
||||||
|
|
|
@ -41,23 +41,6 @@ Homepage: http://initd.org/projects/psycopg2
|
||||||
# Import modules needed by _psycopg to allow tools like py2exe to do
|
# Import modules needed by _psycopg to allow tools like py2exe to do
|
||||||
# their work without bothering about the module dependencies.
|
# their work without bothering about the module dependencies.
|
||||||
|
|
||||||
import sys, warnings
|
|
||||||
if sys.version_info >= (2, 3):
|
|
||||||
try:
|
|
||||||
import datetime as _psycopg_needs_datetime
|
|
||||||
except:
|
|
||||||
warnings.warn(
|
|
||||||
"can't import datetime module probably needed by _psycopg",
|
|
||||||
RuntimeWarning)
|
|
||||||
if sys.version_info >= (2, 4):
|
|
||||||
try:
|
|
||||||
import decimal as _psycopg_needs_decimal
|
|
||||||
except:
|
|
||||||
warnings.warn(
|
|
||||||
"can't import decimal module probably needed by _psycopg",
|
|
||||||
RuntimeWarning)
|
|
||||||
del sys, warnings
|
|
||||||
|
|
||||||
# Note: the first internal import should be _psycopg, otherwise the real cause
|
# Note: the first internal import should be _psycopg, otherwise the real cause
|
||||||
# of a failed loading of the C module may get hidden, see
|
# of a failed loading of the C module may get hidden, see
|
||||||
# http://archives.postgresql.org/psycopg/2011-02/msg00044.php
|
# http://archives.postgresql.org/psycopg/2011-02/msg00044.php
|
||||||
|
|
|
@ -1358,7 +1358,7 @@ psyco_curs_copy_from(cursorObject *self, PyObject *args, PyObject *kwargs)
|
||||||
PyObject *file, *columns = NULL, *res = NULL;
|
PyObject *file, *columns = NULL, *res = NULL;
|
||||||
|
|
||||||
if (!PyArg_ParseTupleAndKeywords(args, kwargs,
|
if (!PyArg_ParseTupleAndKeywords(args, kwargs,
|
||||||
"O&s|ss" CONV_CODE_PY_SSIZE_T "O", kwlist,
|
"O&s|ssnO", kwlist,
|
||||||
_psyco_curs_has_read_check, &file, &table_name, &sep, &null, &bufsize,
|
_psyco_curs_has_read_check, &file, &table_name, &sep, &null, &bufsize,
|
||||||
&columns))
|
&columns))
|
||||||
{
|
{
|
||||||
|
@ -1535,7 +1535,7 @@ psyco_curs_copy_expert(cursorObject *self, PyObject *args, PyObject *kwargs)
|
||||||
static char *kwlist[] = {"sql", "file", "size", NULL};
|
static char *kwlist[] = {"sql", "file", "size", NULL};
|
||||||
|
|
||||||
if (!PyArg_ParseTupleAndKeywords(args, kwargs,
|
if (!PyArg_ParseTupleAndKeywords(args, kwargs,
|
||||||
"OO|" CONV_CODE_PY_SSIZE_T, kwlist, &sql, &file, &bufsize))
|
"OO|n", kwlist, &sql, &file, &bufsize))
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
|
|
||||||
EXC_IF_CURS_CLOSED(self);
|
EXC_IF_CURS_CLOSED(self);
|
||||||
|
|
|
@ -131,8 +131,6 @@ static struct PyGetSetDef error_getsets[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#if PY_VERSION_HEX >= 0x02050000
|
|
||||||
|
|
||||||
/* Error.__reduce__
|
/* Error.__reduce__
|
||||||
*
|
*
|
||||||
* The method is required to make exceptions picklable: set the cursor
|
* The method is required to make exceptions picklable: set the cursor
|
||||||
|
@ -227,21 +225,10 @@ error:
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* PY_VERSION_HEX >= 0x02050000 */
|
|
||||||
|
|
||||||
static PyMethodDef error_methods[] = {
|
static PyMethodDef error_methods[] = {
|
||||||
#if PY_VERSION_HEX >= 0x02050000
|
/* Make Error and all its subclasses picklable. */
|
||||||
/* Make Error and all its subclasses picklable.
|
|
||||||
*
|
|
||||||
* TODO: this comment applied to the __reduce_ex__ implementation: now
|
|
||||||
* pickling may work on Py 2.4 too... but it's 2013 now.
|
|
||||||
*
|
|
||||||
* Don't do it it on Py 2.4: [__reduce_ex__] it is not used by the pickle
|
|
||||||
* protocol, and if called manually fails in an unsettling way,
|
|
||||||
* probably because the exceptions were old-style classes. */
|
|
||||||
{"__reduce__", (PyCFunction)psyco_error_reduce, METH_NOARGS },
|
{"__reduce__", (PyCFunction)psyco_error_reduce, METH_NOARGS },
|
||||||
{"__setstate__", (PyCFunction)psyco_error_setstate, METH_O },
|
{"__setstate__", (PyCFunction)psyco_error_setstate, METH_O },
|
||||||
#endif
|
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -128,7 +128,7 @@ psyco_lobj_read(lobjectObject *self, PyObject *args)
|
||||||
Py_ssize_t size = -1;
|
Py_ssize_t size = -1;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "|" CONV_CODE_PY_SSIZE_T, &size)) return NULL;
|
if (!PyArg_ParseTuple(args, "|n", &size)) return NULL;
|
||||||
|
|
||||||
EXC_IF_LOBJ_CLOSED(self);
|
EXC_IF_LOBJ_CLOSED(self);
|
||||||
EXC_IF_LOBJ_LEVEL0(self);
|
EXC_IF_LOBJ_LEVEL0(self);
|
||||||
|
|
|
@ -31,36 +31,12 @@
|
||||||
#include <stringobject.h>
|
#include <stringobject.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if PY_VERSION_HEX < 0x02040000
|
|
||||||
# error "psycopg requires Python >= 2.4"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PY_VERSION_HEX < 0x02050000
|
#if PY_VERSION_HEX < 0x02050000
|
||||||
/* Function missing in Py 2.4 */
|
# error "psycopg requires Python >= 2.5"
|
||||||
#define PyErr_WarnEx(cat,msg,lvl) PyErr_Warn(cat,msg)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
|
|
||||||
typedef int Py_ssize_t;
|
|
||||||
#define PY_SSIZE_T_MIN INT_MIN
|
|
||||||
#define PY_SSIZE_T_MAX INT_MAX
|
|
||||||
#define PY_FORMAT_SIZE_T ""
|
|
||||||
#define PyInt_FromSsize_t(x) PyInt_FromLong((x))
|
|
||||||
|
|
||||||
#define lenfunc inquiry
|
|
||||||
#define ssizeargfunc intargfunc
|
|
||||||
#define readbufferproc getreadbufferproc
|
|
||||||
#define writebufferproc getwritebufferproc
|
|
||||||
#define segcountproc getsegcountproc
|
|
||||||
#define charbufferproc getcharbufferproc
|
|
||||||
|
|
||||||
#define CONV_CODE_PY_SSIZE_T "i"
|
|
||||||
#else
|
|
||||||
#define CONV_CODE_PY_SSIZE_T "n"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* hash() return size changed around version 3.2a4 on 64bit platforms. Before
|
/* hash() return size changed around version 3.2a4 on 64bit platforms. Before
|
||||||
* this, the return size was always a long, regardless of arch. ~3.2
|
* this, the return size was always a long, regardless of arch. ~3.2
|
||||||
* introduced the Py_hash_t & Py_uhash_t typedefs with the resulting sizes
|
* introduced the Py_hash_t & Py_uhash_t typedefs with the resulting sizes
|
||||||
* based upon arch. */
|
* based upon arch. */
|
||||||
#if PY_VERSION_HEX < 0x030200A4
|
#if PY_VERSION_HEX < 0x030200A4
|
||||||
|
@ -76,11 +52,6 @@ typedef unsigned long Py_uhash_t;
|
||||||
#define PyVarObject_HEAD_INIT(x,n) PyObject_HEAD_INIT(x) n,
|
#define PyVarObject_HEAD_INIT(x,n) PyObject_HEAD_INIT(x) n,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Missing at least in Python 2.4 */
|
|
||||||
#ifndef Py_MEMCPY
|
|
||||||
#define Py_MEMCPY memcpy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* FORMAT_CODE_PY_SSIZE_T is for Py_ssize_t: */
|
/* FORMAT_CODE_PY_SSIZE_T is for Py_ssize_t: */
|
||||||
#define FORMAT_CODE_PY_SSIZE_T "%" PY_FORMAT_SIZE_T "d"
|
#define FORMAT_CODE_PY_SSIZE_T "%" PY_FORMAT_SIZE_T "d"
|
||||||
|
|
||||||
|
|
|
@ -22,10 +22,7 @@
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||||
# License for more details.
|
# License for more details.
|
||||||
|
|
||||||
try:
|
import decimal
|
||||||
import decimal
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
|
@ -66,10 +63,6 @@ class TypesBasicTests(unittest.TestCase):
|
||||||
self.failUnless(s == 1971, "wrong integer quoting: " + str(s))
|
self.failUnless(s == 1971, "wrong integer quoting: " + str(s))
|
||||||
s = self.execute("SELECT %s AS foo", (1971L,))
|
s = self.execute("SELECT %s AS foo", (1971L,))
|
||||||
self.failUnless(s == 1971L, "wrong integer quoting: " + str(s))
|
self.failUnless(s == 1971L, "wrong integer quoting: " + str(s))
|
||||||
if sys.version_info[0:2] < (2, 4):
|
|
||||||
s = self.execute("SELECT %s AS foo", (19.10,))
|
|
||||||
self.failUnless(abs(s - 19.10) < 0.001,
|
|
||||||
"wrong float quoting: " + str(s))
|
|
||||||
|
|
||||||
def testBoolean(self):
|
def testBoolean(self):
|
||||||
x = self.execute("SELECT %s as foo", (False,))
|
x = self.execute("SELECT %s as foo", (False,))
|
||||||
|
@ -78,21 +71,18 @@ class TypesBasicTests(unittest.TestCase):
|
||||||
self.assert_(x is True)
|
self.assert_(x is True)
|
||||||
|
|
||||||
def testDecimal(self):
|
def testDecimal(self):
|
||||||
if sys.version_info[0:2] >= (2, 4):
|
s = self.execute("SELECT %s AS foo", (decimal.Decimal("19.10"),))
|
||||||
s = self.execute("SELECT %s AS foo", (decimal.Decimal("19.10"),))
|
self.failUnless(s - decimal.Decimal("19.10") == 0,
|
||||||
self.failUnless(s - decimal.Decimal("19.10") == 0,
|
"wrong decimal quoting: " + str(s))
|
||||||
"wrong decimal quoting: " + str(s))
|
s = self.execute("SELECT %s AS foo", (decimal.Decimal("NaN"),))
|
||||||
s = self.execute("SELECT %s AS foo", (decimal.Decimal("NaN"),))
|
self.failUnless(str(s) == "NaN", "wrong decimal quoting: " + str(s))
|
||||||
self.failUnless(str(s) == "NaN", "wrong decimal quoting: " + str(s))
|
self.failUnless(type(s) == decimal.Decimal, "wrong decimal conversion: " + repr(s))
|
||||||
self.failUnless(type(s) == decimal.Decimal, "wrong decimal conversion: " + repr(s))
|
s = self.execute("SELECT %s AS foo", (decimal.Decimal("infinity"),))
|
||||||
s = self.execute("SELECT %s AS foo", (decimal.Decimal("infinity"),))
|
self.failUnless(str(s) == "NaN", "wrong decimal quoting: " + str(s))
|
||||||
self.failUnless(str(s) == "NaN", "wrong decimal quoting: " + str(s))
|
self.failUnless(type(s) == decimal.Decimal, "wrong decimal conversion: " + repr(s))
|
||||||
self.failUnless(type(s) == decimal.Decimal, "wrong decimal conversion: " + repr(s))
|
s = self.execute("SELECT %s AS foo", (decimal.Decimal("-infinity"),))
|
||||||
s = self.execute("SELECT %s AS foo", (decimal.Decimal("-infinity"),))
|
self.failUnless(str(s) == "NaN", "wrong decimal quoting: " + str(s))
|
||||||
self.failUnless(str(s) == "NaN", "wrong decimal quoting: " + str(s))
|
self.failUnless(type(s) == decimal.Decimal, "wrong decimal conversion: " + repr(s))
|
||||||
self.failUnless(type(s) == decimal.Decimal, "wrong decimal conversion: " + repr(s))
|
|
||||||
else:
|
|
||||||
return self.skipTest("decimal not available")
|
|
||||||
|
|
||||||
def testFloatNan(self):
|
def testFloatNan(self):
|
||||||
try:
|
try:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user