blob: 9de17da364d5f0fbd0932c281b8b93b50d45a6e7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Timeline.Entities;
namespace Timeline.Services.Data
{
public class DataManager : IDataManager
{
private readonly ILogger<DataManager> _logger;
private readonly DatabaseContext _database;
private readonly IETagGenerator _eTagGenerator;
public DataManager(ILogger<DataManager> logger, DatabaseContext database, IETagGenerator eTagGenerator)
{
_logger = logger;
_database = database;
_eTagGenerator = eTagGenerator;
}
public async Task<string> RetainEntry(byte[] data, CancellationToken cancellationToken = default)
{
if (data == null)
throw new ArgumentNullException(nameof(data));
var tag = await _eTagGenerator.GenerateETagAsync(data, cancellationToken);
var entity = await _database.Data.Where(d => d.Tag == tag).SingleOrDefaultAsync(cancellationToken);
bool create;
if (entity == null)
{
create = true;
entity = new DataEntity
{
Tag = tag,
Data = data,
Ref = 1
};
_database.Data.Add(entity);
}
else
{
create = false;
entity.Ref += 1;
}
await _database.SaveChangesAsync(cancellationToken);
_logger.LogInformation(create ? Resource.LogDataManagerRetainEntryCreate : Resource.LogDataManagerRetainEntryAddRefCount, tag);
return tag;
}
public async Task FreeEntry(string tag, CancellationToken cancellationToken = default)
{
if (tag == null)
throw new ArgumentNullException(nameof(tag));
var entity = await _database.Data.Where(d => d.Tag == tag).SingleOrDefaultAsync(cancellationToken);
if (entity != null)
{
bool remove;
if (entity.Ref == 1)
{
remove = true;
_database.Data.Remove(entity);
}
else
{
remove = false;
entity.Ref -= 1;
}
await _database.SaveChangesAsync(cancellationToken);
_logger.LogInformation(remove ? Resource.LogDataManagerFreeEntryRemove : Resource.LogDataManagerFreeEntryDecreaseRefCount, tag);
}
else
{
_logger.LogInformation(Resource.LogDataManagerFreeEntryNotExist, tag);
}
}
public async Task<byte[]?> GetEntry(string tag, CancellationToken cancellationToken = default)
{
if (tag == null)
throw new ArgumentNullException(nameof(tag));
var entity = await _database.Data.Where(d => d.Tag == tag).Select(d => new { d.Data }).SingleOrDefaultAsync(cancellationToken);
if (entity is null)
return null;
return entity.Data;
}
}
}
|