int->size_t transition.

This commit is contained in:
Federico Di Gregorio 2007-04-13 01:16:22 +00:00
parent ee44315ff2
commit 967ec370ed
13 changed files with 152 additions and 108 deletions

View File

@ -1,3 +1,7 @@
2007-04-13 Federico Di Gregorio <fog@initd.org>
* Applied patch from David Rushby for int->size_t transition.
2007-04-12 Federico Di Gregorio <fog@initd.org>
* Applied patch from Jason Erickson to fix win32 build glitches.

View File

@ -148,11 +148,26 @@ qstring_quote(qstringObject *self)
return NULL;
}
Py_BEGIN_ALLOW_THREADS;
len = qstring_escape(buffer+1, s, len,
self->conn ? ((connectionObject*)self->conn)->pgconn : NULL);
buffer[0] = '\'' ; buffer[len+1] = '\'';
Py_END_ALLOW_THREADS;
{ /* Call qstring_escape with the GIL released, then reacquire the GIL
* before verifying that the results can fit into a Python string; raise
* an exception if not. */
size_t qstring_res;
Py_BEGIN_ALLOW_THREADS
qstring_res = qstring_escape(buffer+1, s, len,
self->conn ? ((connectionObject*)self->conn)->pgconn : NULL);
Py_END_ALLOW_THREADS
if (qstring_res > (size_t) PY_SSIZE_T_MAX) {
PyErr_SetString(PyExc_IndexError, "PG buffer too large to fit in"
" Python buffer.");
PyMem_Free(buffer);
Py_DECREF(str);
return NULL;
}
len = (Py_ssize_t) qstring_res;
buffer[0] = '\'' ; buffer[len+1] = '\'';
}
self->buffer = PyString_FromStringAndSize(buffer, len+2);
PyMem_Free(buffer);

View File

@ -55,7 +55,7 @@ conn_connect(connectionObject *self)
PGconn *pgconn;
PGresult *pgres;
char *data, *tmp;
int i;
size_t i;
/* we need the initial date style to be ISO, for typecasters; if the user
later change it, she must know what she's doing... */

View File

@ -184,7 +184,7 @@ static PyObject *
psyco_conn_set_client_encoding(connectionObject *self, PyObject *args)
{
char *buffer, *enc = NULL;
int i, j;
size_t i, j;
EXC_IF_CONN_CLOSED(self);

View File

@ -90,12 +90,12 @@ _mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new)
while(*c) {
/* check if some crazy guy mixed formats */
if (kind == 2) {
Py_XDECREF(n);
Py_XDECREF(n);
psyco_set_error(ProgrammingError, (PyObject*)conn,
"argument formats can't be mixed", NULL, NULL);
"argument formats can't be mixed", NULL, NULL);
return -1;
}
kind = 1;
}
kind = 1;
/* handle plain percent symbol in format string */
if (c[0] == '%' && c[1] == '%') {
@ -114,7 +114,7 @@ _mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new)
for (d = c + 2; *d && *d != ')'; d++);
if (*d == ')') {
key = PyString_FromStringAndSize(c+2, d-c-2);
key = PyString_FromStringAndSize(c+2, (Py_ssize_t) (d-c-2));
value = PyObject_GetItem(var, key);
/* key has refcnt 1, value the original value + 1 */
@ -195,8 +195,8 @@ _mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new)
if (kind == 1) {
Py_XDECREF(n);
psyco_set_error(ProgrammingError, (PyObject*)conn,
"argument formats can't be mixed", NULL, NULL);
return -1;
"argument formats can't be mixed", NULL, NULL);
return -1;
}
kind = 2;
@ -653,7 +653,7 @@ _psyco_curs_buildrow_fill(cursorObject *self, PyObject *res,
len = PQgetlength(self->pgres, row, i);
}
Dprintf("_psyco_curs_buildrow: row %ld, element %d, len %i",
Dprintf("_psyco_curs_buildrow: row %ld, element %d, len %d",
self->row, i, len);
val = typecast_cast(PyTuple_GET_ITEM(self->casts, i), (char*)str, len,
@ -902,14 +902,15 @@ psyco_curs_callproc(cursorObject *self, PyObject *args, PyObject *kwargs)
{
char *procname = NULL, *sql = NULL;
long int async = 0;
Py_ssize_t i, nparameters = 0, sl = 0;
Py_ssize_t procname_len, i, nparameters = 0, sl = 0;
PyObject *parameters = NULL;
PyObject *operation = NULL;
PyObject *res = NULL;
if (!PyArg_ParseTuple(args, "s|Ol", &procname, &parameters, &async)) {
return NULL;
}
if (!PyArg_ParseTuple(args, "s#|Ol",
&procname, &procname_len, &parameters, &async
))
{ return NULL; }
EXC_IF_CURS_CLOSED(self);
@ -925,7 +926,7 @@ psyco_curs_callproc(cursorObject *self, PyObject *args, PyObject *kwargs)
}
/* allocate some memory, build the SQL and create a PyString from it */
sl = strlen(procname) + 17 + nparameters*3 - (nparameters ? 1 : 0);
sl = procname_len + 17 + nparameters*3 - (nparameters ? 1 : 0);
sql = (char*)PyMem_Malloc(sl);
if (sql == NULL) return NULL;
@ -1121,7 +1122,7 @@ psyco_curs_copy_from(cursorObject *self, PyObject *args, PyObject *kwargs)
if (columns != NULL && columns != Py_None) {
PyObject* collistiter = PyObject_GetIter(columns);
PyObject* col;
int collistlen = 2;
Py_ssize_t collistlen = 2;
Py_ssize_t colitemlen;
char* colname;
if (collistiter == NULL) {

View File

@ -113,14 +113,14 @@ pq_raise(connectionObject *conn, cursorObject *curs, PyObject *exc, char *msg)
/* if msg is not NULL, add it to the error message, after a '\n' */
if (msg && code) {
int len = strlen(code) + strlen(err) + strlen(msg) + 5;
size_t len = strlen(code) + strlen(err) + strlen(msg) + 5;
if ((buf = PyMem_Malloc(len))) {
snprintf(buf, len, "[%s] %s\n%s", code, err2, msg);
psyco_set_error(exc, pgc, buf, err, code);
}
}
else if (msg) {
int len = strlen(err) + strlen(msg) + 2;
size_t len = strlen(err) + strlen(msg) + 2;
if ((buf = PyMem_Malloc(len))) {
snprintf(buf, len, "%s\n%s", err2, msg);
psyco_set_error(exc, pgc, buf, err, code);
@ -607,11 +607,14 @@ _pq_copy_in_v3(cursorObject *curs)
if (!o || !PyString_Check(o) || (length = PyString_Size(o)) == -1) {
error = 1;
}
if (length == 0 || error == 1) break;
if (length == 0 || length > INT_MAX || error == 1) break;
Py_BEGIN_ALLOW_THREADS;
if (PQputCopyData(curs->conn->pgconn,
PyString_AS_STRING(o), length) == -1) {
PyString_AS_STRING(o),
/* Py_ssize_t->int cast was validated above: */
(int) length
) == -1) {
error = 2;
}
Py_END_ALLOW_THREADS;

View File

@ -89,8 +89,8 @@ PyObject *decimalType = NULL;
":return: New database connection\n" \
":rtype: `extensions.connection`"
static int
_psyco_connect_fill_dsn(char *dsn, char *kw, char *v, int i)
static size_t
_psyco_connect_fill_dsn(char *dsn, char *kw, char *v, size_t i)
{
strcpy(&dsn[i], kw); i += strlen(kw);
strcpy(&dsn[i], v); i += strlen(v);
@ -129,7 +129,8 @@ psyco_connect(PyObject *self, PyObject *args, PyObject *keywds)
PyObject *conn = NULL, *factory = NULL;
PyObject *pyport = NULL;
int idsn=-1, iport=-1;
size_t idsn=-1;
int iport=-1;
char *dsn_static=NULL, *dsn_dynamic=NULL;
char *database=NULL, *user=NULL, *password=NULL;
char *host=NULL, *sslmode=NULL;
@ -165,7 +166,7 @@ psyco_connect(PyObject *self, PyObject *args, PyObject *keywds)
PyOS_snprintf(port, 16, "%d", iport);
if (dsn_static == NULL) {
int l = 45; /* len("dbname= user= password= host= port= sslmode=\0") */
size_t l = 45; /* len("dbname= user= password= host= port= sslmode=\0") */
if (database) l += strlen(database);
if (host) l += strlen(host);

View File

@ -40,7 +40,7 @@ skip_until_space(char *s)
}
static char *
skip_until_space2(char *s, int *len)
skip_until_space2(char *s, Py_ssize_t *len)
{
while (*len > 0 && *s && *s != ' ') {
s++; (*len)--;
@ -49,12 +49,13 @@ skip_until_space2(char *s, int *len)
}
static int
typecast_parse_date(char* s, char** t, int* len,
typecast_parse_date(char* s, char** t, Py_ssize_t* len,
int* year, int* month, int* day)
{
int acc = -1, cz = 0;
Dprintf("typecast_parse_date: len = %d, s = %s", *len, s);
Dprintf("typecast_parse_date: len = " FORMAT_CODE_PY_SSIZE_T ", s = %s",
*len, s);
while (cz < 3 && *len > 0 && *s) {
switch (*s) {
@ -84,7 +85,7 @@ typecast_parse_date(char* s, char** t, int* len,
}
static int
typecast_parse_time(char* s, char** t, int* len,
typecast_parse_time(char* s, char** t, Py_ssize_t* len,
int* hh, int* mm, int* ss, int* us, int* tz)
{
int acc = -1, cz = 0;
@ -94,7 +95,8 @@ typecast_parse_time(char* s, char** t, int* len,
/* sets microseconds and timezone to 0 because they may be missing */
*us = *tz = 0;
Dprintf("typecast_parse_time: len = %d, s = %s", *len, s);
Dprintf("typecast_parse_time: len = " FORMAT_CODE_PY_SSIZE_T ", s = %s",
*len, s);
while (cz < 6 && *len > 0 && *s) {
switch (*s) {
@ -140,8 +142,8 @@ typecast_parse_time(char* s, char** t, int* len,
*tz = tzs * tzhh*60 + tzmm;
if (*us != 0.0) {
while (usd++ < 6) *us *= 10.0;
if (*us != 0) {
while (usd++ < 6) *us *= 10;
}
return cz;

View File

@ -30,7 +30,7 @@ extern "C" {
#endif
/* type of type-casting functions (both C and Python) */
typedef PyObject *(*typecast_function)(char *, int len, PyObject *);
typedef PyObject *(*typecast_function)(char *, Py_ssize_t len, PyObject *);
/** typecast type **/

View File

@ -24,9 +24,9 @@
/** typecast_array_cleanup - remove the horrible [...]= stuff **/
static int
typecast_array_cleanup(char **str, int *len)
typecast_array_cleanup(char **str, Py_ssize_t *len)
{
int i, depth = 1;
Py_ssize_t i, depth = 1;
if ((*str)[0] != '[') return -1;
@ -53,13 +53,16 @@ typecast_array_cleanup(char **str, int *len)
#define ASCAN_QUOTED 4
static int
typecast_array_tokenize(char *str, int strlength,
int *pos, char** token, int *length, int *quotes)
typecast_array_tokenize(char *str, Py_ssize_t strlength,
Py_ssize_t *pos, char** token,
Py_ssize_t *length, int *quotes)
{
/* FORTRAN glory */
int i, j, q, b, l, res;
Py_ssize_t i, l;
int q, b, res;
Dprintf("typecast_array_tokenize: '%s', %d/%d",
Dprintf("typecast_array_tokenize: '%s', "
FORMAT_CODE_PY_SSIZE_T "/" FORMAT_CODE_PY_SSIZE_T,
&str[*pos], *pos, strlength);
/* we always get called with pos pointing at the start of a token, so a
@ -122,10 +125,11 @@ typecast_array_tokenize(char *str, int strlength,
if (str[*pos] == '"') {
*pos += 1;
l -= 2;
*quotes = 1;
*quotes = 1;
}
if (res == ASCAN_QUOTED) {
Py_ssize_t j;
char *buffer = PyMem_Malloc(l+1);
if (buffer == NULL) return ASCAN_ERROR;
@ -138,7 +142,10 @@ typecast_array_tokenize(char *str, int strlength,
}
*buffer = '\0';
*length = buffer - *token;
/* The variable that was used to indicate the size of buffer is of type
* Py_ssize_t, so a subsegment of buffer couldn't possibly exceed
* PY_SSIZE_T_MAX: */
*length = (Py_ssize_t) (buffer - *token);
}
else {
*token = &str[*pos];
@ -154,31 +161,35 @@ typecast_array_tokenize(char *str, int strlength,
}
static int
typecast_array_scan(char *str, int strlength,
typecast_array_scan(char *str, Py_ssize_t strlength,
PyObject *curs, PyObject *base, PyObject *array)
{
int state, quotes, length = 0, pos = 0;
int state, quotes;
Py_ssize_t length = 0, pos = 0;
char *token;
PyObject *stack[MAX_DIMENSIONS];
int stack_index = 0;
size_t stack_index = 0;
while (1) {
token = NULL;
state = typecast_array_tokenize(str, strlength,
&pos, &token, &length, &quotes);
Dprintf("typecast_array_scan: state = %d, length = %d, token = '%s'",
Dprintf("typecast_array_scan: state = %d,"
" length = " FORMAT_CODE_PY_SSIZE_T ", token = '%s'",
state, length, token);
if (state == ASCAN_TOKEN || state == ASCAN_QUOTED) {
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
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);
@ -224,12 +235,13 @@ typecast_array_scan(char *str, int strlength,
have to be taken on the single items **/
static PyObject *
typecast_GENERIC_ARRAY_cast(char *str, int len, PyObject *curs)
typecast_GENERIC_ARRAY_cast(char *str, Py_ssize_t len, PyObject *curs)
{
PyObject *obj = NULL;
PyObject *base = ((typecastObject*)((cursorObject*)curs)->caster)->bcast;
Dprintf("typecast_GENERIC_ARRAY_cast: str = '%s', len = %d", str, len);
Dprintf("typecast_GENERIC_ARRAY_cast: str = '%s',"
" len = " FORMAT_CODE_PY_SSIZE_T, str, len);
if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
if (str[0] == '[')
@ -239,7 +251,8 @@ typecast_GENERIC_ARRAY_cast(char *str, int len, PyObject *curs)
return NULL;
}
Dprintf("typecast_GENERIC_ARRAY_cast: str = '%s', len = %d", str, len);
Dprintf("typecast_GENERIC_ARRAY_cast: str = '%s',"
" len = " FORMAT_CODE_PY_SSIZE_T, str, len);
obj = PyList_New(0);

View File

@ -22,13 +22,13 @@
/** INTEGER - cast normal integers (4 bytes) to python int **/
static PyObject *
typecast_INTEGER_cast(char *s, int len, PyObject *curs)
typecast_INTEGER_cast(char *s, Py_ssize_t len, PyObject *curs)
{
char buffer[12];
if (s == NULL) {Py_INCREF(Py_None); return Py_None;}
if (s[len] != '\0') {
strncpy(buffer, s, len); buffer[len] = '\0';
strncpy(buffer, s, (size_t) len); buffer[len] = '\0';
s = buffer;
}
return PyInt_FromString(s, NULL, 0);
@ -37,13 +37,13 @@ typecast_INTEGER_cast(char *s, int len, PyObject *curs)
/** LONGINTEGER - cast long integers (8 bytes) to python long **/
static PyObject *
typecast_LONGINTEGER_cast(char *s, int len, PyObject *curs)
typecast_LONGINTEGER_cast(char *s, Py_ssize_t len, PyObject *curs)
{
char buffer[24];
if (s == NULL) {Py_INCREF(Py_None); return Py_None;}
if (s[len] != '\0') {
strncpy(buffer, s, len); buffer[len] = '\0';
strncpy(buffer, s, (size_t) len); buffer[len] = '\0';
s = buffer;
}
return PyLong_FromString(s, NULL, 0);
@ -52,11 +52,11 @@ typecast_LONGINTEGER_cast(char *s, int len, PyObject *curs)
/** FLOAT - cast floating point numbers to python float **/
static PyObject *
typecast_FLOAT_cast(char *s, int len, PyObject *curs)
typecast_FLOAT_cast(char *s, Py_ssize_t len, PyObject *curs)
{
PyObject *str = NULL, *flo = NULL;
char *pend;
if (s == NULL) {Py_INCREF(Py_None); return Py_None;}
str = PyString_FromStringAndSize(s, len);
flo = PyFloat_FromString(str, &pend);
@ -67,7 +67,7 @@ typecast_FLOAT_cast(char *s, int len, PyObject *curs)
/** STRING - cast strings of any type to python string **/
static PyObject *
typecast_STRING_cast(char *s, int len, PyObject *curs)
typecast_STRING_cast(char *s, Py_ssize_t len, PyObject *curs)
{
if (s == NULL) {Py_INCREF(Py_None); return Py_None;}
return PyString_FromStringAndSize(s, len);
@ -76,7 +76,7 @@ typecast_STRING_cast(char *s, int len, PyObject *curs)
/** UNICODE - cast strings of any type to a python unicode object **/
static PyObject *
typecast_UNICODE_cast(char *s, int len, PyObject *curs)
typecast_UNICODE_cast(char *s, Py_ssize_t len, PyObject *curs)
{
PyObject *enc;
@ -91,14 +91,14 @@ typecast_UNICODE_cast(char *s, int len, PyObject *curs)
PyErr_Format(InterfaceError,
"can't decode into unicode string from %s",
((cursorObject*)curs)->conn->encoding);
return NULL;
return NULL;
}
}
/** BOOLEAN - cast boolean value into right python object **/
static PyObject *
typecast_BOOLEAN_cast(char *s, int len, PyObject *curs)
typecast_BOOLEAN_cast(char *s, Py_ssize_t len, PyObject *curs)
{
PyObject *res;
@ -117,16 +117,16 @@ typecast_BOOLEAN_cast(char *s, int len, PyObject *curs)
#ifdef HAVE_DECIMAL
static PyObject *
typecast_DECIMAL_cast(char *s, int len, PyObject *curs)
typecast_DECIMAL_cast(char *s, Py_ssize_t len, PyObject *curs)
{
PyObject *res = NULL;
char *buffer;
if (s == NULL) {Py_INCREF(Py_None); return Py_None;}
if ((buffer = PyMem_Malloc(len+1)) == NULL)
PyErr_NoMemory();
strncpy(buffer, s, len); buffer[len] = '\0';
strncpy(buffer, s, (size_t) len); buffer[len] = '\0';
res = PyObject_CallFunction(decimalType, "s", buffer);
PyMem_Free(buffer);
@ -135,7 +135,7 @@ typecast_DECIMAL_cast(char *s, int len, PyObject *curs)
#else
#define typecast_DECIMAL_cast typecast_FLOAT_cast
#endif
/* some needed aliases */
#define typecast_NUMBER_cast typecast_FLOAT_cast
#define typecast_ROWID_cast typecast_INTEGER_cast

View File

@ -34,7 +34,7 @@ extern PyObject *pyDeltaTypeP;
/** DATE - cast a date into a date python object **/
static PyObject *
typecast_PYDATE_cast(char *str, int len, PyObject *curs)
typecast_PYDATE_cast(char *str, Py_ssize_t len, PyObject *curs)
{
PyObject* obj = NULL;
int n, y=0, m=0, d=0;
@ -53,7 +53,8 @@ typecast_PYDATE_cast(char *str, int len, PyObject *curs)
else {
n = typecast_parse_date(str, NULL, &len, &y, &m, &d);
Dprintf("typecast_PYDATE_cast: "
"n = %d, len = %d, y = %d, m = %d, d = %d",
"n = %d, len = " FORMAT_CODE_PY_SSIZE_T ", "
"y = %d, m = %d, d = %d",
n, len, y, m, d);
if (n != 3) {
PyErr_SetString(DataError, "unable to parse date");
@ -69,7 +70,7 @@ typecast_PYDATE_cast(char *str, int len, PyObject *curs)
/** DATETIME - cast a timestamp into a datetime python object **/
static PyObject *
typecast_PYDATETIME_cast(char *str, int len, PyObject *curs)
typecast_PYDATETIME_cast(char *str, Py_ssize_t len, PyObject *curs)
{
PyObject* obj = NULL;
int n, y=0, m=0, d=0;
@ -92,7 +93,8 @@ typecast_PYDATETIME_cast(char *str, int len, PyObject *curs)
Dprintf("typecast_PYDATETIME_cast: s = %s", str);
n = typecast_parse_date(str, &tp, &len, &y, &m, &d);
Dprintf("typecast_PYDATE_cast: tp = %p "
"n = %d, len = %d, y = %d, m = %d, d = %d",
"n = %d, len = " FORMAT_CODE_PY_SSIZE_T ","
" y = %d, m = %d, d = %d",
tp, n, len, y, m, d);
if (n != 3) {
PyErr_SetString(DataError, "unable to parse date");
@ -100,8 +102,9 @@ typecast_PYDATETIME_cast(char *str, int len, PyObject *curs)
if (len > 0) {
n = typecast_parse_time(tp, NULL, &len, &hh, &mm, &ss, &us, &tz);
Dprintf("typecast_PYDATETIME_cast: n = %d, len = %d, "
"hh = %d, mm = %d, ss = %d, us = %d, tz = %d",
Dprintf("typecast_PYDATETIME_cast: n = %d,"
" len = " FORMAT_CODE_PY_SSIZE_T ","
" hh = %d, mm = %d, ss = %d, us = %d, tz = %d",
n, len, hh, mm, ss, us, tz);
if (n < 3 || n > 5) {
PyErr_SetString(DataError, "unable to parse time");
@ -141,7 +144,7 @@ typecast_PYDATETIME_cast(char *str, int len, PyObject *curs)
/** TIME - parse time into a time object **/
static PyObject *
typecast_PYTIME_cast(char *str, int len, PyObject *curs)
typecast_PYTIME_cast(char *str, Py_ssize_t len, PyObject *curs)
{
PyObject* obj = NULL;
int n, hh=0, mm=0, ss=0, us=0, tz=0;
@ -149,7 +152,7 @@ typecast_PYTIME_cast(char *str, int len, PyObject *curs)
if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
n = typecast_parse_time(str, NULL, &len, &hh, &mm, &ss, &us, &tz);
Dprintf("typecast_PYTIME_cast: n = %d, len = %d, "
Dprintf("typecast_PYTIME_cast: n = %d, len = " FORMAT_CODE_PY_SSIZE_T ", "
"hh = %d, mm = %d, ss = %d, us = %d, tz = %d",
n, len, hh, mm, ss, us, tz);
@ -169,7 +172,7 @@ typecast_PYTIME_cast(char *str, int len, PyObject *curs)
/** INTERVAL - parse an interval into a timedelta object **/
static PyObject *
typecast_PYINTERVAL_cast(char *str, int len, PyObject *curs)
typecast_PYINTERVAL_cast(char *str, Py_ssize_t len, PyObject *curs)
{
long years = 0, months = 0, days = 0;
double hours = 0.0, minutes = 0.0, seconds = 0.0, hundredths = 0.0;

View File

@ -28,16 +28,16 @@ extern mxDateTimeModule_APIObject *mxDateTimeP;
/** DATE - cast a date into mx.DateTime python object **/
static PyObject *
typecast_MXDATE_cast(char *str, int len, PyObject *curs)
typecast_MXDATE_cast(char *str, Py_ssize_t len, PyObject *curs)
{
int n, y=0, m=0, d=0;
int hh=0, mm=0, ss=0, us=0, tz=0;
char *tp = NULL;
if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
Dprintf("typecast_MXDATE_cast: s = %s", str);
/* check for infinity */
if (!strcmp(str, "infinity") || !strcmp(str, "-infinity")) {
if (str[0] == '-') {
@ -47,24 +47,26 @@ typecast_MXDATE_cast(char *str, int len, PyObject *curs)
return mxDateTimeP->DateTime_FromDateAndTime(999999,12,31, 0,0,0);
}
}
n = typecast_parse_date(str, &tp, &len, &y, &m, &d);
Dprintf("typecast_MXDATE_cast: tp = %p n = %d, len = %d, "
"y = %d, m = %d, d = %d", tp, n, len, y, m, d);
Dprintf("typecast_MXDATE_cast: tp = %p n = %d,"
" len = " FORMAT_CODE_PY_SSIZE_T ","
" y = %d, m = %d, d = %d", tp, n, len, y, m, d);
if (n != 3) {
PyErr_SetString(DataError, "unable to parse date");
}
if (len > 0) {
n = typecast_parse_time(tp, NULL, &len, &hh, &mm, &ss, &us, &tz);
Dprintf("typecast_MXDATE_cast: n = %d, len = %d, "
"hh = %d, mm = %d, ss = %d, us = %d, tz = %d",
Dprintf("typecast_MXDATE_cast: n = %d,"
" len = " FORMAT_CODE_PY_SSIZE_T ","
" hh = %d, mm = %d, ss = %d, us = %d, tz = %d",
n, len, hh, mm, ss, us, tz);
if (n < 3 || n > 5) {
PyErr_SetString(DataError, "unable to parse time");
}
}
}
Dprintf("typecast_MXDATE_cast: fractionary seconds: %lf",
(double)ss + (double)us/(double)1000000.0);
return mxDateTimeP->DateTime_FromDateAndTime(y, m, d, hh, mm,
@ -74,19 +76,19 @@ typecast_MXDATE_cast(char *str, int len, PyObject *curs)
/** TIME - parse time into an mx.DateTime object **/
static PyObject *
typecast_MXTIME_cast(char *str, int len, PyObject *curs)
typecast_MXTIME_cast(char *str, Py_ssize_t len, PyObject *curs)
{
int n, hh=0, mm=0, ss=0, us=0, tz=0;
if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
Dprintf("typecast_MXTIME_cast: s = %s", str);
n = typecast_parse_time(str, NULL, &len, &hh, &mm, &ss, &us, &tz);
Dprintf("typecast_MXTIME_cast: time parsed, %d components", n);
Dprintf("typecast_MXTIME_cast: hh = %d, mm = %d, ss = %d, us = %d",
hh, mm, ss, us);
if (n < 3 || n > 5) {
PyErr_SetString(DataError, "unable to parse time");
return NULL;
@ -101,7 +103,7 @@ typecast_MXTIME_cast(char *str, int len, PyObject *curs)
/** INTERVAL - parse an interval into an mx.DateTimeDelta **/
static PyObject *
typecast_MXINTERVAL_cast(char *str, int len, PyObject *curs)
typecast_MXINTERVAL_cast(char *str, Py_ssize_t len, PyObject *curs)
{
long years = 0, months = 0, days = 0, denominator = 1;
double hours = 0.0, minutes = 0.0, seconds = 0.0, hundredths = 0.0;
@ -109,9 +111,9 @@ typecast_MXINTERVAL_cast(char *str, int len, PyObject *curs)
int part = 0;
if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
Dprintf("typecast_MXINTERVAL_cast: s = %s", str);
while (*str) {
switch (*str) {
@ -179,12 +181,12 @@ typecast_MXINTERVAL_cast(char *str, int len, PyObject *curs)
Dprintf("typecast_MXINTERVAL_cast: seconds = %f", seconds);
v = 0.0; part = 6;
}
break;
break;
default:
break;
}
str++;
}
@ -203,7 +205,7 @@ typecast_MXINTERVAL_cast(char *str, int len, PyObject *curs)
hundredths = hundredths/denominator;
Dprintf("typecast_MXINTERVAL_cast: fractions = %.20f", hundredths);
}
/* calculates seconds */
if (sign < 0.0) {
seconds = - (hundredths + seconds + minutes*60 + hours*3600);
@ -214,7 +216,7 @@ typecast_MXINTERVAL_cast(char *str, int len, PyObject *curs)
/* calculates days */
days += years*365 + months*30;
Dprintf("typecast_MXINTERVAL_cast: days = %ld, seconds = %f",
days, seconds);
return mxDateTimeP->DateTimeDelta_FromDaysAndSeconds(days, seconds);
@ -222,7 +224,7 @@ typecast_MXINTERVAL_cast(char *str, int len, PyObject *curs)
/* psycopg defaults to using mx types */
#ifdef PSYCOPG_DEFAULT_MXDATETIME
#ifdef PSYCOPG_DEFAULT_MXDATETIME
#define typecast_DATE_cast typecast_MXDATE_cast
#define typecast_TIME_cast typecast_MXTIME_cast
#define typecast_INTERVAL_cast typecast_MXINTERVAL_cast