-
Notifications
You must be signed in to change notification settings - Fork 49
/
SqlServerStore.cs
125 lines (112 loc) · 4.67 KB
/
SqlServerStore.cs
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using RequestReduce.Api;
using RequestReduce.Module;
using RequestReduce.Store;
using RequestReduce.Utilities;
using RequestReduce.IOC;
namespace RequestReduce.SqlServer
{
public class SqlServerStore : IStore
{
private readonly IUriBuilder uriBuilder;
private readonly IFileRepository repository;
private readonly IStore fileStore;
private readonly IReductionRepository reductionRepository;
public SqlServerStore(IUriBuilder uriBuilder, IFileRepository repository, IStore fileStore, IReductionRepository reductionRepository)
{
RRTracer.Trace("Sql Server Store Created.");
this.uriBuilder = uriBuilder;
this.repository = repository;
this.fileStore = fileStore;
this.reductionRepository = reductionRepository;
}
public void Flush(Guid keyGuid)
{
if(keyGuid == Guid.Empty)
{
var urls = GetSavedUrls();
foreach (var key in urls.Keys)
Flush(key);
}
var files = repository.GetFilesFromKey(keyGuid);
foreach (var file in files)
{
file.IsExpired = true;
repository.Save(file);
}
reductionRepository.RemoveReduction(keyGuid);
}
public void Dispose()
{
fileStore.Dispose();
RRTracer.Trace("Sql Server Store Disposed.");
}
public void Save(byte[] content, string url, string originalUrls)
{
RRTracer.Trace("Saving {0} to db.", url);
var fileName = uriBuilder.ParseFileName(url);
var key = uriBuilder.ParseKey(url);
var id = Hasher.Hash(fileName);
var file = repository[id] ?? new RequestReduceFile();
file.Content = content;
file.LastUpdated = DateTime.Now;
file.FileName = fileName;
file.Key = key;
file.RequestReduceFileId = id;
file.OriginalName = originalUrls;
file.IsExpired = false;
fileStore.Save(content, url, originalUrls);
repository.Save(file);
if (!url.ToLower().EndsWith(".png"))
reductionRepository.AddReduction(key, url);
RRTracer.Trace("{0} saved to db.", url);
}
public bool SendContent(string url, HttpResponseBase response)
{
if (fileStore.SendContent(url, response))
return true;
var key = uriBuilder.ParseKey(url);
var id = Hasher.Hash(uriBuilder.ParseFileName(url));
var file = repository[id];
if(file != null)
{
response.BinaryWrite(file.Content);
try
{
fileStore.Save(file.Content, url, null);
}
catch(Exception ex)
{
var message = string.Format("could not save {0}", url);
var wrappedException =
new ApplicationException(message, ex);
RRTracer.Trace(message);
RRTracer.Trace(ex.ToString());
if (Registry.CaptureErrorAction != null)
Registry.CaptureErrorAction(wrappedException);
}
RRTracer.Trace("{0} transmitted from db.", url);
if (file.IsExpired)
reductionRepository.RemoveReduction(key);
return true;
}
RRTracer.Trace("{0} not found on file or db.", url);
reductionRepository.RemoveReduction(key);
return false;
}
public IDictionary<Guid, string> GetSavedUrls()
{
RRTracer.Trace("SqlServerStore Looking for previously saved content.");
var files = repository.GetActiveFiles();
return files.ToDictionary(file => uriBuilder.ParseKey(file), file => uriBuilder.BuildResourceUrl(uriBuilder.ParseKey(file), uriBuilder.ParseSignature(file), RRContainer.GetAllResourceTypes().SingleOrDefault(x => file.EndsWith(x.FileName)).GetType()));
}
public string GetUrlByKey(Guid keyGuid, Type resourceType)
{
var fileName = repository.GetActiveUrlByKey(keyGuid, resourceType);
return fileName == null ? null : uriBuilder.BuildResourceUrl(uriBuilder.ParseKey(fileName), uriBuilder.ParseSignature(fileName), resourceType);
}
}
}