diff MySQLdb/converters.py @ 84:566baac88764 MySQLdb

Ensure NULLs are returned as None by default. Return bad time values unchanged instead of None.
author Andy Dustman <adustman@users.sourceforge.net>
date Wed, 07 Sep 2011 20:59:54 -0400
parents ffe9e5ca17e0
children
line wrap: on
line diff
--- a/MySQLdb/converters.py	Tue Aug 31 22:28:13 2010 -0400
+++ b/MySQLdb/converters.py	Wed Sep 07 20:59:54 2011 -0400
@@ -9,8 +9,8 @@
 from _mysql import NULL
 from MySQLdb.constants import FIELD_TYPE, FLAG
 from MySQLdb.times import datetime_to_sql, timedelta_to_sql, \
-     timedelta_or_None, datetime_or_None, date_or_None, \
-     mysql_timestamp_converter
+     timedelta_or_orig, datetime_or_orig, date_or_orig, \
+     timestamp_or_orig
 from types import InstanceType
 import array
 import datetime
@@ -45,6 +45,24 @@
     """Convert None to NULL."""
     return NULL # duh
 
+def None_if_NULL(func):
+    if func is None: return func
+    def _None_if_NULL(value):
+        if value is None: return value
+        return func(value)
+    _None_if_NULL.__name__ = func.__name__+"_or_None_if_NULL"
+    return _None_if_NULL
+
+
+int_or_None_if_NULL = None_if_NULL(int)
+float_or_None_if_NULL = None_if_NULL(float)
+Decimal_or_None_if_NULL = None_if_NULL(Decimal)
+SET_to_Set_or_None_if_NULL = None_if_NULL(SET_to_Set)
+timestamp_or_None_if_NULL = None_if_NULL(timestamp_or_orig)
+datetime_or_None_if_NULL = None_if_NULL(datetime_or_orig)
+date_or_None_if_NULL = None_if_NULL(date_or_orig)
+timedelta_or_None_if_NULL = None_if_NULL(timedelta_or_orig)
+
 def object_to_quoted_sql(connection, obj):
     """Convert something into a SQL string literal."""
     if hasattr(obj, "__unicode__"):
@@ -89,21 +107,21 @@
 # character sets, etc.). This should always be used as the last
 # resort.
 simple_field_decoders = {
-    FIELD_TYPE.TINY: int,
-    FIELD_TYPE.SHORT: int,
-    FIELD_TYPE.LONG: int,
-    FIELD_TYPE.FLOAT: float,
-    FIELD_TYPE.DOUBLE: float,
-    FIELD_TYPE.DECIMAL: Decimal,
-    FIELD_TYPE.NEWDECIMAL: Decimal,
-    FIELD_TYPE.LONGLONG: int,
-    FIELD_TYPE.INT24: int,
-    FIELD_TYPE.YEAR: int,
-    FIELD_TYPE.SET: SET_to_Set,
-    FIELD_TYPE.TIMESTAMP: mysql_timestamp_converter,
-    FIELD_TYPE.DATETIME: datetime_or_None,
-    FIELD_TYPE.TIME: timedelta_or_None,
-    FIELD_TYPE.DATE: date_or_None,   
+    FIELD_TYPE.TINY: int_or_None_if_NULL,
+    FIELD_TYPE.SHORT: int_or_None_if_NULL,
+    FIELD_TYPE.LONG: int_or_None_if_NULL,
+    FIELD_TYPE.FLOAT: float_or_None_if_NULL,
+    FIELD_TYPE.DOUBLE: float_or_None_if_NULL,
+    FIELD_TYPE.DECIMAL: Decimal_or_None_if_NULL,
+    FIELD_TYPE.NEWDECIMAL: Decimal_or_None_if_NULL,
+    FIELD_TYPE.LONGLONG: int_or_None_if_NULL,
+    FIELD_TYPE.INT24: int_or_None_if_NULL,
+    FIELD_TYPE.YEAR: int_or_None_if_NULL,
+    FIELD_TYPE.SET: SET_to_Set_or_None_if_NULL,
+    FIELD_TYPE.TIMESTAMP: timestamp_or_None_if_NULL,
+    FIELD_TYPE.DATETIME: datetime_or_None_if_NULL,
+    FIELD_TYPE.TIME: timedelta_or_None_if_NULL,
+    FIELD_TYPE.DATE: date_or_None_if_NULL,
 }
 
 # Decoder protocol