Esempio n. 1
0
        public IDisposable BindAddCommand(byte[] key, RedisTargetInfo targetInfo)
        {
            _model.AddCommand = ReactiveCommand.CreateFromObservable(
                () => ExecuteAdd(key, targetInfo),
                null,
                RxApp.MainThreadScheduler);

            return(_model.AddCommand
                   .SubscribeWithLog(wasAdded =>
            {
                if (wasAdded)
                {
                    ExecuteScanCommand();
                    UpdateBadge(key, targetInfo);
                }
            }));
        }
Esempio n. 2
0
        private IObservable <List <ZSetStructItemModel> > ExecuteDelete(
            byte[] key, RedisTargetInfo targetInfo, List <ZSetStructItemModel> items)
        {
            return(_dialogManager.Open(new ConfirmDialogModel
            {
                TitleText = "Delete set entries?",
                MessageText = "Do you want to delete selected set entries?",
                ConfirmText = "Delete",
                CancelText = "Cancel"
            })
                   .SelectMany(confirmed =>
            {
                if (!confirmed)
                {
                    return Observable.Return(new List <ZSetStructItemModel>());
                }

                return _clientAccessor.With(targetInfo, client =>
                {
                    var deletedItems = new List <ZSetStructItemModel>();

                    client.Multi();
                    try
                    {
                        foreach (var item in items)
                        {
                            if (item.IsChecked)
                            {
                                client.ZRem(ustring.Make(key).ToString(), item.Value);
                                deletedItems.Add(item);
                            }
                        }

                        client.Exec();
                    }
                    catch
                    {
                        client.Discard();

                        throw;
                    }

                    return deletedItems;
                });
            }));
        }
Esempio n. 3
0
        private IObservable <(ZSetStructItemModel, ZSetStructItemModel)> ExecuteEdit(
            byte[] key, RedisTargetInfo targetInfo, ZSetStructItemModel zsetItem)
        {
            var editedSetItem = new ZSetStructItemModel
            {
                Score       = zsetItem.Score,
                Value       = zsetItem.Value,
                IsChecked   = zsetItem.IsChecked,
                IsEnabled   = zsetItem.IsEnabled,
                CheckAction = zsetItem.CheckAction,
                EditAction  = zsetItem.EditAction
            };

            return(_dialogManager.Open(EditorDialogModel.ReplaceZSetItem(
                                           double.Parse(zsetItem.Score), zsetItem.Value, target =>
            {
                return _clientAccessor.With(targetInfo, client =>
                {
                    var isValueEmpty = string.IsNullOrEmpty(target.Value);
                    var alreadyExists = !isValueEmpty &&
                                        zsetItem.Score != target.Score.ToString(CultureInfo.InvariantCulture) &&
                                        zsetItem.Value != target.Value &&
                                        client.ZScore(ustring.Make(key).ToString(), target.Value) != null;

                    if (!isValueEmpty && !alreadyExists)
                    {
                        client.Multi();
                        client.ZRem(ustring.Make(key).ToString(), zsetItem.Value);
                        client.ZAdd(ustring.Make(key).ToString(), Tuple.Create(target.Score, target.Value));
                        client.Exec();

                        editedSetItem.Score = target.Score.ToString(CultureInfo.InvariantCulture);
                        editedSetItem.Value = target.Value;
                    }

                    return new EditorResult
                    {
                        ValueError = isValueEmpty
                                        ? "Value is empty"
                                        : (alreadyExists ? "Value already exists" : null),
                        Action = target.Action
                    };
                });
            }))
                   .Select(wasEdited => wasEdited ? (zsetItem, editedSetItem) : (null, null)));
        }
Esempio n. 4
0
 public IObservable <RedisResultInfo> Execute(
     RedisTargetInfo targetInfo, RedisCommandInfo commandInfo)
 {
     return(_clientAccessor.With(targetInfo, client =>
     {
         // TODO: async
         return client.Call(commandInfo.Name, commandInfo.Args);
     })
            .Select(data => RedisResultInfo.MapResult(
                        targetInfo,
                        commandInfo,
                        data))
            .Catch <RedisResultInfo, RedisException>(exception => Observable.Return(
                                                         new RedisResultInfo.Error(
                                                             targetInfo,
                                                             commandInfo,
                                                             exception))));
 }
 private IObservable <IList <HashStructItemModel> > ExecuteScan(
     byte[] key, RedisTargetInfo targetInfo, string pattern)
 {
     return(_clientAccessor.With(targetInfo, client => client.HScan(ustring.Make(key).ToString(), 0, pattern)) // TODO: async
            .Select(scan =>
     {
         return scan.Items.Select(tuple =>
                                  new HashStructItemModel
         {
             Key = tuple.Item1,
             Value = tuple.Item2,
             IsChecked = false,
             IsEnabled = true,
             CheckAction = CheckItem,
             EditAction = EditItem
         }).ToList();
     }));
 }
        private IObservable <(SetStructItemModel, SetStructItemModel)> ExecuteEdit(
            byte[] key, RedisTargetInfo targetInfo, SetStructItemModel setItem)
        {
            var editedSetItem = new SetStructItemModel
            {
                Value       = setItem.Value,
                IsChecked   = setItem.IsChecked,
                IsEnabled   = setItem.IsEnabled,
                CheckAction = setItem.CheckAction,
                EditAction  = setItem.EditAction
            };

            return(_dialogManager.Open(EditorDialogModel.ReplaceSetItem(
                                           setItem.Value, target =>
            {
                return _clientAccessor.With(targetInfo, client =>
                {
                    var isValueEmpty = string.IsNullOrEmpty(target.Value);
                    var alreadyExists = !isValueEmpty &&
                                        setItem.Value != target.Value &&
                                        client.SIsMember(ustring.Make(key).ToString(), target.Value);

                    if (!isValueEmpty && !alreadyExists)
                    {
                        client.Multi();
                        client.SRem(ustring.Make(key).ToString(), setItem.Value);
                        client.SAdd(ustring.Make(key).ToString(), target.Value);
                        client.Exec();

                        editedSetItem.Value = target.Value;
                    }

                    return new EditorResult
                    {
                        ValueError = isValueEmpty
                                        ? "Value is empty"
                                        : (alreadyExists ? "Value already exists" : null),
                        Action = target.Action
                    };
                });
            }))
                   .Select(wasEdited => wasEdited ? (setItem, editedSetItem) : (null, null)));
        }
        public IDisposable BindEditCommand(byte[] key, RedisTargetInfo targetInfo)
        {
            _model.EditCommand = ReactiveCommand.CreateFromObservable <SetStructItemModel, (SetStructItemModel, SetStructItemModel)>(
                setItem => ExecuteEdit(key, targetInfo, setItem ?? _model.SetItems.First(item => item.IsChecked)),
                _model.WhenAnyValue(m => m.IsEditAvailable),
                RxApp.MainThreadScheduler);

            return(_model.EditCommand
                   .SubscribeWithLog(tuple =>
            {
                var(oldSetItem, newSetItem) = tuple;

                if (oldSetItem != null && newSetItem != null)
                {
                    var index = _model.SetItems.IndexOf(oldSetItem);

                    newSetItem.IsChecked = false;
                    _model.SetItems[index] = newSetItem;
                }
            }));
        }
Esempio n. 8
0
        public IObservable <RedisResultInfo> Execute(
            RedisTargetInfo targetInfo, RedisBatchInfo batchInfo)
        {
            return(_clientAccessor.With(targetInfo, client =>
            {
                return Observable.Create <RedisResultInfo>(observer =>
                {
                    foreach (var commandInfo in batchInfo.CommandInfos)
                    {
                        try
                        {
                            // TODO: async
                            var data = client.Call(commandInfo.Name, commandInfo.Args);

                            if (commandInfo.IsExec && batchInfo.IsTransaction)
                            {
                                observer.OnNext(
                                    RedisResultInfo.MapResult(
                                        targetInfo, batchInfo, commandInfo, data));
                            }
                            else
                            {
                                observer.OnNext(
                                    RedisResultInfo.MapResult(
                                        targetInfo, commandInfo, data));
                            }
                        }
                        catch (RedisException e)
                        {
                            observer.OnNext(new RedisResultInfo.Error(
                                                targetInfo, commandInfo, e));
                        }
                    }

                    observer.OnCompleted();
                    return Disposable.Empty;
                });
            }));
        }
        public IDisposable BindEditCommand(byte[] key, RedisTargetInfo targetInfo)
        {
            _model.EditCommand = ReactiveCommand.CreateFromObservable <HashStructItemModel, HashStructItemModel>(
                hashItem => ExecuteEdit(key, targetInfo, hashItem ?? _model.HashItems.First(item => item.IsChecked)),
                _model.WhenAnyValue(m => m.IsEditAvailable),
                RxApp.MainThreadScheduler);

            return(_model.EditCommand
                   .SubscribeWithLog(editedHashItem =>
            {
                if (editedHashItem != null)
                {
                    var index = _model.HashItems
                                .Select((item, i) => new { Item = item, Index = i })
                                .First(tuple => tuple.Item.Key == editedHashItem.Key)
                                .Index;

                    editedHashItem.IsChecked = false;
                    _model.HashItems[index] = editedHashItem;
                }
            }));
        }
        private IObservable <string[]> GetQuickAccessItems(
            string text)
        {
            if (!string.IsNullOrWhiteSpace(text) && !text.Contains("*"))
            {
                text = text.Trim() + "*";
            }

            RedisTargetInfo targetInfo = null;

            if (_model.IsDatabaseTargetSelected)
            {
                targetInfo = _model.SelectedDatabaseTarget.DatabaseInfo;
            }

            if (_model.IsServerTargetSelected)
            {
                targetInfo = _model.SelectedServerTarget.ServerInfo;
            }

            if (!string.IsNullOrWhiteSpace(text) && targetInfo != null)
            {
                return(_clientAccessor.With(targetInfo, client =>
                {
                    var scan = client.Scan(0, text);
                    if (scan != null)
                    {
                        var items = scan.Items
                                    .ToArray();

                        return Observable.Return(items);
                    }

                    return Observable.Return(new string[0]);
                }));
            }

            return(Observable.Return(new string[0]));
        }
        private IObservable <bool> ExecuteAdd(byte[] key, RedisTargetInfo targetInfo)
        {
            return(_dialogManager.Open(EditorDialogModel.AddSetItem(target =>
            {
                return _clientAccessor.With(targetInfo, client =>
                {
                    var isValueEmpty = string.IsNullOrEmpty(target.Value);
                    var isValueDuplicate = !isValueEmpty && client.SIsMember(ustring.Make(key).ToString(), target.Value);

                    if (!isValueEmpty && !isValueDuplicate)
                    {
                        client.SAdd(ustring.Make(key).ToString(), target.Value);
                    }

                    return new EditorResult
                    {
                        ValueError = isValueEmpty ? "Value is empty"
                                : (isValueDuplicate ? "Value already exists" : null),
                        Action = target.Action
                    };
                });
            })));
        }
 public IDisposable BindLength(byte[] key, RedisTargetInfo targetInfo)
 {
     return(UpdateBadge(key, targetInfo));
 }
Esempio n. 13
0
 private IObservable <Unit> SetValue(
     RedisTargetInfo targetInfo, byte[] key, string text)
 {
     return(_clientAccessor.With(targetInfo, client => client.Set(ustring.Make(key).ToString(), text))
            .Select(_ => Unit.Default)); // TODO: async
 }
Esempio n. 14
0
 private IObservable <string> GetValue(
     RedisTargetInfo targetInfo, byte[] key)
 {
     return(_clientAccessor.With(targetInfo, client => client.Get(ustring.Make(key).ToString()))); // TODO: async
 }