From 1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 28 Nov 2016 04:29:57 +0000 Subject: increase HG mapsearch spargetti; add more flexibility on input uri formats. To find regions in memory for a grid the http format needs to be used, because aditional compares made by viewers --- OpenSim/Services/GridService/GridService.cs | 87 ++++++++++++-- OpenSim/Services/GridService/HypergridLinker.cs | 148 ++++++++++++++++-------- 2 files changed, 177 insertions(+), 58 deletions(-) (limited to 'OpenSim/Services') diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index a11cae1..66c918f 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -579,7 +579,70 @@ namespace OpenSim.Services.GridService int count = 0; List rinfos = new List(); - if (rdatas != null) + if (count < maxNumber && m_AllowHypergridMapSearch && name.Contains(".")) + { + string regionURI = ""; + string regionName = ""; + if(!m_HypergridLinker.buildHGRegionURI(name, out regionURI, out regionName)) + return null; + + string mapname = regionURI + regionName; + bool haveMatch = false; + + if (rdatas != null && (rdatas.Count > 0)) + { +// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); + foreach (RegionData rdata in rdatas) + { + if (count++ < maxNumber) + rinfos.Add(RegionData2RegionInfo(rdata)); + if(rdata.RegionName == mapname) + { + haveMatch = true; + if(count == maxNumber) + { + rinfos.RemoveAt(count - 1); + rinfos.Add(RegionData2RegionInfo(rdata)); + } + } + } + if(haveMatch) + return rinfos; + } + + rdatas = m_Database.Get(Util.EscapeForLike(mapname)+ "%", scopeID); + if (rdatas != null && (rdatas.Count > 0)) + { +// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); + foreach (RegionData rdata in rdatas) + { + if (count++ < maxNumber) + rinfos.Add(RegionData2RegionInfo(rdata)); + if(rdata.RegionName == mapname) + { + haveMatch = true; + if(count == maxNumber) + { + rinfos.RemoveAt(count - 1); + rinfos.Add(RegionData2RegionInfo(rdata)); + break; + } + } + } + if(haveMatch) + return rinfos; + } + + string HGname = regionURI +" "+ regionName; + GridRegion r = m_HypergridLinker.LinkRegion(scopeID, HGname); + if (r != null) + { + if( count == maxNumber) + rinfos.RemoveAt(count - 1); + rinfos.Add(r); + } + } + else if (rdatas != null && (rdatas.Count > 0)) { // m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); foreach (RegionData rdata in rdatas) @@ -589,13 +652,6 @@ namespace OpenSim.Services.GridService } } - if (m_AllowHypergridMapSearch && (rdatas == null || (rdatas != null && rdatas.Count == 0))) - { - GridRegion r = GetHypergridRegionByName(scopeID, name); - if (r != null) - rinfos.Add(r); - } - return rinfos; } @@ -608,7 +664,20 @@ namespace OpenSim.Services.GridService protected GridRegion GetHypergridRegionByName(UUID scopeID, string name) { if (name.Contains(".")) - return m_HypergridLinker.LinkRegion(scopeID, name); + { + string regionURI = ""; + string regionName = ""; + if(!m_HypergridLinker.buildHGRegionURI(name, out regionURI, out regionName)) + return null; + + string mapname = regionURI + regionName; + List rdatas = m_Database.Get(Util.EscapeForLike(mapname), scopeID); + if ((rdatas != null) && (rdatas.Count > 0)) + return RegionData2RegionInfo(rdatas[0]); // get the first + + string HGname = regionURI +" "+ regionName; + return m_HypergridLinker.LinkRegion(scopeID, HGname); + } else return null; } diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs index 2869349..e00025b 100644 --- a/OpenSim/Services/GridService/HypergridLinker.cs +++ b/OpenSim/Services/GridService/HypergridLinker.cs @@ -191,14 +191,14 @@ namespace OpenSim.Services.GridService return TryLinkRegionToCoords(scopeID, mapName, xloc, yloc, UUID.Zero, out reason); } - public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason) + public bool buildHGRegionURI(string inputName, out string serverURI, out string regionName) { - reason = string.Empty; - GridRegion regInfo = null; + serverURI = string.Empty; + regionName = string.Empty; - mapName = mapName.Trim(); + inputName = inputName.Trim(); - if (!mapName.StartsWith("http") && !mapName.StartsWith("https")) + if (!inputName.StartsWith("http") && !inputName.StartsWith("https")) { // Formats: grid.example.com:8002:region name // grid.example.com:region name @@ -207,38 +207,59 @@ namespace OpenSim.Services.GridService string host; uint port = 80; - string regionName = ""; - - string[] parts = mapName.Split(new char[] { ':' }); - - if (parts.Length == 0) - { - reason = "Wrong format for link-region"; - return null; - } - host = parts[0]; - - if (parts.Length >= 2) + string[] parts = inputName.Split(new char[] { ':' }); + int indx; + if(parts.Length == 0) + return false; + if (parts.Length == 1) { - // If it's a number then assume it's a port. Otherwise, it's a region name. - if (!UInt32.TryParse(parts[1], out port)) - regionName = parts[1]; + indx = inputName.IndexOf('/'); + if (indx < 0) + serverURI = "http://"+ inputName + "/"; + else + { + serverURI = "http://"+ inputName.Substring(0,indx + 1); + if(indx + 2 < inputName.Length) + regionName = inputName.Substring(indx + 1); + } } - - // always take the last one - if (parts.Length >= 3) + else { - regionName = parts[2]; - } + host = parts[0]; + + if (parts.Length >= 2) + { + indx = parts[1].IndexOf('/'); + if(indx < 0) + { + // If it's a number then assume it's a port. Otherwise, it's a region name. + if (!UInt32.TryParse(parts[1], out port)) + { + port = 80; + regionName = parts[1]; + } + } + else + { + string portstr = parts[1].Substring(0, indx); + if(indx + 2 < parts[1].Length) + regionName = parts[1].Substring(indx + 1); + if (!UInt32.TryParse(portstr, out port)) + port = 80; + } + } + // always take the last one + if (parts.Length >= 3) + { + regionName = parts[2]; + } - string serverURI = "http://"+ host +":"+ port.ToString() + "/"; -// bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, ownerID, out regInfo, out reason); - if(TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) - { - regInfo.RegionName = mapName; - return regInfo; - } + if(port == 80) + serverURI = "http://"+ host + "/"; + else + serverURI = "http://"+ host +":"+ port.ToString() + "/"; + } } else { @@ -246,34 +267,63 @@ namespace OpenSim.Services.GridService // http://grid.example.com "region name" // http://grid.example.com - string serverURI; - string regionName = ""; - - string[] parts = mapName.Split(new char[] { ' ' }); + string[] parts = inputName.Split(new char[] { ' ' }); if (parts.Length == 0) - { - reason = "Wrong format for link-region"; - return null; - } + return false; serverURI = parts[0]; - if (!serverURI.EndsWith("/")) - serverURI = serverURI + "/"; - if (parts.Length >= 2) + int indx = serverURI.LastIndexOf('/'); + if(indx > 10) { - regionName = mapName.Substring(serverURI.Length); - regionName = regionName.Trim(new char[] { '"', ' ' }); + if(indx + 2 < inputName.Length) + regionName = inputName.Substring(indx + 1); + serverURI = inputName.Substring(0, indx + 1); } - - if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) + else if (parts.Length >= 2) { - regInfo.RegionName = mapName; - return regInfo; + regionName = inputName.Substring(serverURI.Length); } } + // use better code for sanity check + Uri uri; + try + { + uri = new Uri(serverURI); + } + catch + { + return false; + } + + if(!string.IsNullOrEmpty(regionName)) + regionName = regionName.Trim(new char[] { '"', ' ' }); + serverURI = uri.AbsoluteUri; + return true; + } + + public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason) + { + reason = string.Empty; + GridRegion regInfo = null; + + string serverURI = string.Empty; + string regionName = string.Empty; + + if(!buildHGRegionURI(mapName, out serverURI, out regionName)) + { + reason = "Wrong URI format for link-region"; + return null; + } + + if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) + { + regInfo.RegionName = serverURI + regionName; + return regInfo; + } + return null; } -- cgit v1.1