/// <summary>
        /// Finilize all Loop Steps on Loop Break Event
        /// </summary>
        /// <param name="WfId"></param>
        /// <param name="RunId"></param>
        /// <param name="LoopGroup"></param>
        public WfStatus WorkflowLoopBreak(int WfId, int RunId, string LoopGroup)
        {
            string cmd_text = String.Format(WORKFLOW_LOOP_BREAK_QUERY,
                                            WfId,
                                            RunId,
                                            LoopGroup);
            var ret = ExecuteScalar(cmd_text);

            if (ret == null)
            {
                return(WfStatus.Failed);
            }

            return(DBStatus.DbValue((short)ret));
        }
        /// <summary>
        /// Reports execution results to the backend
        /// </summary>
        /// <param name="wfs"></param>
        /// <param name="Result"></param>
        /// <returns></returns>
        public bool WorkflowStepStatusSet(WorkflowStep wfs, WfResult Result)
        {
            if (wfs == null || wfs.RunId == 0)
            {
                throw new InvalidDataException("WorkflowStep object is not in the correct state");
            }


            short  status_id = DBStatus.WfValue(Result.StatusCode);
            string cmd_text  = String.Format(WORKFLOW_STEP_STATUS_SET_QUERY,
                                             wfs.WorkflowId,
                                             wfs.StepId,
                                             wfs.RunId,
                                             status_id,
                                             Result.ErrorCode);

            ExecuteNonQuery(cmd_text);

            return(true);
        }
        /// <summary>
        /// Finilizes the Workflow completion with backend.
        /// Perform Workflow History Cleanup based on retention policy.
        /// </summary>
        /// <param name="wf"></param>
        /// <param name="Result"></param>
        /// <returns></returns>
        public bool WorkflowFinalize(Workflow wf, WfResult Result)
        {
            if (wf == null || wf.RunId == 0)
            {
                throw new InvalidDataException("Workflow object can not be finalized");
            }


            short  status_id = DBStatus.WfValue(Result.StatusCode);
            string cmd_text  = String.Format(WORKFLOW_FINALIZE_QUERY,
                                             wf.WorkflowId,
                                             wf.RunId,
                                             status_id,
                                             wf.HistoryRetention,
                                             ((_debug) ? 1 : 0));

            ExecuteNonQuery(cmd_text);

            return(true);
        }
        /// <summary>
        /// Cancel the Batch(StepId = 0)/Step on the ExitEvent
        /// </summary>
        /// <param name="WfId"></param>
        /// <param name="StepId"></param>
        /// <param name="RunId"></param>
        /// <param name="LoopGroup"></param>
        public WfResult WorkflowExitEventCheck(int WfId, int StepId, int RunId)
        {
            string cmd_text = String.Format(WORKFLOW_EXIT_EVENT_QUERY,
                                            WfId,
                                            StepId,
                                            RunId);
            var ret = ExecuteScalar(cmd_text);

            if (ret == null)
            {
                return(WfResult.Unknown);
            }

            WfResult result;

            switch (DBStatus.DbValue((short)ret))
            {
            case WfStatus.Unknown:
            case WfStatus.Running:
                result = WfResult.Started;
                break;

            case WfStatus.Failed:
                result = WfResult.Create(WfStatus.Failed, "Canceled", 0);
                break;

            case WfStatus.Succeeded:
                result = WfResult.Create(WfStatus.Succeeded, "Canceled", 0);
                break;

            default:
                result = WfResult.Started;
                break;
            }

            return(result);
        }