summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/cextension
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-01-22 12:11:13 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2012-01-22 12:11:13 -0500
commit959d7cbe33ee2e39e2a43b6e7a9c1a750664d569 (patch)
treea0d8465cb0bbda66197114445e476b631fa00afc /lib/sqlalchemy/cextension
parent8c05a3bf6599f92bbf8d2246123597e8966f3a52 (diff)
downloadsqlalchemy-959d7cbe33ee2e39e2a43b6e7a9c1a750664d569.tar.gz
- [bug] Improved error messages when a non-string
or invalid string is passed to any of the date/time processors used by SQLite, including C and Python versions. [ticket:2382] - changed the import model of processors.py so that we can get at the pure python versions and C versions simultaneously in tests.
Diffstat (limited to 'lib/sqlalchemy/cextension')
-rw-r--r--lib/sqlalchemy/cextension/processors.c51
1 files changed, 45 insertions, 6 deletions
diff --git a/lib/sqlalchemy/cextension/processors.c b/lib/sqlalchemy/cextension/processors.c
index 36745c817..68758afc8 100644
--- a/lib/sqlalchemy/cextension/processors.c
+++ b/lib/sqlalchemy/cextension/processors.c
@@ -66,13 +66,21 @@ str_to_datetime(PyObject *self, PyObject *arg)
{
const char *str;
unsigned int year, month, day, hour, minute, second, microsecond = 0;
+ PyObject *err_repr;
if (arg == Py_None)
Py_RETURN_NONE;
str = PyString_AsString(arg);
- if (str == NULL)
+ if (str == NULL) {
+ err_repr = PyObject_Repr(arg);
+ PyErr_Format(
+ PyExc_ValueError,
+ "Couldn't parse datetime string '%s' - value is not a string.",
+ PyString_AsString(err_repr));
+ Py_DECREF(err_repr);
return NULL;
+ }
/* microseconds are optional */
/*
@@ -82,7 +90,12 @@ str_to_datetime(PyObject *self, PyObject *arg)
*/
if (sscanf(str, "%4u-%2u-%2u %2u:%2u:%2u.%6u", &year, &month, &day,
&hour, &minute, &second, &microsecond) < 6) {
- PyErr_SetString(PyExc_ValueError, "Couldn't parse datetime string.");
+ err_repr = PyObject_Repr(arg);
+ PyErr_Format(
+ PyExc_ValueError,
+ "Couldn't parse datetime string: %s",
+ PyString_AsString(err_repr));
+ Py_DECREF(err_repr);
return NULL;
}
return PyDateTime_FromDateAndTime(year, month, day,
@@ -94,13 +107,21 @@ str_to_time(PyObject *self, PyObject *arg)
{
const char *str;
unsigned int hour, minute, second, microsecond = 0;
+ PyObject *err_repr;
if (arg == Py_None)
Py_RETURN_NONE;
str = PyString_AsString(arg);
- if (str == NULL)
+ if (str == NULL) {
+ err_repr = PyObject_Repr(arg);
+ PyErr_Format(
+ PyExc_ValueError,
+ "Couldn't parse time string '%s' - value is not a string.",
+ PyString_AsString(err_repr));
+ Py_DECREF(err_repr);
return NULL;
+ }
/* microseconds are optional */
/*
@@ -110,7 +131,12 @@ str_to_time(PyObject *self, PyObject *arg)
*/
if (sscanf(str, "%2u:%2u:%2u.%6u", &hour, &minute, &second,
&microsecond) < 3) {
- PyErr_SetString(PyExc_ValueError, "Couldn't parse time string.");
+ err_repr = PyObject_Repr(arg);
+ PyErr_Format(
+ PyExc_ValueError,
+ "Couldn't parse time string: %s",
+ PyString_AsString(err_repr));
+ Py_DECREF(err_repr);
return NULL;
}
return PyTime_FromTime(hour, minute, second, microsecond);
@@ -121,16 +147,29 @@ str_to_date(PyObject *self, PyObject *arg)
{
const char *str;
unsigned int year, month, day;
+ PyObject *err_repr;
if (arg == Py_None)
Py_RETURN_NONE;
str = PyString_AsString(arg);
- if (str == NULL)
+ if (str == NULL) {
+ err_repr = PyObject_Repr(arg);
+ PyErr_Format(
+ PyExc_ValueError,
+ "Couldn't parse date string '%s' - value is not a string.",
+ PyString_AsString(err_repr));
+ Py_DECREF(err_repr);
return NULL;
+ }
if (sscanf(str, "%4u-%2u-%2u", &year, &month, &day) != 3) {
- PyErr_SetString(PyExc_ValueError, "Couldn't parse date string.");
+ err_repr = PyObject_Repr(arg);
+ PyErr_Format(
+ PyExc_ValueError,
+ "Couldn't parse date string: %s",
+ PyString_AsString(err_repr));
+ Py_DECREF(err_repr);
return NULL;
}
return PyDate_FromDate(year, month, day);