From: Michael D. <mik...@us...> - 2004-06-25 20:40:22
|
Update of /cvsroot/nhibernate/nhibernate/src/NHibernate/Impl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22440/NHibernate/Impl Modified Files: SessionImpl.cs Log Message: Changed EntityEntry to expose Properties instead of public fields so I could debug the gets & sets. Index: SessionImpl.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Impl/SessionImpl.cs,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** SessionImpl.cs 24 Jun 2004 15:29:25 -0000 1.29 --- SessionImpl.cs 25 Jun 2004 20:40:12 -0000 1.30 *************** *** 288,314 **** sealed internal class EntityEntry { ! ! internal LockMode lockMode; ! internal Status status; ! internal object id; ! internal object[] loadedState; ! internal object[] deletedState; ! internal bool existsInDatabase; ! internal object version; // for convenience to save some lookups ! [NonSerialized] internal IClassPersister persister; ! internal string className; ! public EntityEntry(Status status, object[] loadedState, object id, object version, LockMode lockMode, bool existsInDatabase, IClassPersister persister) { ! this.status = status; ! this.loadedState = loadedState; ! this.id = id; ! this.existsInDatabase = existsInDatabase; ! this.version = version; ! this.lockMode = lockMode; ! this.persister = persister; ! if (persister!=null) className = persister.ClassName; } } --- 288,369 ---- sealed internal class EntityEntry { ! private LockMode _lockMode; ! private Status _status; ! private object _id; ! private object[] _loadedState; ! private object[] _deletedState; ! private bool _existsInDatabase; ! private object _version; // for convenience to save some lookups ! [NonSerialized] private IClassPersister _persister; ! private string _className; ! public EntityEntry(Status status, object[] loadedState, object id, object version, LockMode lockMode, bool existsInDatabase, IClassPersister persister) { ! _status = status; ! _loadedState = loadedState; ! _id = id; ! _existsInDatabase = existsInDatabase; ! _version = version; ! _lockMode = lockMode; ! _persister = persister; ! if (_persister!=null) _className = _persister.ClassName; ! } ! ! ! public LockMode LockMode ! { ! get { return _lockMode; } ! set { _lockMode = value; } ! } ! ! public Status Status ! { ! get { return _status; } ! set { _status = value; } ! } ! ! public object Id ! { ! get { return _id; } ! set { _id = value; } ! } ! ! public object[] LoadedState ! { ! get { return _loadedState; } ! set { _loadedState = value; } ! } ! ! public object[] DeletedState ! { ! get { return _deletedState; } ! set { _deletedState = value; } ! } ! ! public bool ExistsInDatabase ! { ! get { return _existsInDatabase; } ! set { _existsInDatabase = value; } } + + public object Version + { + get { return _version; } + set { _version = value; } + } + + public IClassPersister Persister + { + get { return _persister; } + set { _persister = value; } + } + + public string ClassName + { + get { return _className; } + set { _className = value; } + } + } *************** *** 548,552 **** foreach(EntityEntry entry in entries.Values) { ! entry.lockMode = LockMode.None; } --- 603,607 ---- foreach(EntityEntry entry in entries.Values) { ! entry.LockMode = LockMode.None; } *************** *** 606,616 **** if (e==null) throw new TransientObjectException("Given object not associated with the session"); ! if (e.status!=Status.Loaded) throw new ObjectDeletedException("The given object was deleted", e.id); ! return e.lockMode; } public LockMode GetLockMode(object entity) { ! return GetEntry(entity).lockMode; } --- 661,671 ---- if (e==null) throw new TransientObjectException("Given object not associated with the session"); ! if (e.Status!=Status.Loaded) throw new ObjectDeletedException("The given object was deleted", e.Id); ! return e.LockMode; } public LockMode GetLockMode(object entity) { ! return GetEntry(entity).LockMode; } *************** *** 634,638 **** public void SetLockMode(object entity, LockMode lockMode) { ! GetEntry(entity).lockMode = lockMode; } --- 689,693 ---- public void SetLockMode(object entity, LockMode lockMode) { ! GetEntry(entity).LockMode = lockMode; } *************** *** 706,710 **** if ( e!=null ) { ! if ( e.status==Status.Deleted) { Flush(); --- 761,765 ---- if ( e!=null ) { ! if ( e.Status==Status.Deleted) { Flush(); *************** *** 713,717 **** { log.Debug( "object already associated with session" ); ! return e.id; } } --- 768,772 ---- { log.Debug( "object already associated with session" ); ! return e.Id; } } *************** *** 747,751 **** if ( e!=null ) { ! if ( e.status==Status.Deleted ) { Flush(); --- 802,806 ---- if ( e!=null ) { ! if ( e.Status==Status.Deleted ) { Flush(); *************** *** 753,760 **** else { ! if ( !id.Equals(e.id) ) throw new PersistentObjectException( "object passed to save() was already persistent: " + ! MessageHelper.InfoString(e.persister, id) ); log.Debug( "object already associated with session" ); --- 808,815 ---- else { ! if ( !id.Equals(e.Id) ) throw new PersistentObjectException( "object passed to save() was already persistent: " + ! MessageHelper.InfoString(e.Persister, id) ); log.Debug( "object already associated with session" ); *************** *** 795,799 **** if (old!=null) { ! if ( GetEntry(old).status==Status.Deleted) { Flush(); --- 850,854 ---- if (old!=null) { ! if ( GetEntry(old).Status==Status.Deleted) { Flush(); *************** *** 1053,1058 **** } ! return e.status==Status.Saving || ( ! earlyInsert ? !e.existsInDatabase : nullifiables.Contains( new Key(e.id, e.persister) ) ); } --- 1108,1113 ---- } ! return e.Status==Status.Saving || ( ! earlyInsert ? !e.ExistsInDatabase : nullifiables.Contains( new Key(e.Id, e.Persister) ) ); } *************** *** 1108,1116 **** log.Debug("deleting a persistent instance"); ! if ( entry.status==Status.Deleted || entry.status==Status.Gone) { log.Debug("object was already deleted"); return; } ! persister = entry.persister; } --- 1163,1171 ---- log.Debug("deleting a persistent instance"); ! if ( entry.Status==Status.Deleted || entry.Status==Status.Gone) { log.Debug("object was already deleted"); return; } ! persister = entry.Persister; } *************** *** 1121,1144 **** ); ! if ( log.IsDebugEnabled ) log.Debug( "deleting " + MessageHelper.InfoString(persister, entry.id) ); IType[] propTypes = persister.PropertyTypes; ! object version = entry.version; ! if (entry.loadedState==null ) { //ie the object came in from Update() ! entry.deletedState = persister.GetPropertyValues(theObj); } else { ! entry.deletedState = new object[entry.loadedState.Length]; ! TypeFactory.DeepCopy(entry.loadedState, propTypes, persister.PropertyUpdateability, entry.deletedState); } ! interceptor.OnDelete(theObj, entry.id, entry.deletedState, persister.PropertyNames, propTypes); ! NullifyTransientReferences(entry.deletedState, propTypes, false, theObj); ArrayList oldNullifiables = null; --- 1176,1199 ---- ); ! if ( log.IsDebugEnabled ) log.Debug( "deleting " + MessageHelper.InfoString(persister, entry.Id) ); IType[] propTypes = persister.PropertyTypes; ! object version = entry.Version; ! if (entry.LoadedState==null ) { //ie the object came in from Update() ! entry.DeletedState = persister.GetPropertyValues(theObj); } else { ! entry.DeletedState = new object[entry.LoadedState.Length]; ! TypeFactory.DeepCopy(entry.LoadedState, propTypes, persister.PropertyUpdateability, entry.DeletedState); } ! interceptor.OnDelete(theObj, entry.Id, entry.DeletedState, persister.PropertyNames, propTypes); ! NullifyTransientReferences(entry.DeletedState, propTypes, false, theObj); ArrayList oldNullifiables = null; *************** *** 1151,1157 **** } ! nullifiables.Add( new Key(entry.id, persister) ); ! entry.status = Status.Deleted; // before any callbacks, etc, so subdeletions see that this deletion happend first ! ScheduledDeletion delete = new ScheduledDeletion(entry.id, version, theObj, persister, this); deletions.Add(delete); // ensures that containing deletions happen before sub-deletions --- 1206,1212 ---- } ! nullifiables.Add( new Key(entry.Id, persister) ); ! entry.Status = Status.Deleted; // before any callbacks, etc, so subdeletions see that this deletion happend first ! ScheduledDeletion delete = new ScheduledDeletion(entry.Id, version, theObj, persister, this); deletions.Add(delete); // ensures that containing deletions happen before sub-deletions *************** *** 1228,1233 **** private void RollbackDeletion(EntityEntry entry, ScheduledDeletion delete) { ! entry.status = Status.Loaded; ! entry.deletedState = null; deletions.Remove(delete); } --- 1283,1288 ---- private void RollbackDeletion(EntityEntry entry, ScheduledDeletion delete) { ! entry.Status = Status.Loaded; ! entry.DeletedState = null; deletions.Remove(delete); } *************** *** 1389,1393 **** EntityEntry e = GetEntry(theObj); ! if (e!=null && e.status!=Status.Deleted) { // do nothing for persistent instances --- 1444,1448 ---- EntityEntry e = GetEntry(theObj); ! if (e!=null && e.Status!=Status.Deleted) { // do nothing for persistent instances *************** *** 1473,1480 **** else { ! if ( !e.id.Equals(id) ) throw new PersistentObjectException( "The instance passed to Update() was already persistent: " + ! MessageHelper.InfoString(e.persister, id) ); } --- 1528,1535 ---- else { ! if ( !e.Id.Equals(id) ) throw new PersistentObjectException( "The instance passed to Update() was already persistent: " + ! MessageHelper.InfoString(e.Persister, id) ); } *************** *** 1705,1721 **** EntityEntry e = GetEntry(obj); if (e==null) throw new TransientObjectException("attempted to lock a transient instance"); ! IClassPersister persister = e.persister; ! if ( lockMode.GreaterThan(e.lockMode) ) { ! if (e.status!=Status.Loaded) throw new TransientObjectException("attempted to lock a deleted instance"); ! if ( log.IsDebugEnabled ) log.Debug( "locking " + MessageHelper.InfoString(persister, e.id) + " in mode: " + lockMode); ! if ( persister.HasCache ) persister.Cache.Lock(e.id); try { ! persister.Lock(e.id, e.version, obj, lockMode, this); ! e.lockMode = lockMode; } catch (Exception exp) --- 1760,1776 ---- EntityEntry e = GetEntry(obj); if (e==null) throw new TransientObjectException("attempted to lock a transient instance"); ! IClassPersister persister = e.Persister; ! if ( lockMode.GreaterThan(e.LockMode) ) { ! if (e.Status!=Status.Loaded) throw new TransientObjectException("attempted to lock a deleted instance"); ! if ( log.IsDebugEnabled ) log.Debug( "locking " + MessageHelper.InfoString(persister, e.Id) + " in mode: " + lockMode); ! if ( persister.HasCache ) persister.Cache.Lock(e.Id); try { ! persister.Lock(e.Id, e.Version, obj, lockMode, this); ! e.LockMode = lockMode; } catch (Exception exp) *************** *** 1727,1731 **** // the database now holds a lock + the object is flushed from the cache, // so release the soft lock ! if ( persister.HasCache ) persister.Cache.Release(e.id); } } --- 1782,1786 ---- // the database now holds a lock + the object is flushed from the cache, // so release the soft lock ! if ( persister.HasCache ) persister.Cache.Release(e.Id); } } *************** *** 1880,1884 **** // (when this method is called) IClassPersister p = GetPersister(impl); ! return ProxyFor( p, new Key(e.id, p), impl); } --- 1935,1939 ---- // (when this method is called) IClassPersister p = GetPersister(impl); ! return ProxyFor( p, new Key(e.Id, p), impl); } *************** *** 1923,1927 **** { if (id==null) throw new NullReferenceException("null is not a valid identifier"); ! DoLoadByObject(obj, id, true); } --- 1978,1982 ---- { if (id==null) throw new NullReferenceException("null is not a valid identifier"); ! DoLoadByObject(obj, id, true, LockMode.None); } *************** *** 1968,1972 **** * as the application is concerned. */ ! private void DoLoadByObject(object obj, object id, bool checkDeleted) { System.Type clazz = obj.GetType(); --- 2023,2027 ---- * as the application is concerned. */ ! private void DoLoadByObject(object obj, object id, bool checkDeleted, LockMode lockMode) { System.Type clazz = obj.GetType(); *************** *** 1975,1979 **** MessageHelper.InfoString(clazz, id) ); ! object result = DoLoad(clazz, id, obj, LockMode.None, checkDeleted); ThrowObjectNotFound(result, id, clazz); if (result!=obj) throw new HibernateException( --- 2030,2034 ---- MessageHelper.InfoString(clazz, id) ); ! object result = DoLoad(clazz, id, obj, lockMode, checkDeleted); ThrowObjectNotFound(result, id, clazz); if (result!=obj) throw new HibernateException( *************** *** 2098,2102 **** object old = GetEntity(key); if (old!=null) { //if this object was already loaded ! Status status = GetEntry(old).status; //if ( checkDeleted && ( status==DELETED || status==GONE ) ) { if ( checkDeleted && ( status==Status.Deleted || status==Status.Gone) ) { --- 2153,2157 ---- object old = GetEntity(key); if (old!=null) { //if this object was already loaded ! Status status = GetEntry(old).Status; //if ( checkDeleted && ( status==DELETED || status==GONE ) ) { if ( checkDeleted && ( status==Status.Deleted || status==Status.Gone) ) { *************** *** 2160,2175 **** EntityEntry e = RemoveEntry(theObj); ! if ( log.IsDebugEnabled ) log.Debug( "refreshing " + MessageHelper.InfoString(e.persister, e.id) ); ! if ( !e.existsInDatabase ) throw new HibernateException("this instance does not yet exist as a row in the database"); ! Key key = new Key(e.id, e.persister); RemoveEntity( key ); try { ! e.persister.Load( e.id, theObj, lockMode, this); } catch (Exception exp) { throw new ADOException("could not refresh object", exp); } ! GetEntry(theObj).lockMode = e.lockMode; } --- 2215,2230 ---- EntityEntry e = RemoveEntry(theObj); ! if ( log.IsDebugEnabled ) log.Debug( "refreshing " + MessageHelper.InfoString(e.Persister, e.Id) ); ! if ( !e.ExistsInDatabase ) throw new HibernateException("this instance does not yet exist as a row in the database"); ! Key key = new Key(e.Id, e.Persister); RemoveEntity( key ); try { ! e.Persister.Load( e.Id, theObj, lockMode, this); } catch (Exception exp) { throw new ADOException("could not refresh object", exp); } ! GetEntry(theObj).LockMode = e.LockMode; } *************** *** 2183,2189 **** EntityEntry e = GetEntry(obj); ! IClassPersister persister = e.persister; ! object id = e.id; ! object[] hydratedState = e.loadedState; IType[] types = persister.PropertyTypes; --- 2238,2244 ---- EntityEntry e = GetEntry(obj); ! IClassPersister persister = e.Persister; ! object id = e.Id; ! object[] hydratedState = e.LoadedState; IType[] types = persister.PropertyTypes; *************** *** 2334,2344 **** public void PostInsert(object obj) { ! GetEntry(obj).existsInDatabase = true; } public void PostDelete(object obj) { EntityEntry e = RemoveEntry(obj); ! e.status = Status.Gone; ! Key key = new Key(e.id, e.persister); RemoveEntity(key); proxiesByKey.Remove(key); --- 2389,2399 ---- public void PostInsert(object obj) { ! GetEntry(obj).ExistsInDatabase = true; } public void PostDelete(object obj) { EntityEntry e = RemoveEntry(obj); ! e.Status = Status.Gone; ! Key key = new Key(e.Id, e.Persister); RemoveEntity(key); proxiesByKey.Remove(key); *************** *** 2348,2357 **** { EntityEntry e = GetEntry(obj); ! e.loadedState = updatedState; ! e.lockMode = LockMode.Write; ! if(e.persister.IsVersioned) { ! e.version = nextVersion; ! e.persister.SetPropertyValue(obj, e.persister.VersionProperty, nextVersion); } } --- 2403,2412 ---- { EntityEntry e = GetEntry(obj); ! e.LoadedState = updatedState; ! e.LockMode = LockMode.Write; ! if(e.Persister.IsVersioned) { ! e.Version = nextVersion; ! e.Persister.SetPropertyValue(obj, e.Persister.VersionProperty, nextVersion); } } *************** *** 2391,2399 **** foreach(DictionaryEntry me in iterSafeCollection) { EntityEntry entry = (EntityEntry) me.Value; ! Status status = entry.status; if (status != Status.Loading && status != Status.Gone) { object obj = me.Key; ! IClassPersister persister = entry.persister; // make sure user didn't mangle the id --- 2446,2454 ---- foreach(DictionaryEntry me in iterSafeCollection) { EntityEntry entry = (EntityEntry) me.Value; ! Status status = entry.Status; if (status != Status.Loading && status != Status.Gone) { object obj = me.Key; ! IClassPersister persister = entry.Persister; // make sure user didn't mangle the id *************** *** 2401,2409 **** object oid = persister.GetIdentifier(obj); ! if ( !entry.id.Equals(oid) ) throw new HibernateException( "identiifier of an instance of " + persister.ClassName + " altered from " + ! entry.id + " to " + oid ); --- 2456,2464 ---- object oid = persister.GetIdentifier(obj); ! if ( !entry.Id.Equals(oid) ) throw new HibernateException( "identiifier of an instance of " + persister.ClassName + " altered from " + ! entry.Id + " to " + oid ); *************** *** 2413,2417 **** if ( status==Status.Deleted) { //grab its state saved at deletion ! values = entry.deletedState; } else { --- 2468,2472 ---- if ( status==Status.Deleted) { //grab its state saved at deletion ! values = entry.DeletedState; } else { *************** *** 2434,2438 **** bool interceptorHandledDirtyCheck; ! int[] dirtyProperties = interceptor.FindDirty(obj, entry.id, values, entry.loadedState, persister.PropertyNames, types); --- 2489,2493 ---- bool interceptorHandledDirtyCheck; ! int[] dirtyProperties = interceptor.FindDirty(obj, entry.Id, values, entry.LoadedState, persister.PropertyNames, types); *************** *** 2440,2446 **** // interceptor returned null, so do the dirtycheck ourself, if possible interceptorHandledDirtyCheck = false; ! cannotDirtyCheck = entry.loadedState==null; // object loaded by update() if ( !cannotDirtyCheck ) { ! dirtyProperties = persister.FindDirty(values, entry.loadedState, obj, this); } } else { --- 2495,2501 ---- // interceptor returned null, so do the dirtycheck ourself, if possible interceptorHandledDirtyCheck = false; ! cannotDirtyCheck = entry.LoadedState==null; // object loaded by update() if ( !cannotDirtyCheck ) { ! dirtyProperties = persister.FindDirty(values, entry.LoadedState, obj, this); } } else { *************** *** 2464,2472 **** if(status == Status.Deleted) { ! log.Debug("Updating deleted entity: " + MessageHelper.InfoString(persister, entry.id) ); } else { ! log.Debug("Updating entity: " + MessageHelper.InfoString(persister, entry.id) ); } } --- 2519,2527 ---- if(status == Status.Deleted) { ! log.Debug("Updating deleted entity: " + MessageHelper.InfoString(persister, entry.Id) ); } else { ! log.Debug("Updating entity: " + MessageHelper.InfoString(persister, entry.Id) ); } } *************** *** 2474,2483 **** // give the Interceptor a chance to modify property values bool intercepted = interceptor.OnFlushDirty( ! obj, entry.id, values, entry.loadedState, persister.PropertyNames, types); //no we might need to recalculate the dirtyProperties array if(intercepted && !cannotDirtyCheck && !interceptorHandledDirtyCheck) { ! dirtyProperties = persister.FindDirty(values, entry.loadedState, obj, this); } // if the properties were modified by the Interceptor, we need to set them back to the object --- 2529,2538 ---- // give the Interceptor a chance to modify property values bool intercepted = interceptor.OnFlushDirty( ! obj, entry.Id, values, entry.LoadedState, persister.PropertyNames, types); //no we might need to recalculate the dirtyProperties array if(intercepted && !cannotDirtyCheck && !interceptorHandledDirtyCheck) { ! dirtyProperties = persister.FindDirty(values, entry.LoadedState, obj, this); } // if the properties were modified by the Interceptor, we need to set them back to the object *************** *** 2491,2498 **** //increment the version number (if necessary) ! object nextVersion = entry.version; if(persister.IsVersioned) { ! if(status!=Status.Deleted) nextVersion = Versioning.Increment(entry.version, persister.VersionType); Versioning.SetVersion(values, nextVersion, persister); } --- 2546,2553 ---- //increment the version number (if necessary) ! object nextVersion = entry.Version; if(persister.IsVersioned) { ! if(status!=Status.Deleted) nextVersion = Versioning.Increment(entry.Version, persister.VersionType); Versioning.SetVersion(values, nextVersion, persister); } *************** *** 2506,2510 **** updates.Add( ! new ScheduledUpdate(entry.id, values, dirtyProperties, entry.version, nextVersion, obj, updatedState, persister, this) ); } --- 2561,2565 ---- updates.Add( ! new ScheduledUpdate(entry.Id, values, dirtyProperties, entry.Version, nextVersion, obj, updatedState, persister, this) ); } *************** *** 2540,2544 **** { EntityEntry entry = (EntityEntry) me.Value; ! Status status = entry.status; if ( status!=Status.Loading && status!=Status.Gone && status!=Status.Deleted) --- 2595,2599 ---- { EntityEntry entry = (EntityEntry) me.Value; ! Status status = entry.Status; if ( status!=Status.Loading && status!=Status.Gone && status!=Status.Deleted) *************** *** 2548,2552 **** try { ! Cascades.Cascade(this, entry.persister, obj, Cascades.CascadingAction.ActionSaveUpdate, CascadePoint.CascadeOnUpdate); } finally --- 2603,2607 ---- try { ! Cascades.Cascade(this, entry.Persister, obj, Cascades.CascadingAction.ActionSaveUpdate, CascadePoint.CascadeOnUpdate); } finally *************** *** 2588,2592 **** EntityEntry entry = GetEntry(obj); if (entry==null) throw new TransientObjectException("the instance was not associated with this session"); ! return entry.id; } } --- 2643,2647 ---- EntityEntry entry = GetEntry(obj); if (entry==null) throw new TransientObjectException("the instance was not associated with this session"); ! return entry.Id; } } *************** *** 2620,2624 **** } else { EntityEntry entry = GetEntry(obj); ! return (entry!=null) ? entry.id : null; } } --- 2675,2679 ---- } else { EntityEntry entry = GetEntry(obj); ! return (entry!=null) ? entry.Id : null; } } *************** *** 2643,2647 **** if(entry!=null) { ! return entry.id; } else --- 2698,2702 ---- if(entry!=null) { ! return entry.Id; } else *************** *** 3544,3549 **** EntityEntry e = (EntityEntry) RemoveEntry(obj); if (e!=null) { ! RemoveEntity( new Key(e.id, e.persister) ); ! DoEvict(e.persister, obj); } } --- 3599,3604 ---- EntityEntry e = (EntityEntry) RemoveEntry(obj); if (e!=null) { ! RemoveEntity( new Key(e.Id, e.Persister) ); ! DoEvict(e.Persister, obj); } } *************** *** 3594,3598 **** public object GetVersion(object entity) { ! return GetEntry(entity).version; } --- 3649,3653 ---- public object GetVersion(object entity) { ! return GetEntry(entity).Version; } |