]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
tableimpl and columnimpl proxy to actual impl objects per engine
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 11 Feb 2006 21:04:48 +0000 (21:04 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 11 Feb 2006 21:04:48 +0000 (21:04 +0000)
lib/sqlalchemy/ext/proxy.py
test/proxy_engine.py

index 6139164bf1d6268f72095e688a5c3dd77aec1254..4db001653b0cf29c261b2e02755702d3475da79d 100644 (file)
@@ -7,7 +7,7 @@ from sqlalchemy import sql
 from sqlalchemy.engine import create_engine
 from sqlalchemy.types import TypeEngine
 
-import thread
+import thread, weakref
 
 class ProxyEngine(object):
     """
@@ -84,13 +84,23 @@ class ProxyEngine(object):
         raise AttributeError('No connection established in ProxyEngine: '
                              ' no access to %s' % attr)
 
+        
 class ProxyColumnImpl(sql.ColumnImpl):
     """Proxy column; defers engine access to ProxyEngine
     """
     def __init__(self, engine, column):
         sql.ColumnImpl.__init__(self, column)
         self._engine = engine
-
+        self.impls = weakref.WeakKeyDictionary()
+    def _get_impl(self):
+        e = self.engine
+        try:
+            return self.impls[e]
+        except KeyError:
+            impl = e.columnimpl(self.column)
+            self.impls[e] = impl
+    def __getattr__(self, key):
+        return getattr(self._get_impl(), key)
     engine = property(lambda self: self._engine.engine)
 
 class ProxyTableImpl(sql.TableImpl):
@@ -99,6 +109,17 @@ class ProxyTableImpl(sql.TableImpl):
     def __init__(self, engine, table):
         sql.TableImpl.__init__(self, table)
         self._engine = engine
+        self.impls = weakref.WeakKeyDictionary()
+    def _get_impl(self):
+        e = self.engine
+        try:
+            return self.impls[e]
+        except KeyError:
+            impl = e.tableimpl(self.table)
+            self.impls[e] = impl
+            return impl
+    def __getattr__(self, key):
+        return getattr(self._get_impl(), key)
 
     engine = property(lambda self: self._engine.engine)
 
index 63933471645add6e0ecc4f2ec109175532df0659..e235a22212e3128fc643f84e8cb05227e6bba834 100644 (file)
@@ -241,20 +241,22 @@ class ProxyEngineTest2(PersistTest):
 
         engine.connect(testbase.db_uri)
         dogs.create()
+        try:
+            spot = Dog()
+            spot.breed = 'beagle'
+            spot.name = 'Spot'
 
-        spot = Dog()
-        spot.breed = 'beagle'
-        spot.name = 'Spot'
-
-        rover = Dog()
-        rover.breed = 'spaniel'
-        rover.name = 'Rover'
-        
-        objectstore.commit()
+            rover = Dog()
+            rover.breed = 'spaniel'
+            rover.name = 'Rover'
         
-        assert spot.dog_id > 0, "Spot did not get an id"
-        assert rover.dog_id != spot.dog_id
+            objectstore.commit()
         
+            assert spot.dog_id > 0, "Spot did not get an id"
+            assert rover.dog_id != spot.dog_id
+        finally:
+            dogs.drop()
+            
     def  test_type_proxy_schema_gen(self):
         from sqlalchemy.databases.postgres import PGSchemaGenerator
 
@@ -268,7 +270,7 @@ class ProxyEngineTest2(PersistTest):
         # answer
         engine.connect('postgres://database=test&port=5432&host=127.0.0.1&user=scott&password=tiger')
 
-        sg = PGSchemaGenerator(engine.proxy())
+        sg = PGSchemaGenerator(engine)
         id_spec = sg.get_column_specification(lizards.c.id)
         assert id_spec == 'id SERIAL NOT NULL PRIMARY KEY'