From 7028cbc2a214595ef044f44f3c7d4d10c014dc43 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 17 Sep 2005 18:34:25 +0000 Subject: [PATCH] --- lib/sqlalchemy/attributes.py | 6 +++-- lib/sqlalchemy/mapper.py | 19 ++++++++++++---- lib/sqlalchemy/objectstore.py | 10 ++++++++- lib/sqlalchemy/util.py | 42 ----------------------------------- test/objectstore.py | 7 ++++-- 5 files changed, 33 insertions(+), 51 deletions(-) diff --git a/lib/sqlalchemy/attributes.py b/lib/sqlalchemy/attributes.py index 9bc72c6e25..1e1cab893c 100644 --- a/lib/sqlalchemy/attributes.py +++ b/lib/sqlalchemy/attributes.py @@ -37,7 +37,6 @@ class ListElement(util.HistoryArraySet): def list_value_changed(self, obj, key, listval): pass -# uow().modified_lists.append(self) def setattr(self, value): self.obj.__dict__[self.key] = value @@ -102,6 +101,9 @@ class AttributeManager(object): # else: # self.register_new(obj) + def create_prop(self, key, uselist): + return SmartProperty(self).property(key, uselist) + def create_list(self, obj, key, list_): return ListElement(obj, key, list_) @@ -182,4 +184,4 @@ class AttributeManager(object): return p def register_attribute(self, class_, key, uselist): - setattr(class_, key, SmartProperty(self).property(key, uselist)) + setattr(class_, key, self.create_prop(key, uselist)) diff --git a/lib/sqlalchemy/mapper.py b/lib/sqlalchemy/mapper.py index 953c02d382..b7f5fd53e6 100644 --- a/lib/sqlalchemy/mapper.py +++ b/lib/sqlalchemy/mapper.py @@ -22,7 +22,7 @@ import sqlalchemy.util as util import sqlalchemy.objectstore as objectstore import random, copy, types -__ALL__ = ['eagermapper', 'eagerloader', 'lazymapper', 'lazyloader', 'eagerload', 'lazyload', 'mapper', 'lazyloader', 'lazymapper'] +__ALL__ = ['eagermapper', 'eagerloader', 'lazymapper', 'lazyloader', 'eagerload', 'lazyload', 'mapper', 'lazyloader', 'lazymapper', 'clear_mappers'] def relation(*args, **params): if isinstance(args[0], Mapper): @@ -39,6 +39,7 @@ def relation_loader(mapper, secondary = None, primaryjoin = None, secondaryjoin def relation_mapper(class_, selectable, secondary = None, primaryjoin = None, secondaryjoin = None, table = None, properties = None, lazy = True, uselist = True, foreignkey = None, primary_keys = None, **options): return relation_loader(mapper(class_, selectable, table=table, properties=properties, primary_keys=primary_keys, **options), secondary, primaryjoin, secondaryjoin, lazy = lazy, uselist = uselist, foreignkey = foreignkey, **options) +# TODO: where do we want to register these mappers, register them against their classes/objects etc _mappers = {} def mapper(*args, **params): hashkey = mapper_hash_key(*args, **params) @@ -48,7 +49,10 @@ def mapper(*args, **params): except KeyError: m = Mapper(hashkey, *args, **params) return _mappers.setdefault(hashkey, m) - + +def clear_mappers(): + _mappers.clear() + def eagerload(name): return EagerLazySwitcher(name, toeager = True) @@ -151,6 +155,7 @@ class Mapper(object): def init(self): [prop.init(key, self) for key, prop in self.props.iteritems()] + print "well hi!" self.class_._mapper = self.hashkey def instances(self, cursor, db = None): @@ -250,6 +255,8 @@ class Mapper(object): insert = [] update = [] for obj in objects: + +# print "SAVE_OBJ we are " + hash_key(self) + " obj: " + obj.__class__.__name__ + repr(id(obj)) params = {} for col in table.columns: params[col.key] = self._getattrbycolumn(obj, col) @@ -525,9 +532,9 @@ class PropertyLoader(MapperProperty): def getlist(obj): if self.uselist: - return uowcommit.uow.manager.get_list_history(obj, self.key) + return uowcommit.uow.attributes.get_list_history(obj, self.key) else: - return uowcommit.uow.manager.get_history(obj, self.key) + return uowcommit.uow.attributes.get_history(obj, self.key) clearkeys = False @@ -569,6 +576,10 @@ class PropertyLoader(MapperProperty): elif self.foreignkey.table == self.parent.table: for child in deplist: childlist = getlist(child) + try: + print "got a list and its " + repr(childlist) + except: + pass for obj in childlist.added_items(): associationrow = {} self.primaryjoin.accept_visitor(setter) diff --git a/lib/sqlalchemy/objectstore.py b/lib/sqlalchemy/objectstore.py index a0c49ac5d1..d18dca9008 100644 --- a/lib/sqlalchemy/objectstore.py +++ b/lib/sqlalchemy/objectstore.py @@ -96,6 +96,10 @@ def has_key(key): else: return False +class UOWSmartProperty(attributes.SmartProperty): + def attribute_registry(self): + return uow().attributes + class UOWListElement(attributes.ListElement): def list_value_changed(self, obj, key, listval): uow().modified_lists.append(self) @@ -111,6 +115,9 @@ class UOWAttributeManager(attributes.AttributeManager): else: self.uow.register_new(obj) + def create_prop(self, key, uselist): + return UOWSmartProperty(self).property(key, uselist) + def create_list(self, obj, key, list_): return UOWListElement(obj, key, list_) @@ -177,8 +184,9 @@ class UnitOfWork(object): else: for obj in [n for n in self.new] + [d for d in self.dirty]: commit_context.append_task(obj) + print "COMMIT append " + obj.__class__.__name__ + " " + repr(id(obj)) for item in self.modified_lists: - obj = item.obj() + obj = item.obj commit_context.append_task(obj) engines = util.HashSet() diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 20d45142f2..1575c28582 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -245,48 +245,6 @@ class HistoryArraySet(UserList.UserList): def __iadd__(self, other): raise NotImplementedError() -class PropHistory(object): - def __init__(self, current): - self.added = None - self.current = current - self.deleted = None - def setattr_clean(self, value): - self.current = value - def setattr(self, value): - self.deleted = self.current - self.current = None - self.added = value - def delattr(self): - self.deleted = self.current - self.current = None - def rollback(self): - if self.deleted is not None: - self.current = self.deleted - self.deleted = None - else: - self.current = None - self.added = None - self.deleted = None - def clear_history(self): - if self.added is not None: - self.current = self.added - self.added = None - self.deleted = None - def added_items(self): - if self.added is not None: - return [self.added] - else: - return [] - def deleted_items(self): - if self.deleted is not None: - return [self.deleted] - else: - return [] - def unchanged_items(self): - if self.current is not None: - return [self.current] - else: - return [] class ScopedRegistry(object): def __init__(self, createfunc, defaultscope): diff --git a/test/objectstore.py b/test/objectstore.py index a257b4b4fc..0684e302ee 100644 --- a/test/objectstore.py +++ b/test/objectstore.py @@ -39,7 +39,8 @@ class SaveTest(AssertMixin): def setUp(self): objectstore.clear() - + clear_mappers() + def testbasic(self): # save two users u = User() @@ -163,6 +164,7 @@ class SaveTest(AssertMixin): m = mapper(User, users, properties = dict( addresses = relation(Address, addresses, lazy = True) )) + print "TESTONETOMANY, mapper is " + repr(id(m)) u = User() u.user_name = 'one2manytester' u.addresses = [] @@ -172,7 +174,8 @@ class SaveTest(AssertMixin): a2 = Address() a2.email_address = 'lala@test.org' u.addresses.append(a2) - + print repr(u.addresses) + print repr(u.addresses.added_items()) objectstore.uow().commit() usertable = engine.ResultProxy(users.select(users.c.user_id.in_(u.user_id)).execute()).fetchall() -- 2.47.2