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/processors.py | |
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/processors.py')
-rw-r--r-- | lib/sqlalchemy/processors.py | 59 |
1 files changed, 34 insertions, 25 deletions
diff --git a/lib/sqlalchemy/processors.py b/lib/sqlalchemy/processors.py index dd789a44e..c4bac2834 100644 --- a/lib/sqlalchemy/processors.py +++ b/lib/sqlalchemy/processors.py @@ -24,9 +24,14 @@ def str_to_datetime_processor_factory(regexp, type_): if value is None: return None else: - m = rmatch(value) + try: + m = rmatch(value) + except TypeError: + raise ValueError("Couldn't parse %s string '%r' " + "- value is not a string." % (type_.__name__ , value)) if m is None: - raise ValueError("Couldn't parse %s string." % type_.__name__) + raise ValueError("Couldn't parse %s string: " + "'%s'" % (type_.__name__ , value)) return type_(*map(int, m.groups(0))) return process @@ -36,29 +41,7 @@ def boolean_to_int(value): else: return int(value) -try: - from sqlalchemy.cprocessors import UnicodeResultProcessor, \ - DecimalResultProcessor, \ - to_float, to_str, int_to_boolean, \ - str_to_datetime, str_to_time, \ - str_to_date - - def to_unicode_processor_factory(encoding, errors=None): - # this is cumbersome but it would be even more so on the C side - if errors is not None: - return UnicodeResultProcessor(encoding, errors).process - else: - return UnicodeResultProcessor(encoding).process - - def to_decimal_processor_factory(target_class, scale=10): - # Note that the scale argument is not taken into account for integer - # values in the C implementation while it is in the Python one. - # For example, the Python implementation might return - # Decimal('5.00000') whereas the C implementation will - # return Decimal('5'). These are equivalent of course. - return DecimalResultProcessor(target_class, "%%.%df" % scale).process - -except ImportError: +def py_fallback(): def to_unicode_processor_factory(encoding, errors=None): decoder = codecs.getdecoder(encoding) @@ -109,4 +92,30 @@ except ImportError: datetime.datetime) str_to_time = str_to_datetime_processor_factory(TIME_RE, datetime.time) str_to_date = str_to_datetime_processor_factory(DATE_RE, datetime.date) + return locals() + +try: + from sqlalchemy.cprocessors import UnicodeResultProcessor, \ + DecimalResultProcessor, \ + to_float, to_str, int_to_boolean, \ + str_to_datetime, str_to_time, \ + str_to_date + + def to_unicode_processor_factory(encoding, errors=None): + # this is cumbersome but it would be even more so on the C side + if errors is not None: + return UnicodeResultProcessor(encoding, errors).process + else: + return UnicodeResultProcessor(encoding).process + + def to_decimal_processor_factory(target_class, scale=10): + # Note that the scale argument is not taken into account for integer + # values in the C implementation while it is in the Python one. + # For example, the Python implementation might return + # Decimal('5.00000') whereas the C implementation will + # return Decimal('5'). These are equivalent of course. + return DecimalResultProcessor(target_class, "%%.%df" % scale).process + +except ImportError: + globals().update(py_fallback()) |