Beispiel #1
0
        /// <summary>
        /// 建表或命令段差异处理
        /// 建表时:以 @{CURR_TB} 来替代当前所建表
        /// </summary>
        /// <param name="nodeCase"></param>
        /// <returns></returns>
        public static string AnalyseCode(EM_SCRIPT_NODE_CASE nodeCase)
        {
            string retStr = "";
            string code   = "";
            string tbName = "";

            if (nodeCase == null)
            {
                return("");
            }

            //如果为建表脚本
            if (nodeCase.SCRIPT_MODEL == (short)PubEnum.ScriptModel.CreateTb)
            {
                tbName = nodeCase.E_TABLE_NAME.ToUpper();
                if (nodeCase.TABLE_TYPE == (short)PubEnum.TableType.Private)
                {
                    tbName = nodeCase.E_TABLE_NAME.ToUpper() + "_" + nodeCase.TABLE_SUFFIX;
                }

                code = nodeCase.CONTENT.ToUpper().Replace("@{CURR_TB}", tbName);
                //加入验证表是否存在
                retStr  = string.Format(@"if(is_table_exists(""{0}""))
                        drop_table(""{0}"");", tbName);
                retStr += string.Format(@"execute(""{0}"");", code);
            }
            else
            {
                return(nodeCase.CONTENT);
            }

            return(retStr);
        }
Beispiel #2
0
        /// <summary>
        /// 执行指定的脚本节点实例
        /// </summary>
        /// <param name="nodeCase">节点实例</param>
        /// <param name="err">错误信息</param>
        public static void ExcuteScriptNodeCase(EM_SCRIPT_NODE_CASE nodeCase, ref ErrorInfo err)
        {
            string classCode = "";

            #region 拼凑脚本节点实例的执行代码

            //获取节本内容
            string csharpCode = ScriptManager.AnalyseCode(nodeCase);
            //替换当前脚本流实例涉及的节点~表(公、私)
            csharpCode = ScriptManager.ReplaceTableNode(nodeCase, csharpCode);

            //拼凑自定义函数字符串(代码暂未实现)
            string csharpFun = ScriptFunManager.GetFunStr();
            //拼凑节点执行代码块
            try
            {
                classCode = GenerateCode(csharpCode, csharpFun);
            }
            catch (Exception e)
            {
                err.IsError = true;
                err.Message = e.Message;
                err.Excep   = e;
                return;
            }

            #endregion

            #region 动态编译代码

            CompilerResults cr = CompilerClass(classCode, ref err);//编译
            if (cr == null)
            {
                return;
            }

            #endregion

            #region 执行脚本

            //调用必备函数+执行实例代码
            ExcuteScriptCaseCode(cr, nodeCase, ref err);

            #endregion
        }
Beispiel #3
0
        /// <summary>
        /// 替换当前脚本流实例涉及的节点表
        /// </summary>
        /// <param name="nodeCase"></param>
        /// <param name="content"></param>
        public static string ReplaceTableNode(EM_SCRIPT_NODE_CASE nodeCase, string content)
        {
            //获取当前实例下的节点实例
            IList <EM_SCRIPT_NODE_CASE> nodeCaseList = GetAllNodeCaseByScriptCaseID(nodeCase.SCRIPT_CASE_ID);

            if (nodeCaseList != null && nodeCaseList.Count > 0)
            {
                for (int i = 0; i < nodeCaseList.Count; i++)
                {
                    var ncase = nodeCaseList[i];
                    if (ncase.SCRIPT_MODEL == (short)PubEnum.ScriptModel.CreateTb)
                    {
                        string tbName = ncase.E_TABLE_NAME;
                        if (ncase.TABLE_TYPE == (short)PubEnum.TableType.Private)
                        {
                            tbName = ncase.E_TABLE_NAME + "_" + ncase.TABLE_SUFFIX;
                        }
                        //替换占位符表
                        content = content.Replace("@{" + ncase.E_TABLE_NAME + "}", tbName);
                    }
                }
            }
            return(content);
        }
Beispiel #4
0
        /// <summary>
        /// 执行节点实例代码内容
        /// </summary>
        /// <param name="cr"></param>
        /// <param name="nodeCase"></param>
        /// <param name="err"></param>
        public static void ExcuteScriptCaseCode(CompilerResults cr, EM_SCRIPT_NODE_CASE nodeCase, ref ErrorInfo err)
        {
            // 通过反射,调用函数
            Assembly objAssembly = cr.CompiledAssembly;
            object   objScripRun = objAssembly.CreateInstance("Easyman.Service.Server.ScripRun");

            if (objScripRun == null)
            {
                err.IsError = true;
                err.Message = string.Format("未通过反射创建实例。");
                return;
            }

            //初始化节点实例相关数据Initialize()
            var initialize = objScripRun.GetType().GetMethod("Initialize").Invoke(objScripRun, new object[] { nodeCase.ID });

            //设置启动数据库编号
            var setnowdb = objScripRun.GetType().GetMethod("setnowdbid").Invoke(objScripRun, new object[] { nodeCase.DB_SERVER_ID });

            //运行脚本
            var run = objScripRun.GetType().GetMethod("Run").Invoke(objScripRun, null);

            #region   获取错误信息GetErr()

            //外部job需要接收内部错误信息
            //用于判断重试次数、用于是否再执行
            var errorMsg = objScripRun.GetType().GetMethod("GetError").Invoke(objScripRun, null);
            if (!string.IsNullOrEmpty(errorMsg.ToString()))
            {
                err.IsError = true;
                err.Message = errorMsg.ToString();
                return;
            }

            #endregion
        }
Beispiel #5
0
        /// <summary>
        /// 给指定脚本节点添加一个实例
        /// </summary>
        /// <param name="scriptNodeID"></param>
        /// <param name="scriptCaseID"></param>
        /// <param name="db"></param>
        /// <param name="err"></param>
        /// <returns></returns>
        public static EM_SCRIPT_NODE_CASE AddScriptNodeCase(long?scriptNodeID, long?scriptCaseID, DBEntities db, ref ErrorInfo err, int isFirst = 0)
        {
            if (scriptCaseID == null || scriptNodeID == null)
            {
                err.IsError = true;
                err.Message = "传入的脚本节点ID或脚本流实例ID为空";
                return(null);
            }

            var _scriptNode = new ScriptNode();

            if (isFirst == 1)
            {
                var sn = db.EM_SCRIPT_NODE.Find(scriptNodeID);
                if (sn == null)
                {
                    err.IsError = true;
                    err.Message = "未找到传入的脚本节点[" + scriptNodeID.ToString() + "]";
                    return(null);
                }
                else
                {
                    _scriptNode = Fun.ClassToCopy(sn, _scriptNode);
                }
            }
            else
            {
                //var sn = db.EM_SCRIPT_NODE_FORCASE.Find(scriptNodeID);
                var sn = db.EM_SCRIPT_NODE_FORCASE.FirstOrDefault(p => p.SCRIPT_CASE_ID == scriptCaseID && p.SCRIPT_NODE_ID == scriptNodeID);
                if (sn == null)
                {
                    err.IsError = true;
                    err.Message = "未找到传入的脚本节点[" + scriptNodeID.ToString() + "]";
                    return(null);
                }
                else
                {
                    _scriptNode = Fun.ClassToCopy(sn, _scriptNode);
                }
            }
            EM_SCRIPT_NODE_CASE scriptNodeCase = new EM_SCRIPT_NODE_CASE
            {
                ID             = Fun.GetSeqID <EM_SCRIPT_NODE_CASE>(),
                SCRIPT_CASE_ID = scriptCaseID,
                SCRIPT_ID      = db.EM_SCRIPT_CASE.Find(scriptCaseID).SCRIPT_ID,
                SCRIPT_NODE_ID = scriptNodeID,
                DB_SERVER_ID   = _scriptNode.DB_SERVER_ID,
                SCRIPT_MODEL   = _scriptNode.SCRIPT_MODEL,
                CONTENT        = _scriptNode.CONTENT,
                REMARK         = _scriptNode.REMARK,
                E_TABLE_NAME   = _scriptNode.E_TABLE_NAME,
                C_TABLE_NAME   = _scriptNode.C_TABLE_NAME,
                TABLE_TYPE     = _scriptNode.TABLE_TYPE,
                TABLE_MODEL    = _scriptNode.TABLE_MODEL,
                CREATE_TIME    = DateTime.Now,
                TABLE_SUFFIX   = DateTime.Now.Ticks,//赋值方式改为:去获取脚本流实例的ID
                RUN_STATUS     = (short)PubEnum.RunStatus.Wait,
            };

            db.EM_SCRIPT_NODE_CASE.Add(scriptNodeCase);
            return(scriptNodeCase);

            //try
            //{
            //    db.SaveChanges();
            //    return scriptNodeCase.ID;
            //}
            //catch (Exception e)
            //{
            //    err.IsError = true;
            //    err.Message = e.Message;
            //    err.Excep = e;
            //    return null;
            //}
        }