/// <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); }
/// <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 }
/// <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); }
/// <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 }
/// <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; //} }