using CommandLine; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using RedisManager.Utils; using RedisManager.Commands; namespace RedisManager.Commands { [Verb("select", HelpText = "Change the selected database.")] public class SelectOptions : InstanceOptions { [Value(0, MetaName = "database", Required = true, HelpText = "Database number.")] public int Database { get; set; } [Option("table", Required = false, HelpText = "Output as table.")] public bool Table { get; set; } } [Verb("flushdb", HelpText = "Remove all keys from the current database.")] public class FlushDbOptions : InstanceOptions { [Option("yes", Required = false, HelpText = "Skip confirmation prompt.")] public bool Yes { get; set; } [Option("table", Required = false, HelpText = "Output as table.")] public bool Table { get; set; } } [Verb("flushall", HelpText = "Remove all keys from all databases.")] public class FlushAllOptions : InstanceOptions { [Option("yes", Required = false, HelpText = "Skip confirmation prompt.")] public bool Yes { get; set; } [Option("table", Required = false, HelpText = "Output as table.")] public bool Table { get; set; } } [Verb("dbsize", HelpText = "Return the number of keys in the current database.")] public class DbSizeOptions : InstanceOptions { [Option("table", Required = false, HelpText = "Output as table.")] public bool Table { get; set; } } public static class DatabaseCommands { public static int RunSelect(SelectOptions opts, Config config) { var instance = RedisUtils.GetInstance(config, opts.Instance); using var redis = RedisUtils.ConnectRedis(instance); var db = redis.GetDatabase(opts.Database); if (opts.Table) RedisUtils.PrintTable(new[] { "Database", "Status" }, new List { new[] { opts.Database.ToString(), "Selected" } }); else Console.WriteLine(Output.Green("OK")); return 0; } public static int RunFlushDb(FlushDbOptions opts, Config config) { if (!opts.Yes) { Console.WriteLine(Output.Yellow("Are you sure you want to flush the current database? (y/N)")); var response = Console.ReadLine()?.ToLower(); if (response != "y" && response != "yes") { Console.WriteLine(Output.Red("Operation cancelled.")); return 1; } } var instance = RedisUtils.GetInstance(config, opts.Instance); using var redis = RedisUtils.ConnectRedis(instance); var db = redis.GetDatabase(); db.Execute("FLUSHDB"); if (opts.Table) RedisUtils.PrintTable(new[] { "Operation", "Status" }, new List { new[] { "FLUSHDB", "OK" } }); else Console.WriteLine(Output.Green("OK")); return 0; } public static int RunFlushAll(FlushAllOptions opts, Config config) { if (!opts.Yes) { Console.WriteLine(Output.Yellow("Are you sure you want to flush ALL databases? (y/N)")); var response = Console.ReadLine()?.ToLower(); if (response != "y" && response != "yes") { Console.WriteLine(Output.Red("Operation cancelled.")); return 1; } } var instance = RedisUtils.GetInstance(config, opts.Instance); using var redis = RedisUtils.ConnectRedis(instance); var db = redis.GetDatabase(); db.Execute("FLUSHALL"); if (opts.Table) RedisUtils.PrintTable(new[] { "Operation", "Status" }, new List { new[] { "FLUSHALL", "OK" } }); else Console.WriteLine(Output.Green("OK")); return 0; } public static int RunDbSize(DbSizeOptions opts, Config config) { var instance = RedisUtils.GetInstance(config, opts.Instance); using var redis = RedisUtils.ConnectRedis(instance); var db = redis.GetDatabase(); var size = db.Execute("DBSIZE"); if (opts.Table) RedisUtils.PrintTable(new[] { "Database", "Size" }, new List { new[] { "Current", size.ToString() } }); else Console.WriteLine(Output.Green(size.ToString())); return 0; } } }