TransferPathRepository
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
namespace Relativity.Transfer
{
internal class TransferPathRepository : ITransferPathRepository
{
private readonly ConcurrentDictionary<long, TransferPath> paths = new ConcurrentDictionary<long, TransferPath>();
private readonly ITransferPathKeyGenerator primaryKeyGenerator;
private long count;
public long Count => Interlocked.Read(ref count);
public TransferPathRepository()
: this(new PrimaryKeyGenerator())
{
}
public TransferPathRepository(ITransferPathKeyGenerator primaryKeyGenerator)
{
if (primaryKeyGenerator == null)
throw new ArgumentNullException("primaryKeyGenerator");
this.primaryKeyGenerator = primaryKeyGenerator;
}
public void Clear()
{
paths.Clear();
Interlocked.Exchange(ref count, 0);
}
public void Delete(TransferPath path)
{
if (path == (TransferPath)null)
throw new ArgumentNullException("path");
long key = primaryKeyGenerator.GetKey(path);
if (paths.ContainsKey(key) && paths.TryRemove(key, out TransferPath _))
Interlocked.Decrement(ref count);
}
public void Delete(JobTransferPath jobPath)
{
if (jobPath == null)
throw new ArgumentNullException("jobPath");
Delete(jobPath.Path);
}
public ICollection<TransferPath> SelectAll()
{
return paths.Values;
}
public TransferPath SelectByKey(string path)
{
long key = primaryKeyGenerator.GetKey(path);
TransferPath value;
return paths.TryGetValue(key, out value) ? value : null;
}
public void Upsert(TransferPath path)
{
if (path == (TransferPath)null)
throw new ArgumentNullException("path");
bool exists = false;
long key = primaryKeyGenerator.GetKey(path);
paths.AddOrUpdate(key, path, delegate(long i, TransferPath transferPath) {
exists = true;
return transferPath;
});
if (!exists)
Interlocked.Increment(ref count);
}
}
}