From: Paul H. <pha...@us...> - 2005-03-30 16:29:45
|
Update of /cvsroot/nhibernate/nhibernate/src/NHibernate/Persister In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21350/nhibernate/src/NHibernate/Persister Modified Files: AbstractEntityPersister.cs IClassPersister.cs Log Message: Implemented Copy, enhanced versioning, support named query/sql-query Index: IClassPersister.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Persister/IClassPersister.cs,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** IClassPersister.cs 26 Mar 2005 13:24:37 -0000 1.12 --- IClassPersister.cs 30 Mar 2005 16:29:02 -0000 1.13 *************** *** 98,106 **** /// <summary> ! /// Does the given identifier value indicate that this is a new transient instance? /// </summary> ! /// <param name="id"></param> /// <returns></returns> ! bool IsUnsaved( object id ); /// <summary> --- 98,113 ---- /// <summary> ! /// Is this a new transient instance? /// </summary> ! /// <param name="obj"></param> /// <returns></returns> ! bool IsUnsaved( object obj ); ! ! /// <summary> ! /// Does this object have the default version ! /// </summary> ! /// <param name="obj"></param> ! /// <returns></returns> ! bool IsDefaultVersion( object obj ); /// <summary> Index: AbstractEntityPersister.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Persister/AbstractEntityPersister.cs,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** AbstractEntityPersister.cs 28 Mar 2005 15:20:42 -0000 1.38 --- AbstractEntityPersister.cs 30 Mar 2005 16:29:00 -0000 1.39 *************** *** 94,98 **** private readonly IGetter versionGetter; private readonly int versionProperty; ! //private Cascades.VersionValue unsavedVersionValues; //private readonly bool batchVersionData; --- 94,98 ---- private readonly IGetter versionGetter; private readonly int versionProperty; ! private Cascades.VersionValue unsavedVersionValue; //private readonly bool batchVersionData; *************** *** 564,574 **** /// /// </summary> ! /// <param name="id"></param> /// <returns></returns> ! public virtual bool IsUnsaved( object id ) { return unsavedIdentifierValue.IsUnsaved( id ); } /// <summary></summary> public virtual string[ ] PropertyNames --- 564,622 ---- /// /// </summary> ! /// <param name="obj"></param> /// <returns></returns> ! public bool IsUnsaved( object obj ) { + object id; + if ( HasIdentifierPropertyOrEmbeddedCompositeIdentifier ) + { + id = GetIdentifier( obj ); + } + else + { + id = null; + } + // we always assume a transient instance with a null + // identifier or no identifier property is unsaved! + if ( id == null ) + { + return true; + } + + if ( IsVersioned ) + { + // let this take precedence if defined, since it works for assigned identifiers + object result = unsavedVersionValue.IsUnsaved( GetVersion( obj ) ); + if ( result != null ) + { + return (bool) result; + } + } return unsavedIdentifierValue.IsUnsaved( id ); } + /// <summary> + /// + /// </summary> + /// <param name="obj"></param> + /// <returns></returns> + public bool IsDefaultVersion( object obj ) + { + // Can't quite factor this out as per IsUnsaved as the true/false decision differs + if ( IsVersioned ) + { + object result = unsavedVersionValue.IsUnsaved( GetVersion( obj ) ); + if ( result != null ) + { + return (bool) result; + } + return true; + } + else + { + return false; + } + } + /// <summary></summary> public virtual string[ ] PropertyNames *************** *** 850,854 **** } - // TODO: 2.1 Bring versioning up to standards if( model.IsVersioned ) { --- 898,901 ---- *************** *** 856,874 **** versioned = true; versionGetter = model.Version.GetGetter( mappedClass ); ! // TODO: determine if this block is kept ! // this if-else block is extra logic in nhibernate - not sure if I like it - would rather throw ! // an exception if there is a bad mapping ! if( !( model.Version.Type is IVersionType ) ) ! { ! log.Warn( model.Name + " has version column " + model.Version.Name + ", but the column type " + model.Version.Type.Name + " is not versionable" ); ! //versionPropertyName = null; ! versioned = false; ! versionType = null; ! versionGetter = null; ! } ! else ! { ! versionType = ( IVersionType ) model.Version.Type; ! } } else --- 903,907 ---- versioned = true; versionGetter = model.Version.GetGetter( mappedClass ); ! versionType = ( IVersionType ) model.Version.Type; } else *************** *** 876,881 **** //versionPropertyName = null; versioned = false; - versionType = null; versionGetter = null; } --- 909,956 ---- //versionPropertyName = null; versioned = false; versionGetter = null; + versionType = null; + } + + // VERSION UNSAVED-VALUE: + string versionUnsavedValue = null; + if ( model.IsVersioned ) + { + versionUnsavedValue = model.Version.NullValue; + } + + if ( versionUnsavedValue == null || "undefined".Equals( versionUnsavedValue ) ) + { + unsavedVersionValue = Cascades.VersionValue.VersionUndefined; + } + else if ( "null".Equals( versionUnsavedValue ) ) + { + unsavedVersionValue = Cascades.VersionValue.VersionSaveNull; + } + else if ( "negative".Equals( versionUnsavedValue ) ) + { + unsavedVersionValue = Cascades.VersionValue.VersionNegative; + /* + * used to be none and any strategies but this is kind of a nonsense for version + * especially for none since an 'update where' would be generated + * Lot's of hack to support none ? + */ + } + else + { + // NB This is NHibernate specific - needed so we can specify a default value for dates as we don't have null as a possibility + IType idType = model.Identifier.Type; + try + { + unsavedVersionValue = new Cascades.VersionValue( ( ( IVersionType ) versionType ).StringToObject( versionUnsavedValue ) ); + } + catch( InvalidCastException ) + { + throw new MappingException( "Bad version type: " + idType.GetType().Name ); + } + catch( Exception ) + { + throw new MappingException( "Could not parse version unsaved-value: " + versionUnsavedValue ); + } } |