]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- The per-dialect cache used by TypeEngine to cache
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 29 Jan 2009 16:10:08 +0000 (16:10 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 29 Jan 2009 16:10:08 +0000 (16:10 +0000)
dialect-specific types is now a WeakKeyDictionary.
This to prevent dialect objects from
being referenced forever for an application that
creates an arbitrarily large number of engines
or dialects.   There is a small performance penalty
which will be resolved in 0.6.  [ticket:1299]

CHANGES
lib/sqlalchemy/types.py
test/orm/memusage.py

diff --git a/CHANGES b/CHANGES
index 9e60e512e00d3bf6fea9660718105d817d0a348c..8a1beede358d69a24648d4dd2ba021d2d3891c46 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -37,6 +37,14 @@ CHANGES
     - NullPool supports reconnect on failure behavior.
       [ticket:1094]
 
+    - The per-dialect cache used by TypeEngine to cache
+      dialect-specific types is now a WeakKeyDictionary.
+      This to prevent dialect objects from 
+      being referenced forever for an application that 
+      creates an arbitrarily large number of engines
+      or dialects.   There is a small performance penalty
+      which will be resolved in 0.6.  [ticket:1299]
+      
 - postgres
     - Added Index reflection support to Postgres, using a
       great patch we long neglected, submitted by 
index e06ec9a5a507af30e382548e5c3a970d9207cb2f..a8fe8b821c6dfae13edefe49b7ca81e40bc190fa 100644 (file)
@@ -23,7 +23,7 @@ __all__ = [ 'TypeEngine', 'TypeDecorator', 'AbstractType',
 
 import inspect
 import datetime as dt
-
+import weakref
 from sqlalchemy import exceptions
 from sqlalchemy.util import pickle, Decimal as _python_Decimal
 import sqlalchemy.util as util
@@ -160,14 +160,14 @@ class TypeEngine(AbstractType):
         try:
             return self._impl_dict[dialect]
         except AttributeError:
-            self._impl_dict = {}
+            self._impl_dict = weakref.WeakKeyDictionary()   # will be optimized in 0.6
             return self._impl_dict.setdefault(dialect, dialect.type_descriptor(self))
         except KeyError:
             return self._impl_dict.setdefault(dialect, dialect.type_descriptor(self))
 
     def __getstate__(self):
         d = self.__dict__.copy()
-        d['_impl_dict'] = {}
+        d['_impl_dict'] = weakref.WeakKeyDictionary()   # will be optimized in 0.6
         return d
 
     def get_col_spec(self):
@@ -221,7 +221,7 @@ class TypeDecorator(AbstractType):
         try:
             return self._impl_dict[dialect]
         except AttributeError:
-            self._impl_dict = {}
+            self._impl_dict = weakref.WeakKeyDictionary()   # will be optimized in 0.6
         except KeyError:
             pass
 
index 40be2d73b183556471516d7e4ff081ce9ed4d8e6..cc0631f7693ca1521bbac3efeb9b88c49051276c 100644 (file)
@@ -4,6 +4,8 @@ from sqlalchemy import MetaData, Integer, String, ForeignKey
 from sqlalchemy.orm import mapper, relation, clear_mappers, create_session
 from sqlalchemy.orm.mapper import Mapper, _mapper_registry
 from sqlalchemy.orm.session import _sessions 
+import sqlalchemy as sa
+from sqlalchemy.sql import column
 from testlib import *
 from testlib.fixtures import Base
 
@@ -278,6 +280,14 @@ class MemUsageTest(EnsureZeroed):
             metadata.drop_all()
         assert_no_mappers()
 
-
+    def test_type_compile(self):
+        from sqlalchemy.databases.sqlite import SQLiteDialect
+        cast = sa.cast(column('x'), sa.Integer)
+        @profile_memory
+        def go():
+            dialect = SQLiteDialect()
+            cast.compile(dialect=dialect)
+        go()
+        
 if __name__ == '__main__':
     testenv.main()