[Sqlalchemy-commits] [1079] sqlalchemy/trunk/lib/sqlalchemy: added objectstore.refresh(), including
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-03-02 01:45:44
|
<!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>[1079] sqlalchemy/trunk/lib/sqlalchemy: added objectstore.refresh(), including supporting changes in mapper, attributes, util</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1079</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-01 19:45:31 -0600 (Wed, 01 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>added objectstore.refresh(), including supporting changes in mapper, attributes, util</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyattributespy">sqlalchemy/trunk/lib/sqlalchemy/attributes.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingobjectstorepy">sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyutilpy">sqlalchemy/trunk/lib/sqlalchemy/util.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyattributespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/attributes.py (1078 => 1079)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-02 00:44:18 UTC (rev 1078) +++ sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-02 01:45:31 UTC (rev 1079) </span><span class="lines">@@ -65,6 +65,8 @@ </span><span class="cx"> self.extension = extension </span><span class="cx"> def gethistory(self, *args, **kwargs): </span><span class="cx"> return self </span><ins>+ def clear(self): + del self.obj.__dict__[self.key] </ins><span class="cx"> def history_contains(self, obj): </span><span class="cx"> return self.orig is obj or self.obj.__dict__[self.key] is obj </span><span class="cx"> def setattr_clean(self, value): </span><span class="lines">@@ -314,7 +316,8 @@ </span><span class="cx"> pass </span><span class="cx"> </span><span class="cx"> def remove(self, obj): </span><del>- """not sure what this is.""" </del><ins>+ """called when an object is totally being removed from memory""" + # currently a no-op since the state of the object is attached to the object itself </ins><span class="cx"> pass </span><span class="cx"> </span><span class="cx"> def create_history(self, obj, key, uselist, callable_=None, **kwargs): </span><span class="lines">@@ -350,6 +353,8 @@ </span><span class="cx"> When the attribute is next accessed, a new container will be created via the </span><span class="cx"> class-level history container definition.""" </span><span class="cx"> try: </span><ins>+ x = self.attribute_history(obj)[key] + x.clear() </ins><span class="cx"> del self.attribute_history(obj)[key] </span><span class="cx"> except KeyError: </span><span class="cx"> pass </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1078 => 1079)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-02 00:44:18 UTC (rev 1078) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-02 01:45:31 UTC (rev 1079) </span><span class="lines">@@ -235,6 +235,7 @@ </span><span class="cx"> def instances(self, cursor, *mappers, **kwargs): </span><span class="cx"> limit = kwargs.get('limit', None) </span><span class="cx"> offset = kwargs.get('offset', None) </span><ins>+ populate_existing = kwargs.get('populate_existing', False) </ins><span class="cx"> </span><span class="cx"> result = util.HistoryArraySet() </span><span class="cx"> if len(mappers): </span><span class="lines">@@ -247,7 +248,7 @@ </span><span class="cx"> row = cursor.fetchone() </span><span class="cx"> if row is None: </span><span class="cx"> break </span><del>- self._instance(row, imap, result) </del><ins>+ self._instance(row, imap, result, populate_existing=populate_existing) </ins><span class="cx"> i = 0 </span><span class="cx"> for m in mappers: </span><span class="cx"> m._instance(row, imap, otherresults[i]) </span><span class="lines">@@ -270,21 +271,25 @@ </span><span class="cx"> #print "key: " + repr(key) + " ident: " + repr(ident) </span><span class="cx"> return self._get(key, ident) </span><span class="cx"> </span><del>- def _get(self, key, ident=None): </del><ins>+ def _get(self, key, ident=None, reload=False): + if not reload: + try: + return objectstore.get_session()._get(key) + except KeyError: + pass + + if ident is None: + ident = key[1] + i = 0 + params = {} + for primary_key in self.pks_by_table[self.table]: + params["pk_"+primary_key.key] = ident[i] + i += 1 </ins><span class="cx"> try: </span><del>- return objectstore.get_session()._get(key) - except KeyError: - if ident is None: - ident = key[2] - i = 0 - params = {} - for primary_key in self.pks_by_table[self.table]: - params["pk_"+primary_key.key] = ident[i] - i += 1 - try: - return self.select(self._get_clause, params=params)[0] - except IndexError: - return None </del><ins>+ statement = self._compile(self._get_clause) + return self._select_statement(statement, params=params, populate_existing=reload)[0] + except IndexError: + return None </ins><span class="cx"> </span><span class="cx"> </span><span class="cx"> def identity_key(self, *primary_key): </span><span class="lines">@@ -449,10 +454,7 @@ </span><span class="cx"> </span><span class="cx"> def select_whereclause(self, whereclause=None, params=None, **kwargs): </span><span class="cx"> statement = self._compile(whereclause, **kwargs) </span><del>- if params is not None: - return self.select_statement(statement, **params) - else: - return self.select_statement(statement) </del><ins>+ return self._select_statement(statement, params=params) </ins><span class="cx"> </span><span class="cx"> def count(self, whereclause=None, params=None, **kwargs): </span><span class="cx"> s = self.table.count(whereclause) </span><span class="lines">@@ -462,13 +464,18 @@ </span><span class="cx"> return s.scalar() </span><span class="cx"> </span><span class="cx"> def select_statement(self, statement, **params): </span><del>- statement.use_labels = True - return self.instances(statement.execute(**params)) </del><ins>+ return self._select_statement(statement, params=params) </ins><span class="cx"> </span><span class="cx"> def select_text(self, text, **params): </span><span class="cx"> t = sql.text(text, engine=self.primarytable.engine) </span><span class="cx"> return self.instances(t.execute(**params)) </span><span class="cx"> </span><ins>+ def _select_statement(self, statement, params=None, **kwargs): + statement.use_labels = True + if params is None: + params = {} + return self.instances(statement.execute(**params), **kwargs) + </ins><span class="cx"> def _getpropbycolumn(self, column): </span><span class="cx"> try: </span><span class="cx"> prop = self.columntoproperty[column.original] </span><span class="lines">@@ -722,11 +729,10 @@ </span><span class="cx"> </span><span class="cx"> isnew = False </span><span class="cx"> if populate_existing: </span><del>- isnew = not imap.has_key(identitykey) - if isnew: </del><ins>+ if not imap.has_key(identitykey): </ins><span class="cx"> imap[identitykey] = instance </span><span class="cx"> for prop in self.props.values(): </span><del>- prop.execute(instance, row, identitykey, imap, isnew) </del><ins>+ prop.execute(instance, row, identitykey, imap, True) </ins><span class="cx"> </span><span class="cx"> if self.extension.append_result(self, row, imap, result, instance, isnew, populate_existing=populate_existing): </span><span class="cx"> if result is not None: </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingobjectstorepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py (1078 => 1079)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-02 00:44:18 UTC (rev 1078) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/objectstore.py 2006-03-02 01:45:31 UTC (rev 1079) </span><span class="lines">@@ -144,6 +144,10 @@ </span><span class="cx"> if self.parent_uow is None: </span><span class="cx"> self.uow.commit() </span><span class="cx"> </span><ins>+ def refresh(self, *obj): + for o in obj: + self.uow.refresh(o) + </ins><span class="cx"> def register_clean(self, obj): </span><span class="cx"> self._bind_to(obj) </span><span class="cx"> self.uow.register_clean(obj) </span><span class="lines">@@ -221,6 +225,11 @@ </span><span class="cx"> current mapped object instances, as they are no longer in the Identity Map.""" </span><span class="cx"> get_session().clear() </span><span class="cx"> </span><ins>+def refresh(*obj): + """reloads the state of this object from the database, and cancels any in-memory + changes.""" + get_session().refresh(*obj) + </ins><span class="cx"> def delete(*obj): </span><span class="cx"> """registers the given objects as to be deleted upon the next commit""" </span><span class="cx"> s = get_session().delete(*obj) </span><span class="lines">@@ -308,6 +317,10 @@ </span><span class="cx"> def _put(self, key, obj): </span><span class="cx"> self.identity_map[key] = obj </span><span class="cx"> </span><ins>+ def refresh(self, obj): + self.rollback_object(obj) + object_mapper(obj)._get(obj._instance_key, reload=True) + </ins><span class="cx"> def has_key(self, key): </span><span class="cx"> """returns True if the given key is present in this UnitOfWork's identity map.""" </span><span class="cx"> return self.identity_map.has_key(key) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyutilpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/util.py (1078 => 1079)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-03-02 00:44:18 UTC (rev 1078) +++ sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-03-02 01:45:31 UTC (rev 1079) </span><span class="lines">@@ -327,6 +327,10 @@ </span><span class="cx"> self.records = {} </span><span class="cx"> for l in list: </span><span class="cx"> self.append_nohistory(l) </span><ins>+ def clear(self): + """clears the list and removes all history.""" + self.data[:] = [] + self.records = {} </ins><span class="cx"> def added_items(self): </span><span class="cx"> """returns a list of items that have been added since the last "committed" state.""" </span><span class="cx"> return [key for key in self.data if self.records[key] is True] </span></span></pre> </div> </div> </body> </html> |