public async Task PutCmpXchgValue() { var prefix = Database.Name + "/"; var key = prefix + GetStringQueryString("key"); // ReSharper disable once PossibleInvalidOperationException var index = GetLongQueryString("index", true).Value; ServerStore.EnsureNotPassive(); using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context)) { var updateJson = await context.ReadForMemoryAsync(RequestBodyStream(), "read-unique-value"); var command = new CompareExchangeCommand(key, updateJson, index); using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream())) { (var raftIndex, _) = await ServerStore.SendToLeaderAsync(command); await ServerStore.Cluster.WaitForIndexNotification(raftIndex); using (context.OpenReadTransaction()) { var res = ServerStore.Cluster.GetCmpXchg(context, key); context.Write(writer, new DynamicJsonValue { [nameof(CmpXchgResult <object> .Index)] = res.Index, [nameof(CmpXchgResult <object> .Value)] = res.Value, [nameof(CmpXchgResult <object> .Successful)] = res.Index == raftIndex }); } writer.Flush(); } } }
public static Result <Command> FromString(string command, string[] parameters) { try { if (!Enum.TryParse <CommandType>(command, ignoreCase: true, out var parsedCommandType)) { throw new ArgumentException(message: $"Could not parse `{nameof(CommandType)}` from string `{command}`", paramName: nameof(command)); } Command?parsedCommand = null; switch (parsedCommandType) { case CommandType.Get: parsedCommand = new GetCommand(); break; case CommandType.Set: parsedCommand = new SetCommand() { Value = Encoding.UTF8.GetBytes(parameters[1]), }; break; case CommandType.CompareExchange: parsedCommand = new CompareExchangeCommand() { Comparand = Encoding.UTF8.GetBytes(parameters[1]), Value = Encoding.UTF8.GetBytes(parameters[2]), }; break; case CommandType.CompareRemove: parsedCommand = new CompareRemoveCommand() { Comparand = Encoding.UTF8.GetBytes(parameters[1]), }; break; case CommandType.Remove: parsedCommand = new RemoveCommand(); break; case CommandType.PrefixEnumerate: parsedCommand = new PrefixEnumerateCommand(); break; } Contract.Assert(parsedCommand != null); parsedCommand.Key = Encoding.UTF8.GetBytes(parameters[0]); return(new Result <Command>(parsedCommand)); } catch (Exception e) { return(new Result <Command>(e, message: $"Failed to parse request `{command}` with parameters `{string.Join(", ", parameters)}`")); } }
public async Task PutCmpXchgValue() { var key = GetStringQueryString("key"); // ReSharper disable once PossibleInvalidOperationException var index = GetLongQueryString("index", true).Value; ServerStore.EnsureNotPassive(); using (ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context)) { var updateJson = await context.ReadForMemoryAsync(RequestBodyStream(), "read-unique-value"); var command = new CompareExchangeCommand(key, updateJson, index); var(raftIndex, _) = await ServerStore.SendToLeaderAsync(command); await ServerStore.Cluster.WaitForIndexNotification(raftIndex); HttpContext.Response.StatusCode = (int)HttpStatusCode.OK; } }