From: Sergey K. <jus...@us...> - 2005-03-15 11:56:46
|
Update of /cvsroot/nhibernate/nhibernate/src/NHibernate/Impl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6948/src/NHibernate/Impl Modified Files: SessionImpl.cs Log Message: * NH-230 bug fix * Implemented GetFilterTranslator closer to the H2.1 implementation * Added forgotten Flush in GetTest.GetAndModify Index: SessionImpl.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Impl/SessionImpl.cs,v retrieving revision 1.72 retrieving revision 1.73 diff -C2 -d -r1.72 -r1.73 *** SessionImpl.cs 15 Mar 2005 08:28:47 -0000 1.72 --- SessionImpl.cs 15 Mar 2005 11:56:35 -0000 1.73 *************** *** 2938,2942 **** persister.SetPropertyValues( obj, hydratedState ); - TypeFactory.DeepCopy( hydratedState, persister.PropertyTypes, persister.PropertyUpdateability, hydratedState ); if( persister.HasCache ) --- 2938,2941 ---- *************** *** 2955,2958 **** --- 2954,2961 ---- } + // after setting values to object + TypeFactory.DeepCopy( hydratedState, persister.PropertyTypes, persister.PropertyUpdateability, hydratedState ); + e.Status = Status.Loaded; + // reentrantCallback=false; if( log.IsDebugEnabled ) *************** *** 4643,4646 **** --- 4646,4651 ---- private FilterTranslator GetFilterTranslator( object collection, string filter, QueryParameters parameters, bool scalar ) { + if( collection == null ) throw new ArgumentNullException( "collection", "null collection passed to Filter" ); + if( log.IsDebugEnabled ) { *************** *** 4649,4698 **** } ! if( !( collection is PersistentCollection ) ) ! { ! collection = GetArrayHolder( collection ); ! if( collection == null ) ! { ! throw new TransientObjectException( "collection was not yet persistent" ); ! } ! } ! ! PersistentCollection coll = ( PersistentCollection ) collection; ! CollectionEntry e = GetCollectionEntry( coll ); ! if( e == null ) ! { ! throw new TransientObjectException( "collection was not persistent in this session" ); ! } ! FilterTranslator q; ! ICollectionPersister roleBeforeFlush = e.loadedPersister; if( roleBeforeFlush == null ) ! { //ie. it was previously unreferenced Flush(); ! if( e.loadedPersister == null ) { throw new QueryException( "the collection was unreferenced" ); } ! q = factory.GetFilter( filter, e.loadedPersister.Role, scalar ); } else { ! q = factory.GetFilter( filter, roleBeforeFlush.Role, scalar ); ! if( AutoFlushIfRequired( q.QuerySpaces ) && roleBeforeFlush != e.loadedPersister ) { ! if( e.loadedPersister == null ) { ! throw new QueryException( "the collection was dereferenced" ); } ! // might need to recompile the query after the flush because the collection role may have changed. ! q = factory.GetFilter( filter, e.loadedPersister.Role, scalar ); } } ! parameters.PositionalParameterValues[ 0 ] = e.loadedKey; ! parameters.PositionalParameterTypes[ 0 ] = e.loadedPersister.KeyType; ! return q; } --- 4654,4735 ---- } ! CollectionEntry entry = GetCollectionEntryOrNull( collection ); ! ICollectionPersister roleBeforeFlush = ( entry == null ) ? null : entry.loadedPersister; ! FilterTranslator filterTranslator; if( roleBeforeFlush == null ) ! { ! // if it was previously unreferenced, we need ! // to flush in order to get its state into the ! // database to query Flush(); ! entry = GetCollectionEntryOrNull( collection ); ! ICollectionPersister roleAfterFlush = ( entry == null ) ? null : entry.loadedPersister; ! ! if( roleAfterFlush == null ) { throw new QueryException( "the collection was unreferenced" ); } ! filterTranslator = factory.GetFilter( filter, roleAfterFlush.Role, scalar ); } else { ! // otherwise, we only need to flush if there are ! // in-memory changes to the queried tables ! filterTranslator = factory.GetFilter( filter, roleBeforeFlush.Role, scalar ); ! if( AutoFlushIfRequired( filterTranslator.QuerySpaces ) ) { ! // might need to run a different filter entirely after the flush ! // because the collection role may have changed ! entry = GetCollectionEntryOrNull( collection ); ! ICollectionPersister roleAfterFlush = ( entry == null ) ? null : entry.loadedPersister; ! if( roleBeforeFlush != roleAfterFlush ) { ! if( roleAfterFlush == null ) throw new QueryException( "The collection was dereferenced" ); } ! filterTranslator = factory.GetFilter( filter, roleAfterFlush.Role, scalar ); } } ! parameters.PositionalParameterValues[ 0 ] = entry.loadedKey; ! parameters.PositionalParameterTypes[ 0 ] = entry.loadedPersister.KeyType; ! return filterTranslator; ! ! } ! ! /// <summary> ! /// Get the collection entry for a collection passed to filter, ! /// which might be a collection wrapper, an array, or an unwrapped ! /// collection. Return <c>null</c> if there is no entry. ! /// </summary> ! /// <param name="collection"></param> ! /// <returns></returns> ! private CollectionEntry GetCollectionEntryOrNull( object collection ) ! { ! PersistentCollection coll; ! if ( collection is PersistentCollection ) ! { ! coll = (PersistentCollection) collection; ! } ! else ! { ! coll = GetArrayHolder( collection ); ! if ( coll == null ) ! { ! // it might be an unwrapped collection reference! ! // try to find a wrapper (slowish) ! foreach( PersistentCollection pc in collectionEntries.Keys ) ! { ! if( pc.IsWrapper( collection ) ) ! { ! coll = pc; ! break; ! } ! } ! } ! } + return (coll == null) ? null : GetCollectionEntry( coll ); } |