diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-01-22 12:11:13 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-01-22 12:11:13 -0500 |
| commit | 959d7cbe33ee2e39e2a43b6e7a9c1a750664d569 (patch) | |
| tree | a0d8465cb0bbda66197114445e476b631fa00afc /lib/sqlalchemy/cextension | |
| parent | 8c05a3bf6599f92bbf8d2246123597e8966f3a52 (diff) | |
| download | sqlalchemy-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.c | 51 |
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, µsecond) < 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, µsecond) < 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); |
