- sending None as an argument to func.<something> will produce
an argument of NULL
- orm:
+ - corresponding to label/bindparam name generataion, eager loaders
+ generate deterministic names for the aliases they create using
+ md5 hashes.
- improved/fixed custom collection classes when giving it "set"/
"sets.Set" classes or subclasses (was still looking for append()
methods on them during lazy loads)
"""
def __init__(self, eagerloader, parentclauses=None):
+ self.id = (parentclauses is not None and (parentclauses.id + "/") or '') + str(eagerloader.parent_property)
self.parent = eagerloader
self.target = eagerloader.select_table
- self.eagertarget = eagerloader.select_table.alias()
+ self.eagertarget = eagerloader.select_table.alias(self._aliashash("/target"))
if eagerloader.secondary:
- self.eagersecondary = eagerloader.secondary.alias()
+ self.eagersecondary = eagerloader.secondary.alias(self._aliashash("/secondary"))
self.aliasizer = sql_util.Aliasizer(eagerloader.target, eagerloader.secondary, aliases={
eagerloader.target:self.eagertarget,
eagerloader.secondary:self.eagersecondary
self.eager_order_by = None
self._row_decorator = self._create_decorator_row()
-
+
+ def _aliashash(self, extra):
+ """return a deterministic 4 digit hash value for this AliasedClause's id + extra."""
+ # use the first 4 digits of an MD5 hash
+ return "anon_" + util.hash(self.id + extra)[0:4]
+
def _aliasize_orderby(self, orderby, copy=True):
if copy:
return self.aliasizer.copy_and_process(util.to_list(orderby))
import dummy_thread as thread
import dummy_threading as threading
+import md5
+
import __builtin__
try:
else:
yield elem
+def hash(string):
+ """return an md5 hash of the given string."""
+ h = md5.new()
+ h.update(string)
+ return h.hexdigest()
+
class ArgSingleton(type):
instances = {}