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