示例#1
0
        static void Main(string[] args)
        {
            // by default conect to the local server
            string server = "localhost";

            if (args.Length > 0)
            {
                server = args[0];
            }


            // default port
            int port = 4848;

            if (args.Length > 1)
            {
                if (int.TryParse(args[1], out var customPort))
                {
                    port = customPort;
                }
            }



            var          channel = new TcpClientChannel(new TcpClientPool(1, 1, server, port));
            ICacheClient client  = new CacheClient {
                Channel = channel
            };


            Logger.CommandLogger = new ConsoleLogger();

            Logger.Write("connecting to server {0} on port {1}", server, port);

            try
            {
                ClusterInformation serverDesc = null;

                try
                {
                    serverDesc = client.GetClusterInformation();
                }
                catch (Exception)
                {
                    Logger.WriteEror("Not connected to server: Only CONNECT and HELP commands are available");
                }


                //Profiler.Logger = new ProfileOutput(Console.Out);
                CommandLineParser parser = new CommandLineParser(serverDesc);
                Logger.Write("Type HELP for command list. Advanced autocompletion is also available");

                ConsoleExt.SetLine(">>");

                var running             = true;
                var cyclingAutoComplete = new CyclingAutoComplete {
                    KnownTypes = serverDesc?.Schema.ToList()
                };
                while (running)
                {
                    var result = ConsoleExt.ReadKey();
                    switch (result.Key)
                    {
                    case ConsoleKey.Enter:
                        var line = result.LineBeforeKeyPress.Line;
                        line = line.TrimStart('>');
                        var cmd = parser.Parse(line);
                        if (cmd.Success)
                        {
                            if (cmd.CmdType != CommandType.Exit)
                            {
                                var title = Console.Title;
                                Console.Title = " WORKING...";
                                client        = cmd.TryExecute(client);
                                Console.Title = title;

                                // table definitions may have changed by command execution (connect, import, recreate)
                                // or by external action

                                try
                                {
                                    serverDesc = client.GetClusterInformation();
                                    // if the connection changed reinitialize the autocomplete with the new schema
                                    cyclingAutoComplete = new CyclingAutoComplete {
                                        KnownTypes = serverDesc?.Schema.ToList()
                                    };
                                    parser = new CommandLineParser(serverDesc);
                                }
                                catch (Exception)
                                {
                                    Logger.WriteEror("Not connected to server: Only CONNECT and HELP commands are available");
                                }
                            }
                            else
                            {
                                running = false;
                            }
                        }
                        else
                        {
                            Logger.WriteEror("invalid command");
                        }

                        ConsoleExt.SetLine(">>");

                        break;

                    case ConsoleKey.Tab:
                        var shiftPressed     = (result.Modifiers & ConsoleModifiers.Shift) != 0;
                        var cyclingDirection = shiftPressed ? CyclingDirections.Backward : CyclingDirections.Forward;
                        line = result.LineBeforeKeyPress.LineBeforeCursor.TrimStart('>');

                        var autoCompletedLine =
                            cyclingAutoComplete.AutoComplete(line, cyclingDirection);

                        ConsoleExt.SetLine(">>" + autoCompletedLine);
                        break;
                    }
                }

                Logger.Flush();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }