aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Data/Null
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Data/Null')
-rw-r--r--OpenSim/Data/Null/NullAuthenticationData.cs81
-rw-r--r--OpenSim/Data/Null/NullAvatarData.cs93
-rw-r--r--OpenSim/Data/Null/NullPresenceData.cs257
-rw-r--r--OpenSim/Data/Null/NullRegionData.cs61
-rw-r--r--OpenSim/Data/Null/NullUserAccountData.cs139
5 files changed, 631 insertions, 0 deletions
diff --git a/OpenSim/Data/Null/NullAuthenticationData.cs b/OpenSim/Data/Null/NullAuthenticationData.cs
new file mode 100644
index 0000000..3fb3105
--- /dev/null
+++ b/OpenSim/Data/Null/NullAuthenticationData.cs
@@ -0,0 +1,81 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using OpenMetaverse;
32using OpenSim.Framework;
33using OpenSim.Data;
34
35namespace OpenSim.Data.Null
36{
37 public class NullAuthenticationData : IAuthenticationData
38 {
39 private static Dictionary<UUID, AuthenticationData> m_DataByUUID = new Dictionary<UUID, AuthenticationData>();
40 private static Dictionary<UUID, string> m_Tokens = new Dictionary<UUID, string>();
41
42 public NullAuthenticationData(string connectionString, string realm)
43 {
44 }
45
46 public AuthenticationData Get(UUID principalID)
47 {
48 if (m_DataByUUID.ContainsKey(principalID))
49 return m_DataByUUID[principalID];
50
51 return null;
52 }
53
54 public bool Store(AuthenticationData data)
55 {
56 m_DataByUUID[data.PrincipalID] = data;
57 return true;
58 }
59
60 public bool SetDataItem(UUID principalID, string item, string value)
61 {
62 // Not implemented
63 return false;
64 }
65
66 public bool SetToken(UUID principalID, string token, int lifetime)
67 {
68 m_Tokens[principalID] = token;
69 return true;
70 }
71
72 public bool CheckToken(UUID principalID, string token, int lifetime)
73 {
74 if (m_Tokens.ContainsKey(principalID))
75 return m_Tokens[principalID] == token;
76
77 return false;
78 }
79
80 }
81}
diff --git a/OpenSim/Data/Null/NullAvatarData.cs b/OpenSim/Data/Null/NullAvatarData.cs
new file mode 100644
index 0000000..c81ba43
--- /dev/null
+++ b/OpenSim/Data/Null/NullAvatarData.cs
@@ -0,0 +1,93 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using OpenMetaverse;
32using OpenSim.Framework;
33using OpenSim.Data;
34
35namespace OpenSim.Data.Null
36{
37 public class NullAvatarData : IAvatarData
38 {
39 private static Dictionary<UUID, AvatarBaseData> m_DataByUUID = new Dictionary<UUID, AvatarBaseData>();
40
41 public NullAvatarData(string connectionString, string realm)
42 {
43 }
44
45 public AvatarBaseData[] Get(string field, string val)
46 {
47 if (field == "PrincipalID")
48 {
49 UUID id = UUID.Zero;
50 if (UUID.TryParse(val, out id))
51 if (m_DataByUUID.ContainsKey(id))
52 return new AvatarBaseData[] { m_DataByUUID[id] };
53 }
54
55 // Fail
56 return new AvatarBaseData[0];
57 }
58
59 public bool Store(AvatarBaseData data)
60 {
61 m_DataByUUID[data.PrincipalID] = data;
62 return true;
63 }
64
65 public bool Delete(UUID principalID, string name)
66 {
67 if (m_DataByUUID.ContainsKey(principalID) && m_DataByUUID[principalID].Data.ContainsKey(name))
68 {
69 m_DataByUUID[principalID].Data.Remove(name);
70 return true;
71 }
72
73 return false;
74 }
75
76 public bool Delete(string field, string val)
77 {
78 if (field == "PrincipalID")
79 {
80 UUID id = UUID.Zero;
81 if (UUID.TryParse(val, out id))
82 if (m_DataByUUID.ContainsKey(id))
83 {
84 m_DataByUUID.Remove(id);
85 return true;
86 }
87 }
88
89 return false;
90 }
91
92 }
93}
diff --git a/OpenSim/Data/Null/NullPresenceData.cs b/OpenSim/Data/Null/NullPresenceData.cs
new file mode 100644
index 0000000..40700cf
--- /dev/null
+++ b/OpenSim/Data/Null/NullPresenceData.cs
@@ -0,0 +1,257 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using OpenMetaverse;
32using OpenSim.Framework;
33using OpenSim.Data;
34
35namespace OpenSim.Data.Null
36{
37 public class NullPresenceData : IPresenceData
38 {
39 private static NullPresenceData Instance;
40
41 Dictionary<UUID, PresenceData> m_presenceData = new Dictionary<UUID, PresenceData>();
42
43 public NullPresenceData(string connectionString, string realm)
44 {
45 if (Instance == null)
46 Instance = this;
47
48 //Console.WriteLine("[XXX] NullRegionData constructor");
49 // Let's stick in a test presence
50 PresenceData p = new PresenceData();
51 p.SessionID = UUID.Zero;
52 p.UserID = UUID.Zero.ToString();
53 p.Data = new Dictionary<string, string>();
54 p.Data["Online"] = "true";
55 m_presenceData.Add(UUID.Zero, p);
56 }
57
58 public bool Store(PresenceData data)
59 {
60 if (Instance != this)
61 return Instance.Store(data);
62
63 m_presenceData[data.SessionID] = data;
64 return true;
65 }
66
67 public PresenceData Get(UUID sessionID)
68 {
69 if (Instance != this)
70 return Instance.Get(sessionID);
71
72 if (m_presenceData.ContainsKey(sessionID))
73 return m_presenceData[sessionID];
74
75 return null;
76 }
77
78 public void LogoutRegionAgents(UUID regionID)
79 {
80 if (Instance != this)
81 {
82 Instance.LogoutRegionAgents(regionID);
83 return;
84 }
85
86 List<UUID> toBeDeleted = new List<UUID>();
87 foreach (KeyValuePair<UUID, PresenceData> kvp in m_presenceData)
88 if (kvp.Value.RegionID == regionID)
89 toBeDeleted.Add(kvp.Key);
90
91 foreach (UUID u in toBeDeleted)
92 m_presenceData.Remove(u);
93 }
94
95 public bool ReportAgent(UUID sessionID, UUID regionID, string position, string lookAt)
96 {
97 if (Instance != this)
98 return Instance.ReportAgent(sessionID, regionID, position, lookAt);
99 if (m_presenceData.ContainsKey(sessionID))
100 {
101 m_presenceData[sessionID].RegionID = regionID;
102 m_presenceData[sessionID].Data["Position"] = position;
103 m_presenceData[sessionID].Data["LookAt"] = lookAt;
104 return true;
105 }
106
107 return false;
108 }
109
110 public bool SetHomeLocation(string userID, UUID regionID, Vector3 position, Vector3 lookAt)
111 {
112 if (Instance != this)
113 return Instance.SetHomeLocation(userID, regionID, position, lookAt);
114
115 bool foundone = false;
116 foreach (PresenceData p in m_presenceData.Values)
117 {
118 if (p.UserID == userID)
119 {
120 p.Data["HomeRegionID"] = regionID.ToString();
121 p.Data["HomePosition"] = position.ToString();
122 p.Data["HomeLookAt"] = lookAt.ToString();
123 foundone = true;
124 }
125 }
126
127 return foundone;
128 }
129
130 public PresenceData[] Get(string field, string data)
131 {
132 if (Instance != this)
133 return Instance.Get(field, data);
134
135 List<PresenceData> presences = new List<PresenceData>();
136 if (field == "UserID")
137 {
138 foreach (PresenceData p in m_presenceData.Values)
139 if (p.UserID == data)
140 presences.Add(p);
141 return presences.ToArray();
142 }
143 else if (field == "SessionID")
144 {
145 UUID session = UUID.Zero;
146 if (!UUID.TryParse(data, out session))
147 return presences.ToArray();
148
149 if (m_presenceData.ContainsKey(session))
150 {
151 presences.Add(m_presenceData[session]);
152 return presences.ToArray();
153 }
154 }
155 else if (field == "RegionID")
156 {
157 UUID region = UUID.Zero;
158 if (!UUID.TryParse(data, out region))
159 return presences.ToArray();
160 foreach (PresenceData p in m_presenceData.Values)
161 if (p.RegionID == region)
162 presences.Add(p);
163 return presences.ToArray();
164 }
165 else
166 {
167 foreach (PresenceData p in m_presenceData.Values)
168 {
169 if (p.Data.ContainsKey(field) && p.Data[field] == data)
170 presences.Add(p);
171 }
172 return presences.ToArray();
173 }
174
175 return presences.ToArray();
176 }
177
178 public void Prune(string userID)
179 {
180 if (Instance != this)
181 {
182 Instance.Prune(userID);
183 return;
184 }
185
186 List<UUID> deleteSessions = new List<UUID>();
187 int online = 0;
188
189 foreach (KeyValuePair<UUID, PresenceData> kvp in m_presenceData)
190 {
191 bool on = false;
192 if (bool.TryParse(kvp.Value.Data["Online"], out on) && on)
193 online++;
194 else
195 deleteSessions.Add(kvp.Key);
196 }
197 if (online == 0 && deleteSessions.Count > 0)
198 deleteSessions.RemoveAt(0);
199
200 foreach (UUID s in deleteSessions)
201 m_presenceData.Remove(s);
202
203 }
204
205 public bool Delete(string field, string data)
206 {
207 if (Instance != this)
208 return Delete(field, data);
209
210 List<UUID> presences = new List<UUID>();
211 if (field == "UserID")
212 {
213 foreach (KeyValuePair<UUID, PresenceData> p in m_presenceData)
214 if (p.Value.UserID == data)
215 presences.Add(p.Key);
216 }
217 else if (field == "SessionID")
218 {
219 UUID session = UUID.Zero;
220 if (UUID.TryParse(data, out session))
221 {
222 if (m_presenceData.ContainsKey(session))
223 {
224 presences.Add(session);
225 }
226 }
227 }
228 else if (field == "RegionID")
229 {
230 UUID region = UUID.Zero;
231 if (UUID.TryParse(data, out region))
232 {
233 foreach (KeyValuePair<UUID, PresenceData> p in m_presenceData)
234 if (p.Value.RegionID == region)
235 presences.Add(p.Key);
236 }
237 }
238 else
239 {
240 foreach (KeyValuePair<UUID, PresenceData> p in m_presenceData)
241 {
242 if (p.Value.Data.ContainsKey(field) && p.Value.Data[field] == data)
243 presences.Add(p.Key);
244 }
245 }
246
247 foreach (UUID u in presences)
248 m_presenceData.Remove(u);
249
250 if (presences.Count == 0)
251 return false;
252
253 return true;
254 }
255
256 }
257}
diff --git a/OpenSim/Data/Null/NullRegionData.cs b/OpenSim/Data/Null/NullRegionData.cs
index e8263ea..5b9898c 100644
--- a/OpenSim/Data/Null/NullRegionData.cs
+++ b/OpenSim/Data/Null/NullRegionData.cs
@@ -31,20 +31,31 @@ using System.Collections.Generic;
31using OpenMetaverse; 31using OpenMetaverse;
32using OpenSim.Framework; 32using OpenSim.Framework;
33using OpenSim.Data; 33using OpenSim.Data;
34using System.Reflection;
35using log4net;
34 36
35namespace OpenSim.Data.Null 37namespace OpenSim.Data.Null
36{ 38{
37 public class NullRegionData : IRegionData 39 public class NullRegionData : IRegionData
38 { 40 {
41 private static NullRegionData Instance = null;
42
43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44
39 Dictionary<UUID, RegionData> m_regionData = new Dictionary<UUID, RegionData>(); 45 Dictionary<UUID, RegionData> m_regionData = new Dictionary<UUID, RegionData>();
40 46
41 public NullRegionData(string connectionString, string realm) 47 public NullRegionData(string connectionString, string realm)
42 { 48 {
49 if (Instance == null)
50 Instance = this;
43 //Console.WriteLine("[XXX] NullRegionData constructor"); 51 //Console.WriteLine("[XXX] NullRegionData constructor");
44 } 52 }
45 53
46 public List<RegionData> Get(string regionName, UUID scopeID) 54 public List<RegionData> Get(string regionName, UUID scopeID)
47 { 55 {
56 if (Instance != this)
57 return Instance.Get(regionName, scopeID);
58
48 List<RegionData> ret = new List<RegionData>(); 59 List<RegionData> ret = new List<RegionData>();
49 60
50 foreach (RegionData r in m_regionData.Values) 61 foreach (RegionData r in m_regionData.Values)
@@ -69,6 +80,9 @@ namespace OpenSim.Data.Null
69 80
70 public RegionData Get(int posX, int posY, UUID scopeID) 81 public RegionData Get(int posX, int posY, UUID scopeID)
71 { 82 {
83 if (Instance != this)
84 return Instance.Get(posX, posY, scopeID);
85
72 List<RegionData> ret = new List<RegionData>(); 86 List<RegionData> ret = new List<RegionData>();
73 87
74 foreach (RegionData r in m_regionData.Values) 88 foreach (RegionData r in m_regionData.Values)
@@ -85,6 +99,9 @@ namespace OpenSim.Data.Null
85 99
86 public RegionData Get(UUID regionID, UUID scopeID) 100 public RegionData Get(UUID regionID, UUID scopeID)
87 { 101 {
102 if (Instance != this)
103 return Instance.Get(regionID, scopeID);
104
88 if (m_regionData.ContainsKey(regionID)) 105 if (m_regionData.ContainsKey(regionID))
89 return m_regionData[regionID]; 106 return m_regionData[regionID];
90 107
@@ -93,6 +110,9 @@ namespace OpenSim.Data.Null
93 110
94 public List<RegionData> Get(int startX, int startY, int endX, int endY, UUID scopeID) 111 public List<RegionData> Get(int startX, int startY, int endX, int endY, UUID scopeID)
95 { 112 {
113 if (Instance != this)
114 return Instance.Get(startX, startY, endX, endY, scopeID);
115
96 List<RegionData> ret = new List<RegionData>(); 116 List<RegionData> ret = new List<RegionData>();
97 117
98 foreach (RegionData r in m_regionData.Values) 118 foreach (RegionData r in m_regionData.Values)
@@ -106,6 +126,9 @@ namespace OpenSim.Data.Null
106 126
107 public bool Store(RegionData data) 127 public bool Store(RegionData data)
108 { 128 {
129 if (Instance != this)
130 return Instance.Store(data);
131
109 m_regionData[data.RegionID] = data; 132 m_regionData[data.RegionID] = data;
110 133
111 return true; 134 return true;
@@ -113,6 +136,9 @@ namespace OpenSim.Data.Null
113 136
114 public bool SetDataItem(UUID regionID, string item, string value) 137 public bool SetDataItem(UUID regionID, string item, string value)
115 { 138 {
139 if (Instance != this)
140 return Instance.SetDataItem(regionID, item, value);
141
116 if (!m_regionData.ContainsKey(regionID)) 142 if (!m_regionData.ContainsKey(regionID))
117 return false; 143 return false;
118 144
@@ -123,6 +149,9 @@ namespace OpenSim.Data.Null
123 149
124 public bool Delete(UUID regionID) 150 public bool Delete(UUID regionID)
125 { 151 {
152 if (Instance != this)
153 return Instance.Delete(regionID);
154
126 if (!m_regionData.ContainsKey(regionID)) 155 if (!m_regionData.ContainsKey(regionID))
127 return false; 156 return false;
128 157
@@ -130,5 +159,37 @@ namespace OpenSim.Data.Null
130 159
131 return true; 160 return true;
132 } 161 }
162
163 public List<RegionData> GetDefaultRegions(UUID scopeID)
164 {
165 if (Instance != this)
166 return Instance.GetDefaultRegions(scopeID);
167
168 List<RegionData> ret = new List<RegionData>();
169
170 foreach (RegionData r in m_regionData.Values)
171 {
172 if ((Convert.ToInt32(r.Data["flags"]) & 1) != 0)
173 ret.Add(r);
174 }
175
176 return ret;
177 }
178
179 public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
180 {
181 if (Instance != this)
182 return Instance.GetFallbackRegions(scopeID, x, y);
183
184 List<RegionData> ret = new List<RegionData>();
185
186 foreach (RegionData r in m_regionData.Values)
187 {
188 if ((Convert.ToInt32(r.Data["flags"]) & 2) != 0)
189 ret.Add(r);
190 }
191
192 return ret;
193 }
133 } 194 }
134} 195}
diff --git a/OpenSim/Data/Null/NullUserAccountData.cs b/OpenSim/Data/Null/NullUserAccountData.cs
new file mode 100644
index 0000000..fc2c5d5
--- /dev/null
+++ b/OpenSim/Data/Null/NullUserAccountData.cs
@@ -0,0 +1,139 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using OpenMetaverse;
32using OpenSim.Framework;
33using OpenSim.Data;
34
35namespace OpenSim.Data.Null
36{
37 public class NullUserAccountData : IUserAccountData
38 {
39 private static Dictionary<UUID, UserAccountData> m_DataByUUID = new Dictionary<UUID, UserAccountData>();
40 private static Dictionary<string, UserAccountData> m_DataByName = new Dictionary<string, UserAccountData>();
41 private static Dictionary<string, UserAccountData> m_DataByEmail = new Dictionary<string, UserAccountData>();
42
43 public NullUserAccountData(string connectionString, string realm)
44 {
45 }
46
47 /// <summary>
48 /// Tries to implement the Get [] semantics, but it cuts corners like crazy.
49 /// Specifically, it relies on the knowledge that the only Gets used are
50 /// keyed on PrincipalID, Email, and FirstName+LastName.
51 /// </summary>
52 /// <param name="fields"></param>
53 /// <param name="values"></param>
54 /// <returns></returns>
55 public UserAccountData[] Get(string[] fields, string[] values)
56 {
57 List<string> fieldsLst = new List<string>(fields);
58 if (fieldsLst.Contains("PrincipalID"))
59 {
60 int i = fieldsLst.IndexOf("PrincipalID");
61 UUID id = UUID.Zero;
62 if (UUID.TryParse(values[i], out id))
63 if (m_DataByUUID.ContainsKey(id))
64 return new UserAccountData[] { m_DataByUUID[id] };
65 }
66 if (fieldsLst.Contains("FirstName") && fieldsLst.Contains("LastName"))
67 {
68 int findex = fieldsLst.IndexOf("FirstName");
69 int lindex = fieldsLst.IndexOf("LastName");
70 if (m_DataByName.ContainsKey(values[findex] + " " + values[lindex]))
71 return new UserAccountData[] { m_DataByName[values[findex] + " " + values[lindex]] };
72 }
73 if (fieldsLst.Contains("Email"))
74 {
75 int i = fieldsLst.IndexOf("Email");
76 if (m_DataByEmail.ContainsKey(values[i]))
77 return new UserAccountData[] { m_DataByEmail[values[i]] };
78 }
79
80 // Fail
81 return new UserAccountData[0];
82 }
83
84 public bool Store(UserAccountData data)
85 {
86 if (data == null)
87 return false;
88
89 m_DataByUUID[data.PrincipalID] = data;
90 m_DataByName[data.FirstName + " " + data.LastName] = data;
91 if (data.Data.ContainsKey("Email") && data.Data["Email"] != string.Empty)
92 m_DataByEmail[data.Data["Email"]] = data;
93
94 return true;
95 }
96
97 public UserAccountData[] GetUsers(UUID scopeID, string query)
98 {
99 string[] words = query.Split(new char[] { ' ' });
100
101 for (int i = 0; i < words.Length; i++)
102 {
103 if (words[i].Length < 3)
104 {
105 if (i != words.Length - 1)
106 Array.Copy(words, i + 1, words, i, words.Length - i - 1);
107 Array.Resize(ref words, words.Length - 1);
108 }
109 }
110
111 if (words.Length == 0)
112 return new UserAccountData[0];
113
114 if (words.Length > 2)
115 return new UserAccountData[0];
116
117 List<string> lst = new List<string>(m_DataByName.Keys);
118 if (words.Length == 1)
119 {
120 lst = lst.FindAll(delegate(string s) { return s.StartsWith(words[0]); });
121 }
122 else
123 {
124 lst = lst.FindAll(delegate(string s) { return s.Contains(words[0]) || s.Contains(words[1]); });
125 }
126
127 if (lst == null || (lst != null && lst.Count == 0))
128 return new UserAccountData[0];
129
130 UserAccountData[] result = new UserAccountData[lst.Count];
131 int n = 0;
132 foreach (string key in lst)
133 result[n++] = m_DataByName[key];
134
135 return result;
136 }
137
138 }
139}