aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Data/PGSQL/PGSQLGroupsData.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Data/PGSQL/PGSQLGroupsData.cs')
-rw-r--r--OpenSim/Data/PGSQL/PGSQLGroupsData.cs481
1 files changed, 481 insertions, 0 deletions
diff --git a/OpenSim/Data/PGSQL/PGSQLGroupsData.cs b/OpenSim/Data/PGSQL/PGSQLGroupsData.cs
new file mode 100644
index 0000000..ed75b63
--- /dev/null
+++ b/OpenSim/Data/PGSQL/PGSQLGroupsData.cs
@@ -0,0 +1,481 @@
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 System.Reflection;
32using OpenSim.Framework;
33using OpenMetaverse;
34using Npgsql;
35
36namespace OpenSim.Data.PGSQL
37{
38 public class PGSQLGroupsData : IGroupsData
39 {
40 private PGSqlGroupsGroupsHandler m_Groups;
41 private PGSqlGroupsMembershipHandler m_Membership;
42 private PGSqlGroupsRolesHandler m_Roles;
43 private PGSqlGroupsRoleMembershipHandler m_RoleMembership;
44 private PGSqlGroupsInvitesHandler m_Invites;
45 private PGSqlGroupsNoticesHandler m_Notices;
46 private PGSqlGroupsPrincipalsHandler m_Principals;
47
48 public PGSQLGroupsData(string connectionString, string realm)
49 {
50 m_Groups = new PGSqlGroupsGroupsHandler(connectionString, realm + "_groups", realm + "_Store");
51 m_Membership = new PGSqlGroupsMembershipHandler(connectionString, realm + "_membership");
52 m_Roles = new PGSqlGroupsRolesHandler(connectionString, realm + "_roles");
53 m_RoleMembership = new PGSqlGroupsRoleMembershipHandler(connectionString, realm + "_rolemembership");
54 m_Invites = new PGSqlGroupsInvitesHandler(connectionString, realm + "_invites");
55 m_Notices = new PGSqlGroupsNoticesHandler(connectionString, realm + "_notices");
56 m_Principals = new PGSqlGroupsPrincipalsHandler(connectionString, realm + "_principals");
57 }
58
59 #region groups table
60 public bool StoreGroup(GroupData data)
61 {
62 return m_Groups.Store(data);
63 }
64
65 public GroupData RetrieveGroup(UUID groupID)
66 {
67 GroupData[] groups = m_Groups.Get("GroupID", groupID.ToString());
68 if (groups.Length > 0)
69 return groups[0];
70
71 return null;
72 }
73
74 public GroupData RetrieveGroup(string name)
75 {
76 GroupData[] groups = m_Groups.Get("Name", name);
77 if (groups.Length > 0)
78 return groups[0];
79
80 return null;
81 }
82
83 public GroupData[] RetrieveGroups(string pattern)
84 {
85 if (string.IsNullOrEmpty(pattern)) // True for where clause
86 pattern = " true ORDER BY lower(\"Name\") LIMIT 100";
87 else
88 pattern = string.Format(" lower(\"Name\") LIKE lower('%{0}%') ORDER BY lower(\"Name\") LIMIT 100", pattern);
89
90 return m_Groups.Get(pattern);
91 }
92
93 public bool DeleteGroup(UUID groupID)
94 {
95 return m_Groups.Delete("GroupID", groupID.ToString());
96 }
97
98 public int GroupsCount()
99 {
100 return (int)m_Groups.GetCount(" \"Location\" = \"\"");
101 }
102
103 #endregion
104
105 #region membership table
106 public MembershipData[] RetrieveMembers(UUID groupID)
107 {
108 return m_Membership.Get("GroupID", groupID.ToString());
109 }
110
111 public MembershipData RetrieveMember(UUID groupID, string pricipalID)
112 {
113 MembershipData[] m = m_Membership.Get(new string[] { "GroupID", "PrincipalID" },
114 new string[] { groupID.ToString(), pricipalID });
115 if (m != null && m.Length > 0)
116 return m[0];
117
118 return null;
119 }
120
121 public MembershipData[] RetrieveMemberships(string pricipalID)
122 {
123 return m_Membership.Get("PrincipalID", pricipalID.ToString());
124 }
125
126 public bool StoreMember(MembershipData data)
127 {
128 return m_Membership.Store(data);
129 }
130
131 public bool DeleteMember(UUID groupID, string pricipalID)
132 {
133 return m_Membership.Delete(new string[] { "GroupID", "PrincipalID" },
134 new string[] { groupID.ToString(), pricipalID });
135 }
136
137 public int MemberCount(UUID groupID)
138 {
139 return (int)m_Membership.GetCount("GroupID", groupID.ToString());
140 }
141 #endregion
142
143 #region roles table
144 public bool StoreRole(RoleData data)
145 {
146 return m_Roles.Store(data);
147 }
148
149 public RoleData RetrieveRole(UUID groupID, UUID roleID)
150 {
151 RoleData[] data = m_Roles.Get(new string[] { "GroupID", "RoleID" },
152 new string[] { groupID.ToString(), roleID.ToString() });
153
154 if (data != null && data.Length > 0)
155 return data[0];
156
157 return null;
158 }
159
160 public RoleData[] RetrieveRoles(UUID groupID)
161 {
162 //return m_Roles.RetrieveRoles(groupID);
163 return m_Roles.Get("GroupID", groupID.ToString());
164 }
165
166 public bool DeleteRole(UUID groupID, UUID roleID)
167 {
168 return m_Roles.Delete(new string[] { "GroupID", "RoleID" },
169 new string[] { groupID.ToString(), roleID.ToString() });
170 }
171
172 public int RoleCount(UUID groupID)
173 {
174 return (int)m_Roles.GetCount("GroupID", groupID.ToString());
175 }
176
177
178 #endregion
179
180 #region rolememberhip table
181 public RoleMembershipData[] RetrieveRolesMembers(UUID groupID)
182 {
183 RoleMembershipData[] data = m_RoleMembership.Get("GroupID", groupID.ToString());
184
185 return data;
186 }
187
188 public RoleMembershipData[] RetrieveRoleMembers(UUID groupID, UUID roleID)
189 {
190 RoleMembershipData[] data = m_RoleMembership.Get(new string[] { "GroupID", "RoleID" },
191 new string[] { groupID.ToString(), roleID.ToString() });
192
193 return data;
194 }
195
196 public RoleMembershipData[] RetrieveMemberRoles(UUID groupID, string principalID)
197 {
198 RoleMembershipData[] data = m_RoleMembership.Get(new string[] { "GroupID", "PrincipalID" },
199 new string[] { groupID.ToString(), principalID.ToString() });
200
201 return data;
202 }
203
204 public RoleMembershipData RetrieveRoleMember(UUID groupID, UUID roleID, string principalID)
205 {
206 RoleMembershipData[] data = m_RoleMembership.Get(new string[] { "GroupID", "RoleID", "PrincipalID" },
207 new string[] { groupID.ToString(), roleID.ToString(), principalID.ToString() });
208
209 if (data != null && data.Length > 0)
210 return data[0];
211
212 return null;
213 }
214
215 public int RoleMemberCount(UUID groupID, UUID roleID)
216 {
217 return (int)m_RoleMembership.GetCount(new string[] { "GroupID", "RoleID" },
218 new string[] { groupID.ToString(), roleID.ToString() });
219 }
220
221 public bool StoreRoleMember(RoleMembershipData data)
222 {
223 return m_RoleMembership.Store(data);
224 }
225
226 public bool DeleteRoleMember(RoleMembershipData data)
227 {
228 return m_RoleMembership.Delete(new string[] { "GroupID", "RoleID", "PrincipalID"},
229 new string[] { data.GroupID.ToString(), data.RoleID.ToString(), data.PrincipalID });
230 }
231
232 public bool DeleteMemberAllRoles(UUID groupID, string principalID)
233 {
234 return m_RoleMembership.Delete(new string[] { "GroupID", "PrincipalID" },
235 new string[] { groupID.ToString(), principalID });
236 }
237
238 #endregion
239
240 #region principals table
241 public bool StorePrincipal(PrincipalData data)
242 {
243 return m_Principals.Store(data);
244 }
245
246 public PrincipalData RetrievePrincipal(string principalID)
247 {
248 PrincipalData[] p = m_Principals.Get("PrincipalID", principalID);
249 if (p != null && p.Length > 0)
250 return p[0];
251
252 return null;
253 }
254
255 public bool DeletePrincipal(string principalID)
256 {
257 return m_Principals.Delete("PrincipalID", principalID);
258 }
259 #endregion
260
261 #region invites table
262
263 public bool StoreInvitation(InvitationData data)
264 {
265 return m_Invites.Store(data);
266 }
267
268 public InvitationData RetrieveInvitation(UUID inviteID)
269 {
270 InvitationData[] invites = m_Invites.Get("InviteID", inviteID.ToString());
271
272 if (invites != null && invites.Length > 0)
273 return invites[0];
274
275 return null;
276 }
277
278 public InvitationData RetrieveInvitation(UUID groupID, string principalID)
279 {
280 InvitationData[] invites = m_Invites.Get(new string[] { "GroupID", "PrincipalID" },
281 new string[] { groupID.ToString(), principalID });
282
283 if (invites != null && invites.Length > 0)
284 return invites[0];
285
286 return null;
287 }
288
289 public bool DeleteInvite(UUID inviteID)
290 {
291 return m_Invites.Delete("InviteID", inviteID.ToString());
292 }
293
294 public void DeleteOldInvites()
295 {
296 m_Invites.DeleteOld();
297 }
298
299 #endregion
300
301 #region notices table
302
303 public bool StoreNotice(NoticeData data)
304 {
305 return m_Notices.Store(data);
306 }
307
308 public NoticeData RetrieveNotice(UUID noticeID)
309 {
310 NoticeData[] notices = m_Notices.Get("NoticeID", noticeID.ToString());
311
312 if (notices != null && notices.Length > 0)
313 return notices[0];
314
315 return null;
316 }
317
318 public NoticeData[] RetrieveNotices(UUID groupID)
319 {
320 NoticeData[] notices = m_Notices.Get("GroupID", groupID.ToString());
321
322 return notices;
323 }
324
325 public bool DeleteNotice(UUID noticeID)
326 {
327 return m_Notices.Delete("NoticeID", noticeID.ToString());
328 }
329
330 public void DeleteOldNotices()
331 {
332 m_Notices.DeleteOld();
333 }
334
335 #endregion
336
337 #region combinations
338 public MembershipData RetrievePrincipalGroupMembership(string principalID, UUID groupID)
339 {
340 // TODO
341 return null;
342 }
343 public MembershipData[] RetrievePrincipalGroupMemberships(string principalID)
344 {
345 // TODO
346 return null;
347 }
348
349 #endregion
350 }
351
352 public class PGSqlGroupsGroupsHandler : PGSQLGenericTableHandler<GroupData>
353 {
354 protected override Assembly Assembly
355 {
356 // WARNING! Moving migrations to this assembly!!!
357 get { return GetType().Assembly; }
358 }
359
360 public PGSqlGroupsGroupsHandler(string connectionString, string realm, string store)
361 : base(connectionString, realm, store)
362 {
363 }
364
365 }
366
367 public class PGSqlGroupsMembershipHandler : PGSQLGenericTableHandler<MembershipData>
368 {
369 protected override Assembly Assembly
370 {
371 // WARNING! Moving migrations to this assembly!!!
372 get { return GetType().Assembly; }
373 }
374
375 public PGSqlGroupsMembershipHandler(string connectionString, string realm)
376 : base(connectionString, realm, string.Empty)
377 {
378 }
379
380 }
381
382 public class PGSqlGroupsRolesHandler : PGSQLGenericTableHandler<RoleData>
383 {
384 protected override Assembly Assembly
385 {
386 // WARNING! Moving migrations to this assembly!!!
387 get { return GetType().Assembly; }
388 }
389
390 public PGSqlGroupsRolesHandler(string connectionString, string realm)
391 : base(connectionString, realm, string.Empty)
392 {
393 }
394
395 }
396
397 public class PGSqlGroupsRoleMembershipHandler : PGSQLGenericTableHandler<RoleMembershipData>
398 {
399 protected override Assembly Assembly
400 {
401 // WARNING! Moving migrations to this assembly!!!
402 get { return GetType().Assembly; }
403 }
404
405 public PGSqlGroupsRoleMembershipHandler(string connectionString, string realm)
406 : base(connectionString, realm, string.Empty)
407 {
408 }
409
410 }
411
412 public class PGSqlGroupsInvitesHandler : PGSQLGenericTableHandler<InvitationData>
413 {
414 protected override Assembly Assembly
415 {
416 // WARNING! Moving migrations to this assembly!!!
417 get { return GetType().Assembly; }
418 }
419
420 public PGSqlGroupsInvitesHandler(string connectionString, string realm)
421 : base(connectionString, realm, string.Empty)
422 {
423 }
424
425 public void DeleteOld()
426 {
427 uint now = (uint)Util.UnixTimeSinceEpoch();
428
429 using (NpgsqlCommand cmd = new NpgsqlCommand())
430 {
431 cmd.CommandText = String.Format("delete from {0} where \"TMStamp\" < :tstamp", m_Realm);
432 cmd.Parameters.AddWithValue("tstamp", now - 14 * 24 * 60 * 60); // > 2 weeks old
433
434 ExecuteNonQuery(cmd);
435 }
436
437 }
438 }
439
440 public class PGSqlGroupsNoticesHandler : PGSQLGenericTableHandler<NoticeData>
441 {
442 protected override Assembly Assembly
443 {
444 // WARNING! Moving migrations to this assembly!!!
445 get { return GetType().Assembly; }
446 }
447
448 public PGSqlGroupsNoticesHandler(string connectionString, string realm)
449 : base(connectionString, realm, string.Empty)
450 {
451 }
452
453 public void DeleteOld()
454 {
455 uint now = (uint)Util.UnixTimeSinceEpoch();
456
457 using (NpgsqlCommand cmd = new NpgsqlCommand())
458 {
459 cmd.CommandText = String.Format("delete from {0} where \"TMStamp\" < :tstamp", m_Realm);
460 cmd.Parameters.AddWithValue("tstamp", now - 14 * 24 * 60 * 60); // > 2 weeks old
461
462 ExecuteNonQuery(cmd);
463 }
464
465 }
466 }
467
468 public class PGSqlGroupsPrincipalsHandler : PGSQLGenericTableHandler<PrincipalData>
469 {
470 protected override Assembly Assembly
471 {
472 // WARNING! Moving migrations to this assembly!!!
473 get { return GetType().Assembly; }
474 }
475
476 public PGSqlGroupsPrincipalsHandler(string connectionString, string realm)
477 : base(connectionString, realm, string.Empty)
478 {
479 }
480 }
481}