init lserp cs 5.0
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Text;
|
||||
|
||||
using Zhaizj.Framework.Data;
|
||||
using Zhaizj.Framework.Log;
|
||||
using Zhaizj.Framework.ORM.Caching;
|
||||
|
||||
namespace Zhaizj.Framework.ORM.Operation {
|
||||
|
||||
internal class UpdateOperation {
|
||||
|
||||
private static readonly ILog logger = LogManager.GetLogger( typeof( UpdateOperation ) );
|
||||
|
||||
public static Result Update( IEntity obj ) {
|
||||
if (obj == null) throw new ArgumentNullException();
|
||||
EntityInfo ei = Entity.GetInfo( obj );
|
||||
return Update( obj, ei );
|
||||
}
|
||||
|
||||
private static Result Update( IEntity obj, EntityInfo entityInfo ) {
|
||||
Result result = Validator.Validate( obj, "update" );
|
||||
if (result.IsValid == false) return result;
|
||||
|
||||
List<IInterceptor> ilist = MappingClass.Instance.InterceptorList;
|
||||
for (int i = 0; i < ilist.Count; i++) {
|
||||
ilist[i].BeforUpdate( obj );
|
||||
}
|
||||
|
||||
updateSingle( obj, entityInfo );
|
||||
if (entityInfo.Parent != null) {
|
||||
IEntity objParent = Entity.New( entityInfo.Parent.Type.FullName );
|
||||
setParentValueFromChild( objParent, obj );
|
||||
updateSingle( objParent, Entity.GetInfo( objParent ) );
|
||||
}
|
||||
CacheUtil.CheckCountCache( "insert", obj, entityInfo );
|
||||
|
||||
|
||||
for (int i = 0; i < ilist.Count; i++) {
|
||||
ilist[i].AfterUpdate( obj );
|
||||
}
|
||||
result.Info = obj;
|
||||
|
||||
// update cache timestamp
|
||||
CacheTime.updateTable( entityInfo.Type );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void Update( IEntity obj, String[] arrPropertyName ) {
|
||||
if (obj == null) throw new ArgumentNullException();
|
||||
Update( obj, arrPropertyName, Entity.GetInfo( obj ) );
|
||||
}
|
||||
|
||||
public static void Update( IEntity obj, String[] arrPropertyName, EntityInfo entityInfo ) {
|
||||
if (obj == null) throw new ArgumentNullException();
|
||||
StringBuilder builder = new StringBuilder( String.Empty );
|
||||
builder.Append( "update " );
|
||||
builder.Append( entityInfo.TableName );
|
||||
builder.Append( " set " );
|
||||
|
||||
for (int i = 0; i < arrPropertyName.Length; i++) {
|
||||
String columnName = entityInfo.GetColumnName( arrPropertyName[i] );
|
||||
builder.Append( columnName );
|
||||
builder.Append( "=" );
|
||||
builder.Append( entityInfo.Dialect.GetParameter( columnName ) );
|
||||
builder.Append( "," );
|
||||
}
|
||||
builder.Append( " where Id=" );
|
||||
builder.Append( entityInfo.Dialect.GetParameter( "Id" ) );
|
||||
|
||||
String commandText = builder.ToString().Replace( ", where", " where" );
|
||||
logger.Info( LoggerUtil.SqlPrefix+entityInfo.Name + "[" + entityInfo.TableName + "] Update Sql:" + commandText );
|
||||
|
||||
List<IInterceptor> ilist = MappingClass.Instance.InterceptorList;
|
||||
for (int i = 0; i < ilist.Count; i++) {
|
||||
ilist[i].BeforUpdate( obj );
|
||||
}
|
||||
|
||||
IDbCommand cmd = DataFactory.GetCommand( commandText, DbContext.getConnection( entityInfo ) );
|
||||
for (int i = 0; i < arrPropertyName.Length; i++) {
|
||||
Object parameterValue = obj.get( arrPropertyName[i] );
|
||||
String columnName = entityInfo.GetColumnName( arrPropertyName[i] );
|
||||
DataFactory.SetParameter( cmd, columnName, parameterValue );
|
||||
}
|
||||
int id = obj.Id;
|
||||
DataFactory.SetParameter( cmd, "Id", id );
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
for (int i = 0; i < ilist.Count; i++) {
|
||||
ilist[i].AfterUpdate( obj );
|
||||
}
|
||||
|
||||
// update cache timestamp
|
||||
CacheTime.updateTable( entityInfo.Type );
|
||||
|
||||
|
||||
CacheUtil.CheckCountCache( "insert", obj, entityInfo );
|
||||
}
|
||||
|
||||
public static void UpdateBatch( IEntity obj, String action, String condition ) {
|
||||
if (obj == null) throw new ArgumentNullException();
|
||||
UpdateBatch( obj, action, condition, Entity.GetInfo( obj ) );
|
||||
}
|
||||
|
||||
private static int UpdateBatch( IEntity obj, String action, String condition, EntityInfo entityInfo ) {
|
||||
if (obj == null) throw new ArgumentNullException();
|
||||
if (strUtil.IsNullOrEmpty( action )) {
|
||||
logger.Info( "no sql is executed : action String is empty" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
//action = action.Trim().ToLower();
|
||||
//if (!action.StartsWith( "set" )) {
|
||||
// action = "set " + action;
|
||||
//}
|
||||
|
||||
// http://www.Zhaizj.Framework.com/rubywu
|
||||
// http://www.Zhaizj.Framework.com/Forum1/Topic/1706
|
||||
if (!action.Trim().ToLower().StartsWith( "set" )) {
|
||||
action = "set " + action;
|
||||
}
|
||||
|
||||
condition = condition.Trim().ToLower();
|
||||
if (!condition.StartsWith( "where" )) {
|
||||
condition = "where " + condition;
|
||||
}
|
||||
|
||||
String sql = String.Format( "update {0} {1} {2}", entityInfo.TableName, action, condition );
|
||||
logger.Info(LoggerUtil.SqlPrefix+ "update sql : " + sql );
|
||||
|
||||
List<IInterceptor> ilist = MappingClass.Instance.InterceptorList;
|
||||
for (int i = 0; i < ilist.Count; i++) {
|
||||
ilist[i].BeforUpdateBatch( obj.GetType(), action, condition );
|
||||
}
|
||||
|
||||
IDbCommand cmd = DataFactory.GetCommand( sql, DbContext.getConnection( entityInfo ) );
|
||||
int rowAffected = cmd.ExecuteNonQuery();
|
||||
logger.Info( "update : " + rowAffected + " records affected" );
|
||||
|
||||
for (int i = 0; i < ilist.Count; i++) {
|
||||
ilist[i].AfterUpdateBatch( obj.GetType(), action, condition );
|
||||
}
|
||||
|
||||
// update cache timestamp
|
||||
CacheTime.updateTable( entityInfo.Type );
|
||||
|
||||
return rowAffected;
|
||||
}
|
||||
|
||||
private static void updateSingle( IEntity obj, EntityInfo entityInfo ) {
|
||||
|
||||
IDbCommand cmd = DataFactory.GetCommand( getUpdateSql( entityInfo ), DbContext.getConnection( entityInfo ) );
|
||||
OrmHelper.SetParameters( cmd, "update", obj, entityInfo );
|
||||
DataFactory.SetParameter( cmd, "Id", obj.Id );
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
private static String getUpdateSql( EntityInfo entityInfo ) {
|
||||
StringBuilder builder = new StringBuilder( "update " );
|
||||
builder.Append( entityInfo.TableName );
|
||||
builder.Append( " set " );
|
||||
for (int i = 0; i < entityInfo.SavedPropertyList.Count; i++) {
|
||||
EntityPropertyInfo info = entityInfo.SavedPropertyList[i];
|
||||
if (((info.Name.ToLower() != "id") && info.SaveToDB) && !info.IsList) {
|
||||
builder.Append( info.ColumnName );
|
||||
builder.Append( "=" );
|
||||
builder.Append( entityInfo.Dialect.GetParameter( info.ColumnName ) );
|
||||
builder.Append( ", " );
|
||||
}
|
||||
}
|
||||
builder.Remove( builder.Length - 2, 2 );
|
||||
builder.Append( " where Id=" );
|
||||
builder.Append( entityInfo.Dialect.GetParameter( "Id" ) );
|
||||
logger.Info( LoggerUtil.SqlPrefix+" [update sql] " + builder.ToString() );
|
||||
return builder.ToString();
|
||||
}
|
||||
|
||||
private static void setParentValueFromChild( IEntity objParent, IEntity objChild ) {
|
||||
List<EntityPropertyInfo> eplist = Entity.GetInfo( objParent ).SavedPropertyList;
|
||||
foreach (EntityPropertyInfo info in eplist) {
|
||||
objParent.set( info.Name, objChild.get( info.Name ) );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user