[Sqlalchemy-commits] [1314] sqlalchemy/branches/schema/test: its ia little rough right now
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-04-21 23:18:37
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1314] sqlalchemy/branches/schema/test: its ia little rough right now</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1314</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-04-21 18:18:17 -0500 (Fri, 21 Apr 2006)</dd> </dl> <h3>Log Message</h3> <pre>its ia little rough right now</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyattributespy">sqlalchemy/branches/schema/lib/sqlalchemy/attributes.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemymappingobjectstorepy">sqlalchemy/branches/schema/lib/sqlalchemy/mapping/objectstore.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemymappingunitofworkpy">sqlalchemy/branches/schema/lib/sqlalchemy/mapping/unitofwork.py</a></li> <li><a href="#sqlalchemybranchesschematestrelationshipspy">sqlalchemy/branches/schema/test/relationships.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemyattributespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/attributes.py (1313 => 1314)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/attributes.py 2006-04-21 21:31:07 UTC (rev 1313) +++ sqlalchemy/branches/schema/lib/sqlalchemy/attributes.py 2006-04-21 23:18:17 UTC (rev 1314) </span><span class="lines">@@ -82,6 +82,9 @@ </span><span class="cx"> #self.obj = obj </span><span class="cx"> self.key = key </span><span class="cx"> obj = property(lambda s:s.__obj()) </span><ins>+ def value_changed(self, *args, **kwargs): + self.obj._managed_value_changed = True + self.do_value_changed(*args, **kwargs) </ins><span class="cx"> def history(self, **kwargs): </span><span class="cx"> return self </span><span class="cx"> def plain_init(self, *args, **kwargs): </span><span class="lines">@@ -138,7 +141,7 @@ </span><span class="cx"> self.orig = ScalarAttribute.NONE </span><span class="cx"> def commit(self): </span><span class="cx"> self.orig = ScalarAttribute.NONE </span><del>- def value_changed(self, oldvalue, newvalue): </del><ins>+ def do_value_changed(self, oldvalue, newvalue): </ins><span class="cx"> pass </span><span class="cx"> def added_items(self): </span><span class="cx"> if self.orig is not ScalarAttribute.NONE: </span><span class="lines">@@ -181,7 +184,7 @@ </span><span class="cx"> obj.__dict__[key] = [] </span><span class="cx"> </span><span class="cx"> util.HistoryArraySet.__init__(self, list_, readonly=kwargs.get('readonly', False)) </span><del>- def value_changed(self, obj, key, item, listval, isdelete): </del><ins>+ def do_value_changed(self, obj, key, item, listval, isdelete): </ins><span class="cx"> pass </span><span class="cx"> def setattr(self, value, **kwargs): </span><span class="cx"> self.obj.__dict__[self.key] = value </span><span class="lines">@@ -312,7 +315,7 @@ </span><span class="cx"> def __init__(self): </span><span class="cx"> pass </span><span class="cx"> </span><del>- def value_changed(self, obj, key, value): </del><ins>+ def do_value_changed(self, obj, key, value): </ins><span class="cx"> """subclasses override this method to provide functionality that is triggered </span><span class="cx"> upon an attribute change of value.""" </span><span class="cx"> pass </span><span class="lines">@@ -367,6 +370,7 @@ </span><span class="cx"> hist.rollback() </span><span class="cx"> except KeyError: </span><span class="cx"> pass </span><ins>+ o._managed_value_changed = False </ins><span class="cx"> </span><span class="cx"> def commit(self, *obj): </span><span class="cx"> """commits all attribute changes on the given list of objects, </span><span class="lines">@@ -378,7 +382,11 @@ </span><span class="cx"> hist.commit() </span><span class="cx"> except KeyError: </span><span class="cx"> pass </span><del>- </del><ins>+ o._managed_value_changed = False + + def is_modified(self, object): + return getattr(object, '_managed_value_changed', False) + </ins><span class="cx"> def remove(self, obj): </span><span class="cx"> """called when an object is totally being removed from memory""" </span><span class="cx"> # currently a no-op since the state of the object is attached to the object itself </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemymappingobjectstorepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/mapping/objectstore.py (1313 => 1314)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/mapping/objectstore.py 2006-04-21 21:31:07 UTC (rev 1313) +++ sqlalchemy/branches/schema/lib/sqlalchemy/mapping/objectstore.py 2006-04-21 23:18:17 UTC (rev 1314) </span><span class="lines">@@ -249,7 +249,7 @@ </span><span class="cx"> def save_or_update(self, *obj, **kwargs): </span><span class="cx"> for o in obj: </span><span class="cx"> for c in object_mapper(o, *kwargs).cascade_iterator('save-update', o): </span><del>- key = self._instance_key(c, raiseerror=False, **kwargs) </del><ins>+ key = getattr(o, '_instance_key', None) </ins><span class="cx"> if key is None: </span><span class="cx"> self._save_impl(c, **kwargs) </span><span class="cx"> else: </span><span class="lines">@@ -271,25 +271,11 @@ </span><span class="cx"> return </span><span class="cx"> if not hasattr(object, '_instance_key'): </span><span class="cx"> raise InvalidRequestError("Instance '%s' is not persisted" % repr(object)) </span><del>- self._register_dirty(object) - - def _instance_key(self, object, entity_name=None, raiseerror=True): - key = getattr(object, '_instance_key', None) - if key is None: - mapper = object_mapper(object, raiseerror=False) - if mapper is None: - mapper = class_mapper(object, entity_name=entity_name) - ident = mapper.identity(object) - for k in ident: - if k is None: - if raiseerror: - raise InvalidRequestError("Instance '%s' does not have a full set of identity values, and does not represent a saved entity in the database. Use the add() method to add unsaved instances to this Session." % str(object)) - else: - return None - key = mapper.identity_key(*ident) - return key </del><ins>+ if global_attributes.is_modified(object): + self._register_dirty(object) + else: + self._register_clean(object) </ins><span class="cx"> </span><del>- </del><span class="cx"> def _register_new(self, obj): </span><span class="cx"> self._bind_to(obj) </span><span class="cx"> self.uow.register_new(obj) </span><span class="lines">@@ -360,7 +346,19 @@ </span><span class="cx"> """ </span><span class="cx"> if instance is None: </span><span class="cx"> return None </span><del>- key = self._instance_key(instance, entity_name=entity_name, raiseerror=True) </del><ins>+ key = getattr(object, '_instance_key', None) + if key is None: + mapper = object_mapper(object, raiseerror=False) + if mapper is None: + mapper = class_mapper(object, entity_name=entity_name) + ident = mapper.identity(object) + for k in ident: + if k is None: + if raiseerror: + raise InvalidRequestError("Instance '%s' does not have a full set of identity values, and does not represent a saved entity in the database. Use the add() method to add unsaved instances to this Session." % str(object)) + else: + return None + key = mapper.identity_key(*ident) </ins><span class="cx"> u = self.uow </span><span class="cx"> if u.identity_map.has_key(key): </span><span class="cx"> return u.identity_map[key] </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemymappingunitofworkpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/mapping/unitofwork.py (1313 => 1314)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/mapping/unitofwork.py 2006-04-21 21:31:07 UTC (rev 1313) +++ sqlalchemy/branches/schema/lib/sqlalchemy/mapping/unitofwork.py 2006-04-21 23:18:17 UTC (rev 1314) </span><span class="lines">@@ -42,7 +42,7 @@ </span><span class="cx"> def __init__(self, obj, key, data=None, cascade=None, **kwargs): </span><span class="cx"> attributes.ListAttribute.__init__(self, obj, key, data=data, **kwargs) </span><span class="cx"> self.cascade = cascade </span><del>- def value_changed(self, obj, key, item, listval, isdelete): </del><ins>+ def do_value_changed(self, obj, key, item, listval, isdelete): </ins><span class="cx"> sess = get_session(obj, raiseerror=False) </span><span class="cx"> if sess is None: </span><span class="cx"> return </span><span class="lines">@@ -64,21 +64,16 @@ </span><span class="cx"> def __init__(self, obj, key, cascade=None, **kwargs): </span><span class="cx"> attributes.ScalarAttribute.__init__(self, obj, key, **kwargs) </span><span class="cx"> self.cascade=cascade </span><del>- def value_changed(self, oldvalue, newvalue): </del><ins>+ def do_value_changed(self, oldvalue, newvalue): </ins><span class="cx"> obj = self.obj </span><span class="cx"> sess = get_session(obj, raiseerror=False) </span><span class="cx"> if sess is not None: </span><del>- if hasattr(obj, '_instance_key'): - sess._register_dirty(obj) - else: - sess._register_new(obj) </del><ins>+ sess.save_or_update(obj) </ins><span class="cx"> if self.cascade is not None: </span><del>- if isdelete: - if "delete-orphan" in self.cascade: - sess.delete(item) - else: - if "save-update" in self.cascade: - sess.save_or_update(item) </del><ins>+ if "delete-orphan" in self.cascade: + sess.delete(oldvalue) + if "save-update" in self.cascade: + sess.save_or_update(newvalue) </ins><span class="cx"> </span><span class="cx"> class UOWAttributeManager(attributes.AttributeManager): </span><span class="cx"> """overrides AttributeManager to provide unit-of-work "dirty" hooks when scalar attribues are modified, plus factory methods for UOWProperrty/UOWListElement.""" </span><span class="lines">@@ -105,7 +100,10 @@ </span><span class="cx"> self.attributes = global_attributes </span><span class="cx"> self.new = util.HashSet(ordered = True) </span><span class="cx"> self.dirty = util.HashSet() </span><ins>+ + # guess what. we dont even need this anymore ! hooray - TODO: take it out </ins><span class="cx"> self.modified_lists = util.HashSet() </span><ins>+ </ins><span class="cx"> self.deleted = util.HashSet() </span><span class="cx"> </span><span class="cx"> def get(self, class_, *id): </span><span class="lines">@@ -247,11 +245,6 @@ </span><span class="cx"> flush_context.register_object(obj, listonly = True) </span><span class="cx"> flush_context.register_saved_history(item) </span><span class="cx"> </span><del>-# for o in item.added_items() + item.deleted_items(): -# if self.deleted.contains(o): -# continue -# flush_context.register_object(o, listonly=True) - </del><span class="cx"> for obj in self.deleted: </span><span class="cx"> if objset is not None and not objset.contains(obj): </span><span class="cx"> continue </span></span></pre></div> <a id="sqlalchemybranchesschematestrelationshipspy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/test/relationships.py (1313 => 1314)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/test/relationships.py 2006-04-21 21:31:07 UTC (rev 1313) +++ sqlalchemy/branches/schema/test/relationships.py 2006-04-21 23:18:17 UTC (rev 1314) </span><span class="lines">@@ -74,12 +74,12 @@ </span><span class="cx"> global c </span><span class="cx"> a = A(); a.name = "a1" </span><span class="cx"> b = B(); b.name = "b1" </span><del>- session.add(a,b) </del><span class="cx"> c = C(); c.name = "c1"; c.a_row = a </span><span class="cx"> # we must have more than one d row or it won't fail </span><span class="cx"> d1 = D(); d1.name = "d1"; d1.b_row = b; d1.c_row = c </span><span class="cx"> d2 = D(); d2.name = "d2"; d2.b_row = b; d2.c_row = c </span><span class="cx"> d3 = D(); d3.name = "d3"; d3.b_row = b; d3.c_row = c </span><ins>+ session.save_or_update(a,b) </ins><span class="cx"> </span><span class="cx"> def tearDown(self): </span><span class="cx"> conn = session.connect() </span></span></pre> </div> </div> </body> </html> |