Example #1
0
        /// <summary>
        /// Execute macro statement
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public DataSet Execute(string query)
        {
            query = RegexUtil.Sub(query, "^[ \t]*@[ \t]*", "");
            var tokens = query.Split(new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

            #region Invoke Macro
            if (macros == null)
            {
                macros = new MacroList();
                macros.AddInstance(macroLib);
            }

            var mx = macros.Find(p =>
            {
                var m = MacroList.GetAttribute <MacroMethodAttribute>(p).Name ?? p.MethodInfo.Name;
                return(m.Equals(tokens[0], StringComparison.InvariantCultureIgnoreCase));
            });

            if (mx == null)
            {
                throw new ArgumentException("macro not found: " + tokens[0]);
            }


            object result = null;

            try
            {
                if (mx.MethodInfo.Name.Equals("MacroHelp", StringComparison.InvariantCultureIgnoreCase))
                {
                    result = DynamicCode.InvokeMethod(mx.Instance, "MacroHelp", macros, tokens);
                }
                else
                {
                    var parameters = MacroList.CreateParameter(mx.MethodInfo, tokens);
                    result = DynamicCode.InvokeMethod(mx.Instance, mx.MethodInfo.Name, parameters);
                }
            }
            catch (Exception ex)
            {
                throw new ArgumentException(ex.Message + Environment.NewLine + MacroList.CreateHelp(mx.MethodInfo), ex);
            }
            #endregion

            #region Return DataSet
            var ds = new DataSet("MacroResults");

            if (result is DataTable)
            {
                ds.Tables.Add(result as DataTable);
            }
            else
            {
                var dt = new DataTable();
                dt.Columns.Add("Value", mx.MethodInfo.ReturnType);
                dt.Rows.Add(result);
                ds.Tables.Add(dt);
            }
            #endregion

            return(ds);
        }