]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
(no commit message)
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 23 Jul 2005 03:49:43 +0000 (03:49 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 23 Jul 2005 03:49:43 +0000 (03:49 +0000)
lib/sqlalchemy/mapper.py
lib/sqlalchemy/pool.py
lib/sqlalchemy/sql.py

index f3b1f4ec70c1dc3b09b8b65f6b7d1b6754c0c8ad..080caab0e0f5aa4c41876422a9a538015a0326e6 100644 (file)
@@ -28,7 +28,7 @@ import sqlalchemy.sql as sql
 import sqlalchemy.schema as schema
 import sqlalchemy.engine as engine
 import sqlalchemy.util as util
-import weakref, random, copy
+import random, copy, types
 
 __ALL__ = ['eagermapper', 'eagerloader', 'lazymapper', 'lazyloader', 'eagerload', 'lazyload', 'mapper', 'lazyloader', 'lazymapper', 'identitymap', 'globalidentity']
 
@@ -304,25 +304,38 @@ class PropertyLoader(MapperProperty):
 
     def delete(self):
         self.mapper.delete()
+
+class LazyRow(MapperProperty):
+    def __init__(self, table, whereclause, **options):
+        self.table = table
+        self.whereclause = whereclause
+        
+    def init(self, key, parent, root):
+        self.keys.append(key)
+    
+    def execute(self, instance, row, identitykey, localmap, isduplicate):
+        pass
         
 class LazyLoader(PropertyLoader):
+
+    def init(self, key, parent, root):
+        PropertyLoader.init(self, key, parent, root)
+        if not hasattr(parent.class_, key):
+            setattr(parent.class_, key, SmartProperty(key).property())
+
     def setup(self, key, primarytable, statement, **options):
         self.lazywhere = self.whereclause.copy_structure()
         li = LazyIzer(primarytable)
         self.lazywhere.accept_visitor(li)
         self.binds = li.binds
 
-    def init(self, key, parent, root):
-        PropertyLoader.init(self, key, parent, root)
-        setattr(parent.class_, key, SmartProperty(key).property())
-
     def execute(self, instance, row, identitykey, localmap, isduplicate):
         if not isduplicate:
             def load():
                 m = {}
                 for key, value in self.binds.iteritems():
                     m[key] = row[key]
-                return self.mapper.select(**m)
+                return self.mapper.select(self.lazywhere, **m)
 
             setattr(instance, self.key, load)
         
@@ -399,11 +412,11 @@ class LazyIzer(sql.ClauseVisitor):
         
     def visit_binary(self, binary):
         if isinstance(binary.left, schema.Column) and binary.left.table == self.table:
-            binary.left = self.binds.setdefault(binary.left.name,
+            binary.left = self.binds.setdefault(self.table.name + "_" + binary.left.name,
                     sql.BindParamClause(self.table.name + "_" + binary.left.name, None, shortname = binary.left.name))
 
         if isinstance(binary.right, schema.Column) and binary.right.table == self.table:
-            binary.right = self.binds.setdefault(binary.right.name,
+            binary.right = self.binds.setdefault(self.table.name + "_" + binary.right.name,
                     sql.BindParamClause(self.table.name + "_" + binary.right.name, None, shortname = binary.left.name))
     
 
@@ -414,8 +427,6 @@ class SmartProperty(object):
 
     def property(self):
         def set_prop(s, value):
-            print "hi setting is " + repr(value)
-            raise "hi"
             s.__dict__[self.key] = value
             s.dirty = True
         def del_prop(s):
@@ -423,8 +434,6 @@ class SmartProperty(object):
             s.dirty = True
         def get_prop(s):
             v = s.__dict__[self.key]
-            # TODO: this sucks a little
-            print "hi thing is " + repr(v)
             if isinstance(v, types.FunctionType):
                 s.__dict__[self.key] = v()
             return s.__dict__[self.key]
index eb34c988087da22103e6d40ff73e5b44d4c98bf3..8d231058f6a32f1ddb611677632f5da001ddd6a3 100644 (file)
@@ -78,6 +78,8 @@ class ConnectionFairy:
         return getattr(self.connection, key)
     def __del__(self):
         self.pool.return_conn(self.connection)
+        self.pool = None
+        self.connection = None
             
 class CursorFairy:
     def __init__(self, parent, cursor):
@@ -111,6 +113,14 @@ class QueuePool(Pool):
             self._overflow += 1
             return self._creator()
 
+    def __del__(self):
+        while True:
+            try:
+                conn = self._pool.get(False)
+                conn.close()
+            except Queue.Empty:
+                break
+        
     def size(self):
         return self._pool.maxsize
     
index c3921589b23edb86e0f36bffb9e04bbba74f53ac..0a6e9fde40ac36efbf434fc6a286dfe601a4cd9b 100644 (file)
@@ -120,7 +120,10 @@ class ClauseElement(object):
 
     def compile(self, engine, bindparams = None):
         return engine.compile(self, bindparams = bindparams)
-    
+
+    def copy_structure(self):
+        return self
+        
     def _engine(self):
         raise NotImplementedError("Object %s has no built-in SQLEngine." % repr(self))
         
@@ -215,6 +218,10 @@ class CompoundClause(ClauseElement):
             if c is None: continue
             self.append(c)
     
+    def copy_structure(self):
+        clauses = [clause.copy_structure() for clause in self.clauses]
+        return CompoundClause(self.operator, *clauses)
+        
     def append(self, clause):
         if type(clause) == str:
             clause = TextClause(clause)
@@ -245,14 +252,17 @@ class ClauseList(ClauseElement):
 class BinaryClause(ClauseElement):
     """represents two clauses with an operator in between"""
     
-    def __init__(self, left, right, operator, fromobj = None):
+    def __init__(self, left, right, operator):
         self.left = left
         self.right = right
         self.operator = operator
-        self.fromobj = fromobj or []
+        self.fromobj = []
         self.parens = False
         self.fromobj += left._get_from_objects()
         self.fromobj += right._get_from_objects()
+
+    def copy_structure(self):
+        return BinaryClause(self.left, self.right, self.operator)
         
     def _get_from_objects(self):
         return self.fromobj
@@ -365,7 +375,7 @@ class ColumnSelectable(Selectable):
             else:
                 obj = BindParamClause(self.column.table.name + "_" + self.name, obj, shortname = self.name)
         
-        return BinaryClause(self.column, obj, operator, [self.column.table])
+        return BinaryClause(self.column, obj, operator)
 
     def __lt__(self, other):
         return self._compare('<', other)