From: Mike Bayer Date: Sat, 23 Jul 2005 03:49:43 +0000 (+0000) Subject: (no commit message) X-Git-Tag: rel_0_1_0~857 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0ef6e4484246ef70fe74634ec468bf92fd0579f;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git --- diff --git a/lib/sqlalchemy/mapper.py b/lib/sqlalchemy/mapper.py index f3b1f4ec70..080caab0e0 100644 --- a/lib/sqlalchemy/mapper.py +++ b/lib/sqlalchemy/mapper.py @@ -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] diff --git a/lib/sqlalchemy/pool.py b/lib/sqlalchemy/pool.py index eb34c98808..8d231058f6 100644 --- a/lib/sqlalchemy/pool.py +++ b/lib/sqlalchemy/pool.py @@ -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 diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index c3921589b2..0a6e9fde40 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -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)