예제 #1
0
        public void RunShell()
        {
            _readline = new Readline.Readline(History)
            {
                CtrlCInterrupts = CtrlCInterrupts,
                CtrlDIsEOF      = CtrlDIsEOF,
                CtrlZIsEOF      = CtrlZIsEOF
            };

            _readline.WritePrompt       += ReadlineOnWritePrompt;
            _readline.Interrupt         += (sender, args) => ShellInterrupt?.Invoke(this, EventArgs.Empty);
            _readline.TabComplete       += ReadlineOnTabComplete;
            _readline.PrintAlternatives += (sender, args) => OnPrintAlternatives(args);

            while (true)
            {
                var input = _readline.ReadLine();

                if (string.IsNullOrWhiteSpace(input))
                {
                    continue;
                }

                input = input.Trim();


                var allTokens = ShellCommandTokenizer.Tokenize(input);

                foreach (var cmdTokens in allTokens)
                {
                    try
                    {
                        var tokenArr = cmdTokens.ToArray();

                        IShellCommand command = null;
                        lock (_lock)
                        {
                            command = _container.FindCommand(this, tokenArr);
                        }

                        BeforeCommandExecute?.Invoke(this, new CommandExecuteEventArgs(input, null, command));
                        ExecuteCommand(tokenArr);
                        AfterCommandExecute?.Invoke(this, new CommandExecuteEventArgs(input, CommandResult, command));
                    }
                    catch (ShellCommandNotFoundException)
                    {
                        OnShellCommandNotFound(input);
                    }
                }

                History.AddUnique(input);
            }
        }
예제 #2
0
        protected virtual void OnShellCommandNotFound(string input)
        {
            var handler = ShellCommandNotFound;

            if (handler != null)
            {
                handler.Invoke(this, new CommandNotFoundEventArgs(input));
            }
            else
            {
                Console.WriteLine("UserInput not found: {0}", input);
                AfterCommandExecute?.Invoke(this, new CommandExecuteEventArgs(input, null));
            }
        }
예제 #3
0
 internal static void OnAfterCommandExecute(Player player, UserInputData userInputData, object?[] args)
 => AfterCommandExecute?.Invoke(player, userInputData, args);
예제 #4
0
        private T Execute <T>(CommandType commandType, string strSql, CommandExecuteHandler <T> commandExecuteHandler, object objParameters = null)
        {
            DbParameter[] dbParameters = objParameters == null ? null : GetDbParameters(objParameters);

            DbConnection conn = GetDbConnection();
            DbCommand    cmd  = null;

            try
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }

                cmd = conn.CreateCommand();

                cmd.CommandType = commandType;

                cmd.CommandText = strSql;

                if (_commandTimeout != (int)CommandTimeoutValue.None)
                {
                    cmd.CommandTimeout = _commandTimeout;
                }

                if (Transactional)
                {
                    cmd.Transaction = _dbTransaction;
                }

                if (dbParameters != null)
                {
                    cmd.Parameters.AddRange(dbParameters);
                }

                DbAccessorContext context = new DbAccessorContext(this, cmd);

                if (PreCommandExecute != null)
                {
                    PreCommandExecute.Invoke(context);
                }

                T result = commandExecuteHandler(cmd);

                if (AfterCommandExecute != null)
                {
                    AfterCommandExecute.Invoke(context);
                }

                return(result);
            }
            finally
            {
                if (cmd != null)
                {
                    cmd.Dispose();
                }

                if (!Transactional && !(typeof(T) == typeof(DbDataReader)))
                {
                    conn.Dispose();
                }
            }
        }