[Sqlalchemy-commits] [1209] sqlalchemy/trunk/lib/sqlalchemy: util: the __setitem__ method on history
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-03-26 06:26:17
|
<!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>[1209] sqlalchemy/trunk/lib/sqlalchemy: util: the __setitem__ method on historyarraylist was meaningless, surprising nobody noticed that.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1209</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-03-26 00:26:02 -0600 (Sun, 26 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>util: the __setitem__ method on historyarraylist was meaningless, surprising nobody noticed that. types: added PickleType, its slightly trickier than trivial, so OK now its standard. attributes: the level of pain if an AttributeError occurs inside a CallableProp, in combination with an object that implements __getattr__, is too deep for me to put the users through....so convert AttributeErrors to Assertions... engine: im not a fan of catching universal exceptions and squashing them</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyattributespy">sqlalchemy/trunk/lib/sqlalchemy/attributes.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyenginepy">sqlalchemy/trunk/lib/sqlalchemy/engine.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemytypespy">sqlalchemy/trunk/lib/sqlalchemy/types.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 (1208 => 1209)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-25 21:44:42 UTC (rev 1208) +++ sqlalchemy/trunk/lib/sqlalchemy/attributes.py 2006-03-26 06:26:02 UTC (rev 1209) </span><span class="lines">@@ -214,7 +214,12 @@ </span><span class="cx"> if passive: </span><span class="cx"> value = None </span><span class="cx"> else: </span><del>- value = self.callable_() </del><ins>+ try: + value = self.callable_() + except AttributeError, e: + # this catch/raise is because this call is frequently within an + # AttributeError-sensitive callstack + raise AssertionError("AttributeError caught in callable prop:" + str(e.args)) </ins><span class="cx"> self.obj.__dict__[self.key] = value </span><span class="cx"> </span><span class="cx"> p = PropHistory(self.obj, self.key, **self.kwargs) </span><span class="lines">@@ -223,11 +228,15 @@ </span><span class="cx"> if passive: </span><span class="cx"> value = None </span><span class="cx"> else: </span><del>- value = self.callable_() </del><ins>+ try: + value = self.callable_() + except AttributeError, e: + # this catch/raise is because this call is frequently within an + # AttributeError-sensitive callstack + raise AssertionError("AttributeError caught in callable prop:" + str(e.args)) </ins><span class="cx"> else: </span><span class="cx"> value = None </span><span class="cx"> p = self.manager.create_list(self.obj, self.key, value, readonly=self.live, **self.kwargs) </span><del>- </del><span class="cx"> if not self.live and not passive: </span><span class="cx"> # set the new history list as the new attribute, discards ourself </span><span class="cx"> self.manager.attribute_history(self.obj)[self.key] = p </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyenginepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/engine.py (1208 => 1209)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-25 21:44:42 UTC (rev 1208) +++ sqlalchemy/trunk/lib/sqlalchemy/engine.py 2006-03-26 06:26:02 UTC (rev 1209) </span><span class="lines">@@ -852,10 +852,10 @@ </span><span class="cx"> def __getitem__(self, key): </span><span class="cx"> return self.__parent._get_col(self.__row, key) </span><span class="cx"> def __getattr__(self, name): </span><del>- try: - return self.__parent._get_col(self.__row, name) - except: - raise AttributeError </del><ins>+ #try: + return self.__parent._get_col(self.__row, name) + #except: + # raise AttributeError </ins><span class="cx"> def items(self): </span><span class="cx"> return [(key, getattr(self, key)) for key in self.keys()] </span><span class="cx"> def keys(self): </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1208 => 1209)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-25 21:44:42 UTC (rev 1208) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-03-26 06:26:02 UTC (rev 1209) </span><span class="lines">@@ -812,7 +812,6 @@ </span><span class="cx"> list. if the instance already exists in the given identity map, its not added. in </span><span class="cx"> either case, executes all the property loaders on the instance to also process extra </span><span class="cx"> information in the row.""" </span><del>- </del><span class="cx"> # look in main identity map. if its there, we dont do anything to it, </span><span class="cx"> # including modifying any of its related items lists, as its already </span><span class="cx"> # been exposed to being modified by the application. </span><span class="lines">@@ -830,7 +829,6 @@ </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 class="cx"> result.append_nohistory(instance) </span><del>- </del><span class="cx"> return instance </span><span class="cx"> </span><span class="cx"> # look in result-local identitymap for it. </span><span class="lines">@@ -857,11 +855,9 @@ </span><span class="cx"> # instances from the row and possibly populate this item. </span><span class="cx"> if self.extension.populate_instance(self, instance, row, identitykey, imap, isnew): </span><span class="cx"> self.populate_instance(instance, row, identitykey, imap, isnew, translate=False) </span><del>- </del><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 class="cx"> result.append_nohistory(instance) </span><del>- </del><span class="cx"> return instance </span><span class="cx"> </span><span class="cx"> def populate_instance(self, instance, row, identitykey, imap, isnew, translate=True): </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemytypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/types.py (1208 => 1209)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/types.py 2006-03-25 21:44:42 UTC (rev 1208) +++ sqlalchemy/trunk/lib/sqlalchemy/types.py 2006-03-26 06:26:02 UTC (rev 1209) </span><span class="lines">@@ -7,12 +7,16 @@ </span><span class="cx"> __all__ = [ 'TypeEngine', 'TypeDecorator', 'NullTypeEngine', </span><span class="cx"> 'INT', 'CHAR', 'VARCHAR', 'TEXT', 'FLOAT', 'DECIMAL', </span><span class="cx"> 'TIMESTAMP', 'DATETIME', 'CLOB', 'BLOB', 'BOOLEAN', 'String', 'Integer', 'Smallinteger', </span><del>- 'Numeric', 'Float', 'DateTime', 'Date', 'Time', 'Binary', 'Boolean', 'Unicode', 'NULLTYPE', </del><ins>+ 'Numeric', 'Float', 'DateTime', 'Date', 'Time', 'Binary', 'Boolean', 'Unicode', 'PickleType', 'NULLTYPE', </ins><span class="cx"> 'SMALLINT', 'DATE', 'TIME' </span><span class="cx"> ] </span><span class="cx"> </span><span class="cx"> import sqlalchemy.util as util </span><del>- </del><ins>+try: + import cPickle as pickle +except: + import pickle + </ins><span class="cx"> class TypeEngine(object): </span><span class="cx"> basetypes = [] </span><span class="cx"> def __init__(self, *args, **kwargs): </span><span class="lines">@@ -142,6 +146,22 @@ </span><span class="cx"> def get_constructor_args(self): </span><span class="cx"> return {'length':self.length} </span><span class="cx"> </span><ins>+class PickleType(Binary): + def __init__(self, protocol=pickle.HIGHEST_PROTOCOL): + """allows the pickle protocol to be specified""" + self.protocol = protocol + def convert_result_value(self, value, engine): + if value is None: + return None + buf = Binary.convert_result_value(self, value, engine) + return pickle.loads(str(buf)) + def convert_bind_param(self, value, engine): + if value is None: + return None + return Binary.convert_bind_param(self, pickle.dumps(value, self.protocol), engine) + def get_constructor_args(self): + return {} + </ins><span class="cx"> class Boolean(TypeEngine): </span><span class="cx"> pass </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyutilpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/util.py (1208 => 1209)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-03-25 21:44:42 UTC (rev 1208) +++ sqlalchemy/trunk/lib/sqlalchemy/util.py 2006-03-26 06:26:02 UTC (rev 1209) </span><span class="lines">@@ -397,7 +397,7 @@ </span><span class="cx"> def has_item(self, item): </span><span class="cx"> return self.records.has_key(item) </span><span class="cx"> def __setitem__(self, i, item): </span><del>- if self._setrecord(a): </del><ins>+ if self._setrecord(item): </ins><span class="cx"> self.data[i] = item </span><span class="cx"> def __delitem__(self, i): </span><span class="cx"> self._delrecord(self.data[i]) </span></span></pre> </div> </div> </body> </html> |