private TccTransactionData ConvertDataRowToTccTransactionData(DataRow dr) { TccTransactionData data = new TccTransactionData(); data.TxId = dr["TxId"].ToString(); data.ServiceAtComputer = dr["ServiceAtComputer"].ToString(); data.SchemaName = dr["TxSchema"].ToString(); data.BeginTime = Convert.ToDateTime(dr["BeginTime"]); data.TxState = (TccTransactionState)dr["TxState"]; string temp = dr["WorkState"].ToString(); string[] strs = temp.Split(new string[] { "," }, StringSplitOptions.None); TccWorkState[] states = new TccWorkState[strs.Length]; for (int i = 0; i < strs.Length; i++) { states[i] = (TccWorkState)Convert.ToInt32(strs[i]); } data.WorkStates = states; data.ContextKey = dr["ContextKey"].ToString(); data.ContextData = (byte[])dr["ContextData"]; if (dr["Error"] != DBNull.Value) { data.Error = Convert.ToString(dr["Error"]); } return(data); }
internal void RunAction(TContext context, TccAction nextAction, Action <Exception> callback) { Action <TccWorkUnitContext <TContext> > Proc; TccWorkState succState; TccWorkState failState; Tracing.InfoFmt("WorkUnit<{0}>.Run{1} State:{2}", _workName, nextAction, _state); switch (nextAction) { case TccAction.Try: if (_state != TccWorkState.None) { throw new Exception("Unexcepted WorkUnit State:" + _state); } _state = TccWorkState.Trying; Proc = Try; succState = TccWorkState.Tryed; failState = TccWorkState.TryFailed; break; case TccAction.Confirm: if (_state != TccWorkState.Tryed) { throw new Exception("Unexcepted WorkUnit State:" + _state); } Proc = Confirm; _state = TccWorkState.Confirming; succState = TccWorkState.Confirmed; failState = TccWorkState.ConfirmFailed; break; case TccAction.Cancel: if (_state != TccWorkState.Tryed && _state != TccWorkState.TryFailed) { throw new Exception("Unexcepted WorkUnit State:" + _state); } Proc = Cancel; _state = TccWorkState.Cancelling; succState = TccWorkState.Cancelled; failState = TccWorkState.CancelFailed; break; default: throw new Exception("NeverGoHere"); } int hasReturned = 0; TccWorkUnitContext <TContext> ctx = new TccWorkUnitContext <TContext>( context, delegate(Exception ex) { if (ex != null) { Tracing.ErrorFmt(ex, "WorkUnit<{0}>.Run{1} Failed in callback.", _workName, nextAction); } else { Tracing.InfoFmt("WorkUnit<{0}>.Run{1} ok.", _workName, nextAction); } if (Interlocked.CompareExchange(ref hasReturned, 1, 0) == 0) { if (ex == null) { _state = succState; callback(null); } else { _error = ex; _state = failState; callback(ex); } } else { Tracing.ErrorFmt("WorkUnit<{0}>.Run{1} callback return more than once.", _workName, nextAction); } } ); try { Proc(ctx); } catch (Exception ex) { if (Interlocked.CompareExchange(ref hasReturned, 1, 0) == 0) { Tracing.ErrorFmt(ex, "WorkUnit<{0}>.Run{1} Failed.", _workName, nextAction); _error = ex; _state = failState; callback(ex); } else { Tracing.ErrorFmt("WorkUnit<{0}>.Run{1} return more than once.", _workName, nextAction); } } }
private string WorkStatesToString(TccWorkState[] states) { StringBuilder workstates = new StringBuilder(); for (int i = 0; i < states.Length; i++) { workstates.Append((int)states[i]); if (i != states.Length - 1) workstates.Append(","); } return workstates.ToString(); }
private TccTransactionData ConvertDataRowToTccTransactionData(DataRow dr) { TccTransactionData data = new TccTransactionData(); data.TxId = dr["TxId"].ToString(); data.ServiceAtComputer = dr["ServiceAtComputer"].ToString(); data.SchemaName = dr["TxSchema"].ToString(); data.BeginTime = Convert.ToDateTime(dr["BeginTime"]); data.TxState = (TccTransactionState)dr["TxState"]; string temp = dr["WorkState"].ToString(); string[] strs = temp.Split(new string[] { "," }, StringSplitOptions.None); TccWorkState[] states = new TccWorkState[strs.Length]; for (int i = 0; i < strs.Length; i++) { states[i] = (TccWorkState)Convert.ToInt32(strs[i]); } data.WorkStates = states; data.ContextKey = dr["ContextKey"].ToString(); data.ContextData = (byte[])dr["ContextData"]; if (dr["Error"] != DBNull.Value) data.Error = Convert.ToString(dr["Error"]); return data; }