From 37f7c5a0ea272761793e072f2439e5b8e5f30e13 Mon Sep 17 00:00:00 2001
From: Justin Clarke Casey
Date: Tue, 20 Jan 2009 18:38:51 +0000
Subject: * Apply http://opensimulator.org/mantis/view.php?id=3020 * Adds a
grid db implementation and unit tests to the NHibernate module
---
OpenSim/Data/NHibernate/NHibernateGridData.cs | 241 ++++++++++++++++++++++++++
1 file changed, 241 insertions(+)
create mode 100644 OpenSim/Data/NHibernate/NHibernateGridData.cs
(limited to 'OpenSim/Data/NHibernate/NHibernateGridData.cs')
diff --git a/OpenSim/Data/NHibernate/NHibernateGridData.cs b/OpenSim/Data/NHibernate/NHibernateGridData.cs
new file mode 100644
index 0000000..912beca
--- /dev/null
+++ b/OpenSim/Data/NHibernate/NHibernateGridData.cs
@@ -0,0 +1,241 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using log4net;
+using System.Reflection;
+using OpenSim.Framework;
+using NHibernate;
+using NHibernate.Criterion;
+using System.Collections;
+using OpenMetaverse;
+
+namespace OpenSim.Data.NHibernate
+{
+
+ ///
+ /// A GridData Interface to the NHibernate database
+ ///
+ public class NHibernateGridData : GridDataBase
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ public NHibernateManager manager;
+
+ public override void Initialise()
+ {
+ m_log.Info("[NHibernateGridData]: " + Name + " cannot be default-initialized!");
+ throw new PluginNotInitialisedException(Name);
+ }
+
+ public override void Initialise(string connect)
+ {
+ m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateGridData");
+ manager = new NHibernateManager(connect, "GridStore");
+ }
+
+ /***********************************************************************
+ *
+ * Public Interface Functions
+ *
+ **********************************************************************/
+
+ public override void Dispose() { }
+
+ ///
+ /// The plugin being loaded
+ ///
+ /// A string containing the plugin name
+ public override string Name
+ {
+ get { return "NHibernate Grid Data Interface"; }
+ }
+
+ ///
+ /// The plugins version
+ ///
+ /// A string containing the plugin version
+ public override string Version
+ {
+ get
+ {
+ Module module = GetType().Module;
+ Version dllVersion = module.Assembly.GetName().Version;
+
+ return string.Format("{0}.{1}.{2}.{3}",
+ dllVersion.Major, dllVersion.Minor, dllVersion.Build, dllVersion.Revision);
+ }
+ }
+
+ public override bool AuthenticateSim(OpenMetaverse.UUID UUID, ulong regionHandle, string simrecvkey)
+ {
+ bool throwHissyFit = false; // Should be true by 1.0
+
+ if (throwHissyFit)
+ throw new Exception("CRYPTOWEAK AUTHENTICATE: Refusing to authenticate due to replay potential.");
+
+ RegionProfileData data = GetProfileByUUID(UUID);
+
+ return (regionHandle == data.regionHandle && simrecvkey == data.regionSecret);
+ }
+
+ public override ReservationData GetReservationAtPoint(uint x, uint y)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override DataResponse AddProfile(RegionProfileData profile)
+ {
+ if (manager.Load(typeof(RegionProfileData), profile.Uuid) == null)
+ {
+ manager.Save(profile);
+ return DataResponse.RESPONSE_OK;
+ }
+ else
+ {
+ return DataResponse.RESPONSE_ERROR;
+ }
+ }
+
+ public override DataResponse UpdateProfile(RegionProfileData profile)
+ {
+ if (manager.Load(typeof(RegionProfileData), profile.Uuid) != null)
+ {
+ manager.Update(profile);
+ return DataResponse.RESPONSE_OK;
+ }
+ else
+ {
+ return DataResponse.RESPONSE_ERROR;
+ }
+ }
+
+ public override DataResponse DeleteProfile(string uuid)
+ {
+ RegionProfileData regionProfileData = (RegionProfileData)manager.Load(typeof(RegionProfileData), new UUID(uuid));
+ if (regionProfileData != null)
+ {
+ manager.Delete(regionProfileData);
+ return DataResponse.RESPONSE_OK;
+ }
+ return DataResponse.RESPONSE_ERROR;
+ }
+
+ public override RegionProfileData GetProfileByUUID(OpenMetaverse.UUID UUID)
+ {
+ return (RegionProfileData)manager.Load(typeof(RegionProfileData), UUID);
+ }
+
+ public override RegionProfileData GetProfileByHandle(ulong regionHandle)
+ {
+ using (ISession session = manager.GetSession())
+ {
+ ICriteria criteria = session.CreateCriteria(typeof(RegionProfileData));
+ criteria.Add(Expression.Eq("RegionHandle", regionHandle));
+
+ IList regions = criteria.List();
+
+ if (regions.Count == 1)
+ {
+ return (RegionProfileData)regions[0];
+ }
+ else
+ {
+ return null;
+ }
+ }
+ }
+
+ public override RegionProfileData GetProfileByString(string regionName)
+ {
+
+ using (ISession session = manager.GetSession())
+ {
+ ICriteria criteria = session.CreateCriteria(typeof(RegionProfileData));
+ criteria.Add(Expression.Eq("RegionName", regionName));
+
+ IList regions = criteria.List();
+
+ if (regions.Count == 1)
+ {
+ return (RegionProfileData)regions[0];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ }
+
+ public override RegionProfileData[] GetProfilesInRange(uint Xmin, uint Ymin, uint Xmax, uint Ymax)
+ {
+ using (ISession session = manager.GetSession())
+ {
+ ICriteria criteria = session.CreateCriteria(typeof(RegionProfileData));
+ criteria.Add(Expression.Ge("RegionLocX", Xmin));
+ criteria.Add(Expression.Ge("RegionLocY", Ymin));
+ criteria.Add(Expression.Le("RegionLocX", Xmax));
+ criteria.Add(Expression.Le("RegionLocY", Ymax));
+
+ IList regions = criteria.List();
+ RegionProfileData[] regionArray = new RegionProfileData[regions.Count];
+
+ for(int i=0;i GetRegionsByName(string namePrefix, uint maxNum)
+ {
+ using (ISession session = manager.GetSession())
+ {
+ ICriteria criteria = session.CreateCriteria(typeof(RegionProfileData));
+ criteria.SetMaxResults((int)maxNum);
+
+ criteria.Add(Expression.Like("RegionName", namePrefix, MatchMode.Start));
+
+ IList regions = criteria.List();
+ List regionList = new List();
+
+ foreach (RegionProfileData regionProfileData in regions)
+ {
+ regionList.Add(regionProfileData);
+ }
+
+ return regionList;
+ }
+ }
+
+ }
+}
--
cgit v1.1