using CommandLine; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using RedisManager.Utils; namespace RedisManager.Commands { /// /// Contains command line options and implementations for Redis transaction operations. /// Provides functionality for MULTI, EXEC, DISCARD, WATCH, and UNWATCH commands. /// [Verb("multi", HelpText = "Mark the start of a transaction block.")] public class MultiOptions { [Option('i', "instance", Required = true, HelpText = "Instance name.")] public string Instance { get; set; } } [Verb("exec", HelpText = "Execute all commands issued after MULTI.")] public class ExecOptions { [Option('i', "instance", Required = true, HelpText = "Instance name.")] public string Instance { get; set; } } [Verb("discard", HelpText = "Flush all commands issued after MULTI.")] public class DiscardOptions { [Option('i', "instance", Required = true, HelpText = "Instance name.")] public string Instance { get; set; } } [Verb("watch", HelpText = "Watch the given keys to determine execution of the MULTI/EXEC block.")] public class WatchOptions { [Option('i', "instance", Required = true, HelpText = "Instance name.")] public string Instance { get; set; } [Value(0, MetaName = "keys", Min = 1, Required = true, HelpText = "Keys to watch.")] public IEnumerable Keys { get; set; } } [Verb("unwatch", HelpText = "Forget about all watched keys.")] public class UnwatchOptions { [Option('i', "instance", Required = true, HelpText = "Instance name.")] public string Instance { get; set; } } public static class TransactionCommands { /// /// Executes the MULTI command to mark the start of a transaction block. /// /// The MultiOptions containing instance. /// The RedisManager configuration. /// Exit code (0 for success, non-zero for failure). public static int RunMulti(MultiOptions opts, Config config) { var instance = RedisUtils.GetInstance(config, opts.Instance); using var redis = RedisUtils.ConnectRedis(instance); var db = redis.GetDatabase(); db.Execute("MULTI"); Console.WriteLine(Output.Green("OK")); return 0; } /// /// Executes the EXEC command to execute all commands issued after MULTI. /// /// The ExecOptions containing instance. /// The RedisManager configuration. /// Exit code (0 for success, non-zero for failure). public static int RunExec(ExecOptions opts, Config config) { var instance = RedisUtils.GetInstance(config, opts.Instance); using var redis = RedisUtils.ConnectRedis(instance); var db = redis.GetDatabase(); var result = db.Execute("EXEC"); Console.WriteLine(Output.Green(result.ToString())); return 0; } /// /// Executes the DISCARD command to flush all commands issued after MULTI. /// /// The DiscardOptions containing instance. /// The RedisManager configuration. /// Exit code (0 for success, non-zero for failure). public static int RunDiscard(DiscardOptions opts, Config config) { var instance = RedisUtils.GetInstance(config, opts.Instance); using var redis = RedisUtils.ConnectRedis(instance); var db = redis.GetDatabase(); db.Execute("DISCARD"); Console.WriteLine(Output.Green("OK")); return 0; } /// /// Executes the WATCH command to watch the given keys for a transaction block. /// /// The WatchOptions containing instance and keys. /// The RedisManager configuration. /// Exit code (0 for success, non-zero for failure). public static int RunWatch(WatchOptions opts, Config config) { var instance = RedisUtils.GetInstance(config, opts.Instance); using var redis = RedisUtils.ConnectRedis(instance); var db = redis.GetDatabase(); var keys = opts.Keys.Select(k => (RedisKey)k).ToArray(); db.Execute("WATCH", keys); Console.WriteLine(Output.Green("OK")); return 0; } /// /// Executes the UNWATCH command to forget about all watched keys. /// /// The UnwatchOptions containing instance. /// The RedisManager configuration. /// Exit code (0 for success, non-zero for failure). public static int RunUnwatch(UnwatchOptions opts, Config config) { var instance = RedisUtils.GetInstance(config, opts.Instance); using var redis = RedisUtils.ConnectRedis(instance); var db = redis.GetDatabase(); db.Execute("UNWATCH"); Console.WriteLine(Output.Green("OK")); return 0; } } }