From: Michael D. <mik...@us...> - 2004-04-28 03:46:59
|
Update of /cvsroot/nhibernate/nhibernate/src/NHibernate/Persister In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14548/NHibernate/Persister Modified Files: EntityPersister.cs NormalizedEntityPersister.cs Log Message: Added support for sending one command to the db to handle the Insert and retrieval of the Id. Fixed the sql being generated by NormalizedEntityPersister when a native Id is used. Index: NormalizedEntityPersister.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Persister/NormalizedEntityPersister.cs,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** NormalizedEntityPersister.cs 26 Apr 2004 03:46:00 -0000 1.16 --- NormalizedEntityPersister.cs 28 Apr 2004 03:46:51 -0000 1.17 *************** *** 610,615 **** //if (IsPolymorphic) builder.AddColumn(DiscriminatorColumnName, DiscriminatorSQLString); ! if(identityInsert && j==0) { ! builder.AddColumn(tableKeyColumns[j][0], dialect.IdentityInsertString); } --- 610,622 ---- //if (IsPolymorphic) builder.AddColumn(DiscriminatorColumnName, DiscriminatorSQLString); ! if(identityInsert && j==0) ! { ! // make sure the Dialect has an identity insert string because we don't want ! // to add the column when there is no value to supply the SqlBuilder ! if(dialect.IdentityInsertString!=null) ! { ! // only 1 column if there is IdentityInsert enabled. ! builder.AddColumn(tableKeyColumns[j][0], dialect.IdentityInsertString); ! } } *************** *** 850,855 **** /// <param name="session"></param> /// <returns></returns> ! public override object Insert(object[] fields, object obj, ISessionImplementor session) { ! if (log.IsDebugEnabled) { log.Debug("Inserting entity: " + ClassName + " (native id)"); if ( IsVersioned ) log.Debug( "Version: " + Versioning.GetVersion(fields, this) ); --- 857,864 ---- /// <param name="session"></param> /// <returns></returns> ! public override object Insert(object[] fields, object obj, ISessionImplementor session) ! { ! if (log.IsDebugEnabled) ! { log.Debug("Inserting entity: " + ClassName + " (native id)"); if ( IsVersioned ) log.Debug( "Version: " + Versioning.GetVersion(fields, this) ); *************** *** 858,894 **** SqlString[] sqlStrings = SqlIdentityInsertStrings; ! IDbCommand statement = session.Preparer.PrepareCommand(sqlStrings[0]); ! try { Dehydrate(null, fields, allProperties, 0, statement, session); - statement.ExecuteNonQuery(); } ! catch (Exception e) { ! throw e; } - finally { - //session.Batcher.CloseStatement(statement); - } ! // fetch the generated id: ! IDbCommand idSelect = session.Preparer.PrepareCommand(SqlIdentitySelect); - object id; - try { IDataReader rs = idSelect.ExecuteReader(); ! try { if ( !rs.Read() ) throw new HibernateException("The database returned no natively generated identity value"); ! id = IdentifierGeneratorFactory.Get(rs, IdentifierType.ReturnedClass ); } ! finally { rs.Close(); } log.Debug("Natively generated identity: " + id); } ! catch (Exception e) { throw e; } ! finally { ! //session.Batcher.CloseStatement(idselect); } --- 867,926 ---- SqlString[] sqlStrings = SqlIdentityInsertStrings; ! IDbCommand statement = null; ! IDbCommand idSelect = null; ! object id; ! ! if(dialect.SupportsIdentitySelectInInsert) ! { ! statement = session.Preparer.PrepareCommand( dialect.AddIdentitySelectToInsert(SqlIdentityInsertStrings[0]) ); ! idSelect = statement; ! } ! else ! { ! statement = session.Preparer.PrepareCommand(SqlIdentityInsertStrings[0]); ! idSelect = session.Preparer.PrepareCommand(SqlIdentitySelect); ! } ! ! try ! { Dehydrate(null, fields, allProperties, 0, statement, session); } ! catch (Exception e) ! { ! throw new HibernateException("NormalizedEntityPersister had a problem Dehydrating for an Insert", e); } ! try ! { ! // if it doesn't support identity select in insert then we have to issue the Insert ! // as a seperate command here ! if(dialect.SupportsIdentitySelectInInsert==false) ! { ! statement.ExecuteNonQuery(); ! } IDataReader rs = idSelect.ExecuteReader(); ! try ! { if ( !rs.Read() ) throw new HibernateException("The database returned no natively generated identity value"); ! id = IdentifierGeneratorFactory.Get( rs, IdentifierType.ReturnedClass ); } ! finally ! { rs.Close(); } + log.Debug("Natively generated identity: " + id); + } ! catch (Exception e) ! { throw e; } ! finally ! { ! // session.Batcher.CloseStatement(statement); ! // session.Batcher.CloseStatement(idselect); } Index: EntityPersister.cs =================================================================== RCS file: /cvsroot/nhibernate/nhibernate/src/NHibernate/Persister/EntityPersister.cs,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** EntityPersister.cs 26 Apr 2004 03:46:00 -0000 1.16 --- EntityPersister.cs 28 Apr 2004 03:46:51 -0000 1.17 *************** *** 667,706 **** } ! IDbCommand statement = session.Preparer.PrepareCommand(SqlIdentityInsertString); ! try { Dehydrate(null, fields, PropertyInsertability, statement, session); - statement.ExecuteNonQuery(); } ! catch (Exception e) { ! throw e; } - finally { - //session.Batcher.CloseStatement(statement); - } ! // fetch the generated id: ! IDbCommand idSelect = session.Preparer.PrepareCommand(SqlIdentitySelect); - try { IDataReader rs = idSelect.ExecuteReader(); object id; ! try { if ( !rs.Read() ) throw new HibernateException("The database returned no natively generated identity value"); id = IdentifierGeneratorFactory.Get( rs, IdentifierType.ReturnedClass ); } ! finally { rs.Close(); } log.Debug("Natively generated identity: " + id); return id; } ! catch (Exception e) { throw e; } ! finally { ! //session.Batcher.CloseStatement(idselect); } } --- 667,727 ---- } ! IDbCommand statement = null; ! IDbCommand idSelect = null; + if(dialect.SupportsIdentitySelectInInsert) + { + statement = session.Preparer.PrepareCommand( dialect.AddIdentitySelectToInsert(SqlIdentityInsertString) ); + idSelect = statement; + } + else + { + statement = session.Preparer.PrepareCommand(SqlIdentityInsertString); + idSelect = session.Preparer.PrepareCommand(SqlIdentitySelect); + } ! ! try ! { Dehydrate(null, fields, PropertyInsertability, statement, session); } ! catch (Exception e) ! { ! throw new HibernateException("EntityPersister had a problem Dehydrating for an Insert", e); } ! try ! { ! // if it doesn't support identity select in insert then we have to issue the Insert ! // as a seperate command here ! if(dialect.SupportsIdentitySelectInInsert==false) ! { ! statement.ExecuteNonQuery(); ! } IDataReader rs = idSelect.ExecuteReader(); object id; ! try ! { if ( !rs.Read() ) throw new HibernateException("The database returned no natively generated identity value"); id = IdentifierGeneratorFactory.Get( rs, IdentifierType.ReturnedClass ); } ! finally ! { rs.Close(); } + log.Debug("Natively generated identity: " + id); return id; } ! catch (Exception e) ! { throw e; } ! finally ! { ! // session.Batcher.CloseStatement(statement); ! // session.Batcher.CloseStatement(idselect); } } |