forked from nhibernate/nhibernate-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathReadOnlyCache.cs
135 lines (121 loc) · 2.48 KB
/
ReadOnlyCache.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
126
127
128
129
130
131
132
133
134
135
using System;
using log4net;
namespace NHibernate.Cache
{
/// <summary>
/// Caches data that is never updated
/// </summary>
public class ReadOnlyCache : ICacheConcurrencyStrategy
{
private static readonly ILog log = LogManager.GetLogger( typeof( ReadOnlyCache ) );
private object lockObject = new object();
private ICache _cache;
/// <summary></summary>
public ReadOnlyCache()
{
}
#region ICacheConcurrencyStrategy Members
/// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <param name="timestamp"></param>
/// <returns></returns>
public object Get( object key, long timestamp )
{
lock( lockObject )
{
if( log.IsDebugEnabled )
{
log.Debug( "Cache lookup: " + key );
}
object result = _cache.Get( key );
if( result != null && log.IsDebugEnabled )
{
log.Debug( "Cache hit" );
}
else if( log.IsDebugEnabled )
{
log.Debug( "Cache miss" );
}
return result;
}
}
/// <summary>
///
/// </summary>
/// <param name="key"></param>
public ISoftLock Lock( object key )
{
log.Error( "Application attempted to edit read only item: " + key );
throw new InvalidOperationException( "Can't write to a readonly object" );
}
/// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="timestamp"></param>
/// <returns></returns>
public bool Put( object key, object value, long timestamp )
{
lock( lockObject )
{
if( log.IsDebugEnabled )
{
log.Debug( "Caching: " + key );
}
_cache.Put( key, value );
return true;
}
}
/// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <param name="lock"></param>
public void Release( object key, ISoftLock @lock )
{
log.Error( "Application attempted to edit read only item: " + key );
throw new InvalidOperationException( "Can't write to a readonly object" );
}
/// <summary>
///
/// </summary>
public void Clear()
{
_cache.Clear();
}
/// <summary>
///
/// </summary>
/// <param name="key"></param>
public void Remove( object key )
{
_cache.Remove( key );
}
/// <summary>
///
/// </summary>
public void Destroy()
{
try
{
_cache.Destroy();
}
catch( Exception e )
{
log.Warn( "Could not destroy cache", e );
}
}
/// <summary>
///
/// </summary>
public ICache Cache
{
get { return _cache; }
set { _cache = value; }
}
#endregion
}
}