summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/dialects/access/base.py6
-rw-r--r--lib/sqlalchemy/dialects/firebird/base.py2
-rw-r--r--lib/sqlalchemy/dialects/informix/base.py4
-rw-r--r--lib/sqlalchemy/dialects/maxdb/base.py10
-rw-r--r--lib/sqlalchemy/dialects/mssql/adodbapi.py2
-rw-r--r--lib/sqlalchemy/dialects/mssql/base.py8
-rw-r--r--lib/sqlalchemy/dialects/mysql/base.py8
-rw-r--r--lib/sqlalchemy/dialects/mysql/mysqldb.py2
-rw-r--r--lib/sqlalchemy/dialects/mysql/oursql.py4
-rw-r--r--lib/sqlalchemy/dialects/mysql/zxjdbc.py2
-rw-r--r--lib/sqlalchemy/dialects/oracle/base.py2
-rw-r--r--lib/sqlalchemy/dialects/oracle/cx_oracle.py25
-rw-r--r--lib/sqlalchemy/dialects/oracle/zxjdbc.py4
-rw-r--r--lib/sqlalchemy/dialects/postgresql/base.py4
-rw-r--r--lib/sqlalchemy/dialects/postgresql/pg8000.py49
-rw-r--r--lib/sqlalchemy/dialects/postgresql/psycopg2.py35
-rw-r--r--lib/sqlalchemy/dialects/postgresql/pypostgresql.py2
-rw-r--r--lib/sqlalchemy/dialects/sqlite/base.py8
-rw-r--r--lib/sqlalchemy/dialects/sybase/base.py2
-rw-r--r--lib/sqlalchemy/engine/base.py3
-rw-r--r--lib/sqlalchemy/types.py45
21 files changed, 139 insertions, 88 deletions
diff --git a/lib/sqlalchemy/dialects/access/base.py b/lib/sqlalchemy/dialects/access/base.py
index ed8297137..ee61190ff 100644
--- a/lib/sqlalchemy/dialects/access/base.py
+++ b/lib/sqlalchemy/dialects/access/base.py
@@ -18,7 +18,7 @@ from sqlalchemy.engine import default, base
class AcNumeric(types.Numeric):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
return None
def bind_processor(self, dialect):
@@ -86,7 +86,7 @@ class AcUnicode(types.Unicode):
def bind_processor(self, dialect):
return None
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
return None
class AcChar(types.CHAR):
@@ -101,7 +101,7 @@ class AcBoolean(types.Boolean):
def get_col_spec(self):
return "YESNO"
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
diff --git a/lib/sqlalchemy/dialects/firebird/base.py b/lib/sqlalchemy/dialects/firebird/base.py
index 921c70e98..21fec6b51 100644
--- a/lib/sqlalchemy/dialects/firebird/base.py
+++ b/lib/sqlalchemy/dialects/firebird/base.py
@@ -124,7 +124,7 @@ RESERVED_WORDS = set([
class _FBBoolean(sqltypes.Boolean):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
diff --git a/lib/sqlalchemy/dialects/informix/base.py b/lib/sqlalchemy/dialects/informix/base.py
index 5760488ae..6565a812f 100644
--- a/lib/sqlalchemy/dialects/informix/base.py
+++ b/lib/sqlalchemy/dialects/informix/base.py
@@ -41,7 +41,7 @@ class InfoTime(sqltypes.Time):
return value
return process
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if isinstance(value, datetime.datetime):
return value.time()
@@ -51,7 +51,7 @@ class InfoTime(sqltypes.Time):
class InfoBoolean(sqltypes.Boolean):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
diff --git a/lib/sqlalchemy/dialects/maxdb/base.py b/lib/sqlalchemy/dialects/maxdb/base.py
index d1c0191ed..d5f00dbdd 100644
--- a/lib/sqlalchemy/dialects/maxdb/base.py
+++ b/lib/sqlalchemy/dialects/maxdb/base.py
@@ -83,7 +83,7 @@ class _StringType(sqltypes.String):
return value
return process
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
while True:
if value is None:
@@ -169,7 +169,7 @@ class MaxTimestamp(sqltypes.DateTime):
dialect.datetimeformat,))
return process
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
@@ -209,7 +209,7 @@ class MaxDate(sqltypes.Date):
dialect.datetimeformat,))
return process
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
@@ -243,7 +243,7 @@ class MaxTime(sqltypes.Time):
dialect.datetimeformat,))
return process
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
@@ -270,7 +270,7 @@ class MaxBlob(sqltypes.Binary):
return str(value)
return process
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
diff --git a/lib/sqlalchemy/dialects/mssql/adodbapi.py b/lib/sqlalchemy/dialects/mssql/adodbapi.py
index 10b8b33b3..6ca1879d6 100644
--- a/lib/sqlalchemy/dialects/mssql/adodbapi.py
+++ b/lib/sqlalchemy/dialects/mssql/adodbapi.py
@@ -3,7 +3,7 @@ from sqlalchemy.dialects.mssql.base import MSDateTime, MSDialect
import sys
class MSDateTime_adodbapi(MSDateTime):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
# adodbapi will return datetimes with empty time values as datetime.date() objects.
# Promote them back to full datetime.datetime()
diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py
index 129125ca7..6c8937799 100644
--- a/lib/sqlalchemy/dialects/mssql/base.py
+++ b/lib/sqlalchemy/dialects/mssql/base.py
@@ -277,7 +277,7 @@ RESERVED_WORDS = set(
class _MSNumeric(sqltypes.Numeric):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if self.asdecimal:
def process(value):
if value is not None:
@@ -350,7 +350,7 @@ class _MSDate(sqltypes.Date):
return process
_reg = re.compile(r"(\d+)-(\d+)-(\d+)")
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if isinstance(value, datetime.datetime):
return value.date()
@@ -377,7 +377,7 @@ class TIME(sqltypes.TIME):
return process
_reg = re.compile(r"(\d+):(\d+):(\d+)(?:\.(\d+))?")
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if isinstance(value, datetime.datetime):
return value.time()
@@ -599,7 +599,7 @@ class BIT(sqltypes.TypeEngine):
__visit_name__ = 'BIT'
class _MSBoolean(sqltypes.Boolean):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py
index 36a042589..a9acc2a01 100644
--- a/lib/sqlalchemy/dialects/mysql/base.py
+++ b/lib/sqlalchemy/dialects/mysql/base.py
@@ -546,7 +546,7 @@ class BIT(sqltypes.TypeEngine):
"""
self.length = length
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
"""Convert a MySQL's 64 bit, variable length binary string to a long."""
def process(value):
if value is not None:
@@ -562,7 +562,7 @@ class _MSTime(sqltypes.Time):
__visit_name__ = 'TIME'
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
time = datetime.time
def process(value):
# convert from a timedelta value
@@ -1042,7 +1042,7 @@ class SET(_StringType):
length = max([len(v) for v in strip_values] + [0])
super(SET, self).__init__(length=length, **kw)
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
# The good news:
# No ',' quoting issues- commas aren't allowed in SET values
@@ -1085,7 +1085,7 @@ class _MSBoolean(sqltypes.Boolean):
__visit_name__ = 'BOOLEAN'
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
diff --git a/lib/sqlalchemy/dialects/mysql/mysqldb.py b/lib/sqlalchemy/dialects/mysql/mysqldb.py
index 49fa044a3..846de6580 100644
--- a/lib/sqlalchemy/dialects/mysql/mysqldb.py
+++ b/lib/sqlalchemy/dialects/mysql/mysqldb.py
@@ -48,7 +48,7 @@ class MySQL_mysqldbCompiler(MySQLCompiler):
class _DecimalType(_NumericType):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if self.asdecimal:
return
def process(value):
diff --git a/lib/sqlalchemy/dialects/mysql/oursql.py b/lib/sqlalchemy/dialects/mysql/oursql.py
index 37537483d..5558c1a19 100644
--- a/lib/sqlalchemy/dialects/mysql/oursql.py
+++ b/lib/sqlalchemy/dialects/mysql/oursql.py
@@ -36,7 +36,7 @@ class _PlainQuery(unicode):
class _oursqlNumeric(NUMERIC):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if self.asdecimal:
return
def process(value):
@@ -48,7 +48,7 @@ class _oursqlNumeric(NUMERIC):
class _oursqlBIT(BIT):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
"""oursql already converts mysql bits, so."""
return None
diff --git a/lib/sqlalchemy/dialects/mysql/zxjdbc.py b/lib/sqlalchemy/dialects/mysql/zxjdbc.py
index bf1267aed..dcb46789a 100644
--- a/lib/sqlalchemy/dialects/mysql/zxjdbc.py
+++ b/lib/sqlalchemy/dialects/mysql/zxjdbc.py
@@ -23,7 +23,7 @@ from sqlalchemy.connectors.zxJDBC import ZxJDBCConnector
from sqlalchemy.dialects.mysql.base import BIT, MySQLDialect, MySQLExecutionContext
class _ZxJDBCBit(BIT):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
"""Converts boolean or byte arrays from MySQL Connector/J to longs."""
def process(value):
if value is None:
diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py
index 22ba2ce93..d13e37d60 100644
--- a/lib/sqlalchemy/dialects/oracle/base.py
+++ b/lib/sqlalchemy/dialects/oracle/base.py
@@ -159,7 +159,7 @@ class _OracleBoolean(sqltypes.Boolean):
def get_dbapi_type(self, dbapi):
return dbapi.NUMBER
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
diff --git a/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/lib/sqlalchemy/dialects/oracle/cx_oracle.py
index eb5f2cb43..2db37a4fc 100644
--- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py
+++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py
@@ -84,7 +84,7 @@ class _OracleDate(sqltypes.Date):
def bind_processor(self, dialect):
return None
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if not isinstance(value, datetime):
return value
@@ -93,7 +93,7 @@ class _OracleDate(sqltypes.Date):
return process
class _OracleDateTime(sqltypes.DateTime):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None or isinstance(value, datetime):
return value
@@ -110,7 +110,7 @@ class _OracleDateTime(sqltypes.DateTime):
# only if cx_oracle contains TIMESTAMP
class _OracleTimestamp(sqltypes.TIMESTAMP):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None or isinstance(value, datetime):
return value
@@ -121,13 +121,13 @@ class _OracleTimestamp(sqltypes.TIMESTAMP):
return process
class _LOBMixin(object):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if not dialect.auto_convert_lobs:
# return the cx_oracle.LOB directly.
# don't even call super.result_processor here.
return None
- super_process = super(_LOBMixin, self).result_processor(dialect)
+ super_process = super(_LOBMixin, self).result_processor(dialect, coltype)
lob = dialect.dbapi.LOB
if super_process:
def process(value):
@@ -148,11 +148,11 @@ class _OracleChar(sqltypes.CHAR):
return dbapi.FIXED_CHAR
class _OracleNVarChar(sqltypes.NVARCHAR):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if dialect._cx_oracle_native_nvarchar:
return None
else:
- return sqltypes.NVARCHAR.result_processor(self, dialect)
+ return sqltypes.NVARCHAR.result_processor(self, dialect, coltype)
class _OracleText(_LOBMixin, sqltypes.Text):
def get_dbapi_type(self, dbapi):
@@ -163,7 +163,7 @@ class _OracleUnicodeText(_LOBMixin, sqltypes.UnicodeText):
return dbapi.NCLOB
class _OracleInteger(sqltypes.Integer):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def to_int(val):
if val is not None:
val = int(val)
@@ -259,11 +259,14 @@ class Oracle_cx_oracleExecutionContext(OracleExecutionContext):
for bind, name in self.compiled.bind_names.iteritems():
if name in self.out_parameters:
type = bind.type
- result_processor = type.dialect_impl(self.dialect).\
- result_processor(self.dialect)
+ impl_type = type.dialect_impl(self.dialect)
+ dbapi_type = impl_type.get_dbapi_type(self.dialect.dbapi)
+ result_processor = impl_type.\
+ result_processor(self.dialect,
+ dbapi_type)
if result_processor is not None:
out_parameters[name] = \
- result_processor(self.out_parameters[name].getvalue())
+ result_processor(self.out_parameters[name].getvalue(), dbapi_type)
else:
out_parameters[name] = self.out_parameters[name].getvalue()
else:
diff --git a/lib/sqlalchemy/dialects/oracle/zxjdbc.py b/lib/sqlalchemy/dialects/oracle/zxjdbc.py
index 6edef301c..42c43d369 100644
--- a/lib/sqlalchemy/dialects/oracle/zxjdbc.py
+++ b/lib/sqlalchemy/dialects/oracle/zxjdbc.py
@@ -20,7 +20,7 @@ SQLException = zxJDBC = None
class _ZxJDBCDate(sqltypes.Date):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
@@ -31,7 +31,7 @@ class _ZxJDBCDate(sqltypes.Date):
class _ZxJDBCNumeric(sqltypes.Numeric):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if self.asdecimal:
def process(value):
if isinstance(value, decimal.Decimal):
diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py
index 97108b3cb..9c6de3623 100644
--- a/lib/sqlalchemy/dialects/postgresql/base.py
+++ b/lib/sqlalchemy/dialects/postgresql/base.py
@@ -174,8 +174,8 @@ class ARRAY(sqltypes.MutableType, sqltypes.Concatenable, sqltypes.TypeEngine):
return [convert_item(item) for item in value]
return process
- def result_processor(self, dialect):
- item_proc = self.item_type.result_processor(dialect)
+ def result_processor(self, dialect, coltype):
+ item_proc = self.item_type.result_processor(dialect, coltype)
def process(value):
if value is None:
return value
diff --git a/lib/sqlalchemy/dialects/postgresql/pg8000.py b/lib/sqlalchemy/dialects/postgresql/pg8000.py
index 17fe86be6..e90bebb6b 100644
--- a/lib/sqlalchemy/dialects/postgresql/pg8000.py
+++ b/lib/sqlalchemy/dialects/postgresql/pg8000.py
@@ -21,25 +21,47 @@ Passing data from/to the Interval type is not supported as of yet.
"""
from sqlalchemy.engine import default
import decimal
-from sqlalchemy import util
+from sqlalchemy import util, exc
from sqlalchemy import types as sqltypes
-from sqlalchemy.dialects.postgresql.base import PGDialect, PGCompiler, PGIdentifierPreparer, PGExecutionContext
+from sqlalchemy.dialects.postgresql.base import PGDialect, \
+ PGCompiler, PGIdentifierPreparer, PGExecutionContext
class _PGNumeric(sqltypes.Numeric):
def bind_processor(self, dialect):
- return None
-
- def result_processor(self, dialect):
+ def process(value):
+ if value is not None:
+ return float(value)
+ else:
+ return value
+ return process
+
+ def result_processor(self, dialect, coltype):
if self.asdecimal:
- return None
+ if coltype in (700, 701):
+ def process(value):
+ if value is not None:
+ return decimal.Decimal(str(value))
+ else:
+ return value
+ return process
+ elif coltype == 1700:
+ # pg8000 returns Decimal natively for 1700
+ return None
+ else:
+ raise exc.InvalidRequestError("Unknown PG numeric type: %d" % coltype)
else:
- def process(value):
- if isinstance(value, decimal.Decimal):
- return float(value)
- else:
- return value
- return process
-
+ if coltype in (700, 701):
+ # pg8000 returns float natively for 701
+ return None
+ elif coltype == 1700:
+ def process(value):
+ if value is not None:
+ return float(value)
+ else:
+ return value
+ return process
+ else:
+ raise exc.InvalidRequestError("Unknown PG numeric type: %d" % coltype)
class PostgreSQL_pg8000ExecutionContext(PGExecutionContext):
pass
@@ -79,7 +101,6 @@ class PostgreSQL_pg8000(PGDialect):
PGDialect.colspecs,
{
sqltypes.Numeric : _PGNumeric,
- sqltypes.Float: sqltypes.Float, # prevents _PGNumeric from being used
}
)
diff --git a/lib/sqlalchemy/dialects/postgresql/psycopg2.py b/lib/sqlalchemy/dialects/postgresql/psycopg2.py
index aa4e07bb3..a46fdbddb 100644
--- a/lib/sqlalchemy/dialects/postgresql/psycopg2.py
+++ b/lib/sqlalchemy/dialects/postgresql/psycopg2.py
@@ -51,17 +51,33 @@ class _PGNumeric(sqltypes.Numeric):
def bind_processor(self, dialect):
return None
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if self.asdecimal:
- return None
+ if coltype in (700, 701):
+ def process(value):
+ if value is not None:
+ return decimal.Decimal(str(value))
+ else:
+ return value
+ return process
+ elif coltype == 1700:
+ # pg8000 returns Decimal natively for 1700
+ return None
+ else:
+ raise exc.InvalidRequestError("Unknown PG numeric type: %d" % coltype)
else:
- def process(value):
- if isinstance(value, decimal.Decimal):
- return float(value)
- else:
- return value
- return process
-
+ if coltype in (700, 701):
+ # pg8000 returns float natively for 701
+ return None
+ elif coltype == 1700:
+ def process(value):
+ if value is not None:
+ return float(value)
+ else:
+ return value
+ return process
+ else:
+ raise exc.InvalidRequestError("Unknown PG numeric type: %d" % coltype)
class _PGEnum(ENUM):
def __init__(self, *arg, **kw):
@@ -139,7 +155,6 @@ class PostgreSQL_psycopg2(PGDialect):
PGDialect.colspecs,
{
sqltypes.Numeric : _PGNumeric,
- sqltypes.Float: sqltypes.Float, # prevents _PGNumeric from being used
ENUM : _PGEnum, # needs force_unicode
sqltypes.Enum : _PGEnum, # needs force_unicode
ARRAY : _PGArray, # needs force_unicode
diff --git a/lib/sqlalchemy/dialects/postgresql/pypostgresql.py b/lib/sqlalchemy/dialects/postgresql/pypostgresql.py
index 517d41aaf..2c33b3eb5 100644
--- a/lib/sqlalchemy/dialects/postgresql/pypostgresql.py
+++ b/lib/sqlalchemy/dialects/postgresql/pypostgresql.py
@@ -17,7 +17,7 @@ class PGNumeric(sqltypes.Numeric):
def bind_processor(self, dialect):
return None
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if self.asdecimal:
return None
else:
diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py
index 47c797c21..33feaeaae 100644
--- a/lib/sqlalchemy/dialects/sqlite/base.py
+++ b/lib/sqlalchemy/dialects/sqlite/base.py
@@ -96,7 +96,7 @@ class _SLDateTime(_DateTimeMixin, sqltypes.DateTime):
)
_reg = re.compile(r"(\d+)-(\d+)-(\d+)(?: (\d+):(\d+):(\d+)(?:\.(\d+))?)?")
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
return self._result_processor(datetime.datetime, self._reg)
class _SLDate(_DateTimeMixin, sqltypes.Date):
@@ -107,7 +107,7 @@ class _SLDate(_DateTimeMixin, sqltypes.Date):
)
_reg = re.compile(r"(\d+)-(\d+)-(\d+)")
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
return self._result_processor(datetime.date, self._reg)
class _SLTime(_DateTimeMixin, sqltypes.Time):
@@ -126,7 +126,7 @@ class _SLTime(_DateTimeMixin, sqltypes.Time):
)
_reg = re.compile(r"(\d+):(\d+):(\d+)(?:\.(\d+))?")
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
return self._result_processor(datetime.time, self._reg)
@@ -138,7 +138,7 @@ class _SLBoolean(sqltypes.Boolean):
return value and 1 or 0
return process
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
diff --git a/lib/sqlalchemy/dialects/sybase/base.py b/lib/sqlalchemy/dialects/sybase/base.py
index 6fc42c312..cfdbd321a 100644
--- a/lib/sqlalchemy/dialects/sybase/base.py
+++ b/lib/sqlalchemy/dialects/sybase/base.py
@@ -113,7 +113,7 @@ class SybaseUniqueIdentifier(sqltypes.TypeEngine):
__visit_name__ = "UNIQUEIDENTIFIER"
class SybaseBoolean(sqltypes.Boolean):
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
if value is None:
return None
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index b65843f48..3ea52cd72 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -1757,7 +1757,6 @@ class ResultProxy(object):
typemap = self.dialect.dbapi_type_map
for i, (colname, coltype) in enumerate(m[0:2] for m in metadata):
-
if self.dialect.description_encoding:
colname = colname.decode(self.dialect.description_encoding)
@@ -1779,7 +1778,7 @@ class ResultProxy(object):
name, obj, type_ = (colname, None, typemap.get(coltype, types.NULLTYPE))
processor = type_.dialect_impl(self.dialect).\
- result_processor(self.dialect)
+ result_processor(self.dialect, coltype)
if processor:
def make_colfunc(processor, index):
diff --git a/lib/sqlalchemy/types.py b/lib/sqlalchemy/types.py
index a215f31ff..3fa18b2c2 100644
--- a/lib/sqlalchemy/types.py
+++ b/lib/sqlalchemy/types.py
@@ -47,12 +47,22 @@ class AbstractType(Visitable):
return value
def bind_processor(self, dialect):
- """Defines a bind parameter processing function."""
+ """Defines a bind parameter processing function.
+
+ :param dialect: Dialect instance in use.
+
+ """
return None
- def result_processor(self, dialect):
- """Defines a result-column processing function."""
+ def result_processor(self, dialect, coltype):
+ """Defines a result-column processing function.
+
+ :param dialect: Dialect instance in use.
+
+ :param coltype: DBAPI coltype argument received in cursor.description.
+
+ """
return None
@@ -126,7 +136,7 @@ class TypeEngine(AbstractType):
"""
return None
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
"""Return a conversion function for processing result row values.
Returns a callable which will receive a result row column
@@ -162,7 +172,7 @@ class UserDefinedType(TypeEngine):
return value
return process
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
def process(value):
return value
return process
@@ -300,10 +310,10 @@ class TypeDecorator(AbstractType):
else:
return self.impl.bind_processor(dialect)
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if self.__class__.process_result_value.func_code is not TypeDecorator.process_result_value.func_code:
process_value = self.process_result_value
- impl_processor = self.impl.result_processor(dialect)
+ impl_processor = self.impl.result_processor(dialect, coltype)
if impl_processor:
def process(value):
return process_value(impl_processor(value), dialect)
@@ -312,7 +322,7 @@ class TypeDecorator(AbstractType):
return process_value(value, dialect)
return process
else:
- return self.impl.result_processor(dialect)
+ return self.impl.result_processor(dialect, coltype)
def copy(self):
instance = self.__class__.__new__(self.__class__)
@@ -511,7 +521,7 @@ class String(Concatenable, TypeEngine):
else:
return None
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if (not dialect.returns_unicode_strings or self.convert_unicode == 'force') \
and (self.convert_unicode or dialect.convert_unicode):
def process(value):
@@ -666,7 +676,10 @@ class Numeric(TypeEngine):
self.asdecimal = asdecimal
def adapt(self, impltype):
- return impltype(precision=self.precision, scale=self.scale, asdecimal=self.asdecimal)
+ return impltype(
+ precision=self.precision,
+ scale=self.scale,
+ asdecimal=self.asdecimal)
def get_dbapi_type(self, dbapi):
return dbapi.NUMBER
@@ -679,7 +692,7 @@ class Numeric(TypeEngine):
return value
return process
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if self.asdecimal:
def process(value):
if value is not None:
@@ -790,7 +803,7 @@ class Binary(TypeEngine):
return None
return process
- def result_processor(self, dialect):
+ def result_processor(self, dialect, coltype):
if util.jython:
def process(value):
if value is not None:
@@ -1041,8 +1054,8 @@ class PickleType(MutableType, TypeDecorator):
return value
return process
- def result_processor(self, dialect):
- impl_processor = self.impl.result_processor(dialect)
+ def result_processor(self, dialect, coltype):
+ impl_processor = self.impl.result_processor(dialect, coltype)
loads = self.pickler.loads
if impl_processor:
def process(value):
@@ -1111,8 +1124,8 @@ class Interval(TypeDecorator):
return value
return process
- def result_processor(self, dialect):
- impl_processor = self.impl.result_processor(dialect)
+ def result_processor(self, dialect, coltype):
+ impl_processor = self.impl.result_processor(dialect, coltype)
epoch = self.epoch
if impl_processor:
def process(value):