]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
rewrote PickleType bind_processor and result_processors to bypass TypeDecorator
authorGaëtan de Menten <gdementen@gmail.com>
Tue, 3 Nov 2009 15:52:57 +0000 (15:52 +0000)
committerGaëtan de Menten <gdementen@gmail.com>
Tue, 3 Nov 2009 15:52:57 +0000 (15:52 +0000)
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.

lib/sqlalchemy/types.py

index c60f214f9a8b9ade43fa11a2a789c6bdd9954166..8643f3066cf860f82abd5bb09134b65707dd1fe8 100644 (file)
@@ -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: