Files
Umbraco-CMS/src/Umbraco.Infrastructure/Services/Implement/KeyValueService.cs

98 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Persistence.Repositories;
using Umbraco.Cms.Core.Scoping;
namespace Umbraco.Cms.Core.Services.Implement
{
internal class KeyValueService : IKeyValueService
{
private readonly IScopeProvider _scopeProvider;
private readonly IKeyValueRepository _repository;
public KeyValueService(IScopeProvider scopeProvider, IKeyValueRepository repository)
{
_scopeProvider = scopeProvider;
_repository = repository;
}
/// <inheritdoc />
public string GetValue(string key)
{
using (var scope = _scopeProvider.CreateScope(autoComplete: true))
{
return _repository.Get(key)?.Value;
}
}
/// <inheritdoc />
public IReadOnlyDictionary<string, string> FindByKeyPrefix(string keyPrefix)
{
using (var scope = _scopeProvider.CreateScope(autoComplete: true))
{
return _repository.FindByKeyPrefix(keyPrefix);
}
}
/// <inheritdoc />
public void SetValue(string key, string value)
{
using (var scope = _scopeProvider.CreateScope())
{
scope.WriteLock(Cms.Core.Constants.Locks.KeyValues);
var keyValue = _repository.Get(key);
if (keyValue == null)
{
keyValue = new KeyValue
{
Identifier = key,
Value = value,
UpdateDate = DateTime.Now,
};
}
else
{
keyValue.Value = value;
keyValue.UpdateDate = DateTime.Now;
}
_repository.Save(keyValue);
scope.Complete();
}
}
/// <inheritdoc />
public void SetValue(string key, string originValue, string newValue)
{
if (!TrySetValue(key, originValue, newValue))
throw new InvalidOperationException("Could not set the value.");
}
/// <inheritdoc />
public bool TrySetValue(string key, string originalValue, string newValue)
{
using (var scope = _scopeProvider.CreateScope())
{
scope.WriteLock(Cms.Core.Constants.Locks.KeyValues);
var keyValue = _repository.Get(key);
if (keyValue == null || keyValue.Value != originalValue)
{
return false;
}
keyValue.Value = newValue;
keyValue.UpdateDate = DateTime.Now;
_repository.Save(keyValue);
scope.Complete();
}
return true;
}
}
}