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
|
using System;
using System.Collections.Generic;
using System.Reflection;
using log4net;
using OpenMetaverse;
using OpenSim.Services.Interfaces;
namespace OpenSim.Services.HypergridService
{
public class UserAccountCache : IUserAccountService
{
private const double CACHE_EXPIRATION_SECONDS = 120000.0; // 33 hours!
// private static readonly ILog m_log =
// LogManager.GetLogger(
// MethodBase.GetCurrentMethod().DeclaringType);
private ExpiringCache<UUID, UserAccount> m_UUIDCache;
private IUserAccountService m_UserAccountService;
private static UserAccountCache m_Singleton;
public static UserAccountCache CreateUserAccountCache(IUserAccountService u)
{
if (m_Singleton == null)
m_Singleton = new UserAccountCache(u);
return m_Singleton;
}
private UserAccountCache(IUserAccountService u)
{
m_UUIDCache = new ExpiringCache<UUID, UserAccount>();
m_UserAccountService = u;
}
public void Cache(UUID userID, UserAccount account)
{
// Cache even null accounts
m_UUIDCache.AddOrUpdate(userID, account, CACHE_EXPIRATION_SECONDS);
//m_log.DebugFormat("[USER CACHE]: cached user {0}", userID);
}
public UserAccount Get(UUID userID, out bool inCache)
{
UserAccount account = null;
inCache = false;
if (m_UUIDCache.TryGetValue(userID, out account))
{
//m_log.DebugFormat("[USER CACHE]: Account {0} {1} found in cache", account.FirstName, account.LastName);
inCache = true;
return account;
}
return null;
}
public UserAccount GetUser(string id)
{
UUID uuid = UUID.Zero;
UUID.TryParse(id, out uuid);
bool inCache = false;
UserAccount account = Get(uuid, out inCache);
if (!inCache)
{
account = m_UserAccountService.GetUserAccount(UUID.Zero, uuid);
Cache(uuid, account);
}
return account;
}
#region IUserAccountService
public UserAccount GetUserAccount(UUID scopeID, UUID userID)
{
return GetUser(userID.ToString());
}
public UserAccount GetUserAccount(UUID scopeID, string FirstName, string LastName)
{
return null;
}
public UserAccount GetUserAccount(UUID scopeID, string Email)
{
return null;
}
public List<UserAccount> GetUserAccounts(UUID scopeID, string query)
{
return null;
}
public void InvalidateCache(UUID userID)
{
m_UUIDCache.Remove(userID);
}
public bool StoreUserAccount(UserAccount data)
{
return false;
}
#endregion
}
}
|