Changeset 3437

Show
Ignore:
Timestamp:
08/10/07 10:55:12 (1 year ago)
Author:
pobrien
Message:

Improved the way we resolve entity references from one database to another.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Schevo/schevo/transaction.py

    r3306 r3437  
    186186 
    187187 
     188def _resolve(db, value, error_msg): 
     189    """Support function for Create transactions to resolve entity 
     190    references originating in a different database.""" 
     191    if isinstance(value, base.Entity) and value._db is not db: 
     192        entity = value 
     193        if entity._default_key is not None: 
     194            extent_name = entity.sys.extent.name 
     195            if hasattr(db, extent_name): 
     196                extent = getattr(db, extent_name) 
     197                criteria = dict( 
     198                    [(name, _resolve(db, getattr(entity, name), error_msg)) 
     199                     for name in entity._default_key]) 
     200                value = extent.findone(**criteria) 
     201                if value is not None: 
     202                    return value 
     203        raise DatabaseMismatch(error_msg) 
     204    else: 
     205        return value 
     206 
     207 
    188208_Create_Standard = 0 
    189209_Create_If_Necessary = 1 
     
    239259        msg = '"%s" field of "%s" cannot be resolved to the current database' 
    240260        for field_name, field in field_map.iteritems(): 
    241             entity = field._value 
    242             if isinstance(entity, base.Entity) and entity._db is not db: 
    243                 resolved = False 
    244                 if entity._default_key is not None: 
    245                     extent_name = entity.sys.extent.name 
    246                     if hasattr(db, extent_name): 
    247                         extent = getattr(db, extent_name) 
    248                         criteria = dict([(name, getattr(entity, name)) 
    249                                          for name in entity._default_key]) 
    250                         value = extent.findone(**criteria) 
    251                         if value is not None: 
    252                             field._value = value 
    253                             resolved = True 
    254                 if not resolved: 
    255                     raise DatabaseMismatch(msg % (field_name, entity)) 
     261            field_value = field._value 
     262            error_msg = msg % (field_name, field_value) 
     263            field._value = _resolve(db, field_value, error_msg) 
    256264        # Before execute callback. 
    257265        self._before_execute(db)