summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/processors.py
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/processors.py
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/processors.py')
-rw-r--r--lib/sqlalchemy/processors.py59
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())