From e7362738155c0a0a5c9ef8b867eb14b18bb31a44 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Fri, 18 Sep 2009 19:16:30 -0700
Subject: First pass at the grid service.
---
OpenSim/Data/IRegionData.cs | 3 +-
OpenSim/Services/Grid/GridService.cs | 79 -------
OpenSim/Services/GridService/GridService.cs | 297 ++++++++++++++++++++++++
OpenSim/Services/GridService/GridServiceBase.cs | 84 +++++++
OpenSim/Services/Interfaces/IGridService.cs | 17 +-
prebuild.xml | 31 +++
6 files changed, 425 insertions(+), 86 deletions(-)
delete mode 100644 OpenSim/Services/Grid/GridService.cs
create mode 100644 OpenSim/Services/GridService/GridService.cs
create mode 100644 OpenSim/Services/GridService/GridServiceBase.cs
diff --git a/OpenSim/Data/IRegionData.cs b/OpenSim/Data/IRegionData.cs
index 71dd525..c5201ea 100644
--- a/OpenSim/Data/IRegionData.cs
+++ b/OpenSim/Data/IRegionData.cs
@@ -45,7 +45,7 @@ namespace OpenSim.Data
///
/// An interface for connecting to the authentication datastore
///
- public interface IRegionData
+ public interface IRegionData
{
RegionData Get(UUID regionID, UUID ScopeID);
List Get(string regionName, UUID ScopeID);
@@ -57,5 +57,6 @@ namespace OpenSim.Data
bool SetDataItem(UUID principalID, string item, string value);
bool Delete(UUID regionID);
+
}
}
diff --git a/OpenSim/Services/Grid/GridService.cs b/OpenSim/Services/Grid/GridService.cs
deleted file mode 100644
index 47710d8..0000000
--- a/OpenSim/Services/Grid/GridService.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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 OpenSimulator 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.Collections.Generic;
-using OpenMetaverse;
-using OpenSim.Services.Interfaces;
-
-namespace OpenSim.Services.Interfaces
-{
- public class GridService : IGridService
- {
- bool RegisterRegion(UUID scopeID, RegionInfo regionInfos);
- {
- return false;
- }
-
- bool DeregisterRegion(UUID regionID);
- {
- return false;
- }
-
- List RequestNeighbours(UUID scopeID, uint x, uint y)
- {
- return new List()
- }
-
- RegionInfo RequestNeighbourInfo(UUID regionID)
- {
- return null;
- }
-
- RegionInfo RequestClosestRegion(UUID scopeID, string regionName)
- {
- return null;
- }
-
- List RequestNeighbourMapBlocks(UUID scopeID, int minX,
- int minY, int maxX, int maxY)
- {
- return new List();
- }
-
- LandData RequestLandData(UUID scopeID, ulong regionHandle,
- uint x, uint y)
- {
- return null;
- }
-
- List RequestNamedRegions(UUID scopeID, string name,
- int maxNumber)
- {
- return new List();
- }
- }
-}
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
new file mode 100644
index 0000000..6aa1c4f
--- /dev/null
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -0,0 +1,297 @@
+/*
+ * 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 OpenSimulator 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.Net;
+using System.Reflection;
+using Nini.Config;
+using log4net;
+using OpenSim.Framework;
+using OpenSim.Framework.Console;
+using OpenSim.Data;
+using OpenSim.Services.Interfaces;
+using OpenMetaverse;
+
+namespace OpenSim.Services.GridService
+{
+ public class GridService : GridServiceBase, IGridService
+ {
+ private static readonly ILog m_log =
+ LogManager.GetLogger(
+ MethodBase.GetCurrentMethod().DeclaringType);
+
+ public GridService(IConfigSource config)
+ : base(config)
+ {
+ MainConsole.Instance.Commands.AddCommand("kfs", false,
+ "show digest",
+ "show digest ",
+ "Show asset digest", HandleShowDigest);
+
+ MainConsole.Instance.Commands.AddCommand("kfs", false,
+ "delete asset",
+ "delete asset ",
+ "Delete asset from database", HandleDeleteAsset);
+
+ }
+
+ #region IGridService
+
+ public bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfos)
+ {
+ if (m_Database.Get(regionInfos.RegionID, scopeID) != null)
+ {
+ m_log.WarnFormat("[GRID SERVICE]: Region {0} already registered in scope {1}.", regionInfos.RegionID, scopeID);
+ return false;
+ }
+ if (m_Database.Get((int)regionInfos.RegionLocX, (int)regionInfos.RegionLocY, scopeID) != null)
+ {
+ m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register in coordinates {1}, {2} which are already in use in scope {3}.",
+ regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID);
+ return false;
+ }
+
+ // Everything is ok, let's register
+ RegionData rdata = RegionInfo2RegionData(regionInfos);
+ rdata.ScopeID = scopeID;
+ m_Database.Store(rdata);
+ return true;
+ }
+
+ public bool DeregisterRegion(UUID regionID)
+ {
+ return m_Database.Delete(regionID);
+ }
+
+ public List GetNeighbours(UUID scopeID, int x, int y)
+ {
+ List rdatas = m_Database.Get(x - 1, y - 1, x + 1, y + 1, scopeID);
+ List rinfos = new List();
+ foreach (RegionData rdata in rdatas)
+ rinfos.Add(RegionData2RegionInfo(rdata));
+
+ return rinfos;
+ }
+
+ public SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID)
+ {
+ RegionData rdata = m_Database.Get(regionID, scopeID);
+ if (rdata != null)
+ return RegionData2RegionInfo(rdata);
+
+ return null;
+ }
+
+ public SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
+ {
+ RegionData rdata = m_Database.Get(x, y, scopeID);
+ if (rdata != null)
+ return RegionData2RegionInfo(rdata);
+
+ return null;
+ }
+
+ public SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName)
+ {
+ List rdatas = m_Database.Get(regionName + "%", scopeID);
+ if ((rdatas != null) && (rdatas.Count > 0))
+ return RegionData2RegionInfo(rdatas[0]); // get the first
+
+ return null;
+ }
+
+ public List GetRegionsByName(UUID scopeID, string name, int maxNumber)
+ {
+ List rdatas = m_Database.Get("%" + name + "%", scopeID);
+
+ int count = 0;
+ List rinfos = new List();
+
+ if (rdatas != null)
+ {
+ foreach (RegionData rdata in rdatas)
+ {
+ if (count++ < maxNumber)
+ rinfos.Add(RegionData2RegionInfo(rdata));
+ }
+ }
+
+ return rinfos;
+ }
+
+ public List GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
+ {
+ List rdatas = m_Database.Get(xmin, ymin, xmax, ymax, scopeID);
+ List rinfos = new List();
+ foreach (RegionData rdata in rdatas)
+ rinfos.Add(RegionData2RegionInfo(rdata));
+
+ return rinfos;
+ }
+
+ #endregion
+
+ #region Data structure conversions
+
+ protected RegionData RegionInfo2RegionData(SimpleRegionInfo rinfo)
+ {
+ RegionData rdata = new RegionData();
+ rdata.posX = (int)rinfo.RegionLocX;
+ rdata.posY = (int)rinfo.RegionLocY;
+ rdata.RegionID = rinfo.RegionID;
+ //rdata.RegionName = rinfo.RegionName;
+ rdata.Data["external_ip_address"] = rinfo.ExternalEndPoint.Address.ToString();
+ rdata.Data["external_port"] = rinfo.ExternalEndPoint.Port.ToString();
+ rdata.Data["external_host_name"] = rinfo.ExternalHostName;
+ rdata.Data["http_port"] = rinfo.HttpPort.ToString();
+ rdata.Data["internal_ip_address"] = rinfo.InternalEndPoint.Address.ToString();
+ rdata.Data["internal_port"] = rinfo.InternalEndPoint.Port.ToString();
+ rdata.Data["alternate_ports"] = rinfo.m_allow_alternate_ports.ToString();
+ rdata.Data["server_uri"] = rinfo.ServerURI;
+
+ return rdata;
+ }
+
+ protected SimpleRegionInfo RegionData2RegionInfo(RegionData rdata)
+ {
+ SimpleRegionInfo rinfo = new SimpleRegionInfo();
+ rinfo.RegionLocX = (uint)rdata.posX;
+ rinfo.RegionLocY = (uint)rdata.posY;
+ rinfo.RegionID = rdata.RegionID;
+ //rinfo.RegionName = rdata.RegionName;
+
+ // Now for the variable data
+ if ((rdata.Data["external_ip_address"] != null) && (rdata.Data["external_port"] != null))
+ {
+ int port = 0;
+ Int32.TryParse((string)rdata.Data["external_port"], out port);
+ IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)rdata.Data["external_ip_address"]), port);
+ rinfo.ExternalEndPoint = ep;
+ }
+ else
+ rinfo.ExternalEndPoint = new IPEndPoint(new IPAddress(0), 0);
+
+ if (rdata.Data["external_host_name"] != null)
+ rinfo.ExternalHostName = (string)rdata.Data["external_host_name"] ;
+
+ if (rdata.Data["http_port"] != null)
+ {
+ UInt32 port = 0;
+ UInt32.TryParse((string)rdata.Data["http_port"], out port);
+ rinfo.HttpPort = port;
+ }
+
+ if ((rdata.Data["internal_ip_address"] != null) && (rdata.Data["internal_port"] != null))
+ {
+ int port = 0;
+ Int32.TryParse((string)rdata.Data["internal_port"], out port);
+ IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)rdata.Data["internal_ip_address"]), port);
+ rinfo.InternalEndPoint = ep;
+ }
+ else
+ rinfo.InternalEndPoint = new IPEndPoint(new IPAddress(0), 0);
+
+ if (rdata.Data["alternate_ports"] != null)
+ {
+ bool alts = false;
+ Boolean.TryParse((string)rdata.Data["alternate_ports"], out alts);
+ rinfo.m_allow_alternate_ports = alts;
+ }
+
+ if (rdata.Data["server_uri"] != null)
+ rinfo.ServerURI = (string)rdata.Data["server_uri"];
+
+ return rinfo;
+ }
+
+ #endregion
+
+ void HandleShowDigest(string module, string[] args)
+ {
+ //if (args.Length < 3)
+ //{
+ // MainConsole.Instance.Output("Syntax: show digest ");
+ // return;
+ //}
+
+ //AssetBase asset = Get(args[2]);
+
+ //if (asset == null || asset.Data.Length == 0)
+ //{
+ // MainConsole.Instance.Output("Asset not found");
+ // return;
+ //}
+
+ //int i;
+
+ //MainConsole.Instance.Output(String.Format("Name: {0}", asset.Name));
+ //MainConsole.Instance.Output(String.Format("Description: {0}", asset.Description));
+ //MainConsole.Instance.Output(String.Format("Type: {0}", asset.Type));
+ //MainConsole.Instance.Output(String.Format("Content-type: {0}", asset.Metadata.ContentType));
+
+ //for (i = 0 ; i < 5 ; i++)
+ //{
+ // int off = i * 16;
+ // if (asset.Data.Length <= off)
+ // break;
+ // int len = 16;
+ // if (asset.Data.Length < off + len)
+ // len = asset.Data.Length - off;
+
+ // byte[] line = new byte[len];
+ // Array.Copy(asset.Data, off, line, 0, len);
+
+ // string text = BitConverter.ToString(line);
+ // MainConsole.Instance.Output(String.Format("{0:x4}: {1}", off, text));
+ //}
+ }
+
+ void HandleDeleteAsset(string module, string[] args)
+ {
+ //if (args.Length < 3)
+ //{
+ // MainConsole.Instance.Output("Syntax: delete asset ");
+ // return;
+ //}
+
+ //AssetBase asset = Get(args[2]);
+
+ //if (asset == null || asset.Data.Length == 0)
+ // MainConsole.Instance.Output("Asset not found");
+ // return;
+ //}
+
+ //Delete(args[2]);
+
+ ////MainConsole.Instance.Output("Asset deleted");
+ //// TODO: Implement this
+
+ //MainConsole.Instance.Output("Asset deletion not supported by database");
+ }
+ }
+}
diff --git a/OpenSim/Services/GridService/GridServiceBase.cs b/OpenSim/Services/GridService/GridServiceBase.cs
new file mode 100644
index 0000000..7b69290
--- /dev/null
+++ b/OpenSim/Services/GridService/GridServiceBase.cs
@@ -0,0 +1,84 @@
+/*
+ * 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 OpenSimulator 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.Reflection;
+using Nini.Config;
+using OpenSim.Framework;
+using OpenSim.Data;
+using OpenSim.Services.Interfaces;
+using OpenSim.Services.Base;
+
+namespace OpenSim.Services.GridService
+{
+ public class GridServiceBase : ServiceBase
+ {
+ protected IRegionData m_Database = null;
+
+ public GridServiceBase(IConfigSource config)
+ : base(config)
+ {
+ string dllName = String.Empty;
+ string connString = String.Empty;
+ string realm = "regions";
+
+ //
+ // Try reading the [AssetService] section first, if it exists
+ //
+ IConfig gridConfig = config.Configs["GridService"];
+ if (gridConfig != null)
+ {
+ dllName = gridConfig.GetString("StorageProvider", dllName);
+ connString = gridConfig.GetString("ConnectionString", connString);
+ realm = gridConfig.GetString("Realm", realm);
+ }
+
+ //
+ // Try reading the [DatabaseService] section, if it exists
+ //
+ IConfig dbConfig = config.Configs["DatabaseService"];
+ if (dbConfig != null)
+ {
+ if (dllName == String.Empty)
+ dllName = dbConfig.GetString("StorageProvider", String.Empty);
+ if (connString == String.Empty)
+ connString = dbConfig.GetString("ConnectionString", String.Empty);
+ }
+
+ //
+ // We tried, but this doesn't exist. We can't proceed.
+ //
+ if (dllName.Equals(String.Empty))
+ throw new Exception("No StorageProvider configured");
+
+ m_Database = LoadPlugin(dllName, new Object[] { connString, realm });
+ if (m_Database == null)
+ throw new Exception("Could not find a storage interface in the given module");
+
+ }
+ }
+}
diff --git a/OpenSim/Services/Interfaces/IGridService.cs b/OpenSim/Services/Interfaces/IGridService.cs
index ac4539a..83ab9c1 100644
--- a/OpenSim/Services/Interfaces/IGridService.cs
+++ b/OpenSim/Services/Interfaces/IGridService.cs
@@ -39,7 +39,7 @@ namespace OpenSim.Services.Interfaces
///
///
/// Thrown if region registration failed
- bool RegisterRegion(UUID scopeID, RegionInfo regionInfos);
+ bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfos);
///
/// Deregister a region with the grid service.
@@ -50,15 +50,22 @@ namespace OpenSim.Services.Interfaces
bool DeregisterRegion(UUID regionID);
///
- /// Get information about the regions neighbouring the given co-ordinates.
+ /// Get information about the regions neighbouring the given co-ordinates (in meters).
///
///
///
///
- List GetNeighbours(UUID scopeID, uint x, uint y);
+ List GetNeighbours(UUID scopeID, int x, int y);
SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID);
+ ///
+ /// Get the region at the given position (in meters)
+ ///
+ ///
+ ///
+ ///
+ ///
SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y);
SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName);
@@ -78,9 +85,7 @@ namespace OpenSim.Services.Interfaces
///
List GetRegionsByName(UUID scopeID, string name, int maxNumber);
-
- // Not sure about these two (diva)
-
+ List GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax);
}
}
diff --git a/prebuild.xml b/prebuild.xml
index 79c767c..3e5e1e0 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -1383,6 +1383,37 @@
+
+
+
+ ../../../bin/
+
+
+
+
+ ../../../bin/
+
+
+
+ ../../../bin/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--
cgit v1.1