summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorGaëtan de Menten <gdementen@gmail.com>2009-11-03 15:52:57 +0000
committerGaëtan de Menten <gdementen@gmail.com>2009-11-03 15:52:57 +0000
commitadaecccda17d927462df30f7e6be37a300798013 (patch)
tree7c071c3826cbc5c7f459b6240f303443813859f9 /lib/sqlalchemy
parentdb3521823dd629d07079555341b5f5885264650f (diff)
downloadsqlalchemy-adaecccda17d927462df30f7e6be37a300798013.tar.gz
rewrote PickleType bind_processor and result_processors to bypass TypeDecorator
call overhead and avoid pickler function lookup for each row (see #1598). Provides a speedup of ~7 % on total query time for a 1000 record query on a table with 1 PickeType field and 25% None values.
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/types.py34
1 files changed, 26 insertions, 8 deletions
diff --git a/lib/sqlalchemy/types.py b/lib/sqlalchemy/types.py
index c60f214f9..8643f3066 100644
--- a/lib/sqlalchemy/types.py
+++ b/lib/sqlalchemy/types.py
@@ -1025,18 +1025,36 @@ class PickleType(MutableType, TypeDecorator):
self.comparator = comparator
super(PickleType, self).__init__()
- def process_bind_param(self, value, dialect):
- if value is None:
- return None
+ def bind_processor(self, dialect):
+ impl_processor = self.impl.bind_processor(dialect)
dumps = self.pickler.dumps
protocol = self.protocol
- return dumps(value, protocol)
+ if impl_processor:
+ def process(value):
+ if value is None:
+ return impl_processor(None)
+ return impl_processor(dumps(value, protocol))
+ else:
+ def process(value):
+ if value is None:
+ return None
+ return dumps(value, protocol)
+ return process
- def process_result_value(self, value, dialect):
- if value is None:
- return None
+ def result_processor(self, dialect):
+ impl_processor = self.impl.result_processor(dialect)
loads = self.pickler.loads
- return loads(value)
+ if impl_processor:
+ def process(value):
+ if value is None:
+ return impl_processor(None)
+ return loads(impl_processor(value))
+ else:
+ def process(value):
+ if value is None:
+ return None
+ return loads(value)
+ return process
def copy_value(self, value):
if self.mutable: