diff options
author | UbitUmarov | 2016-11-28 04:29:57 +0000 |
---|---|---|
committer | UbitUmarov | 2016-11-28 04:29:57 +0000 |
commit | 1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85 (patch) | |
tree | 46738fbb9799ffeb47a7b6f3eb574c4c5c463302 /OpenSim/Services | |
parent | HG on links request build the URI in http format with a / at end, this should... (diff) | |
download | opensim-SC-1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85.zip opensim-SC-1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85.tar.gz opensim-SC-1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85.tar.bz2 opensim-SC-1aa4dbdb3fd5c3c8382dad53d6b7c105fb7cec85.tar.xz |
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
Diffstat (limited to 'OpenSim/Services')
-rw-r--r-- | OpenSim/Services/GridService/GridService.cs | 87 | ||||
-rw-r--r-- | OpenSim/Services/GridService/HypergridLinker.cs | 148 |
2 files changed, 177 insertions, 58 deletions
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 | |||
579 | int count = 0; | 579 | int count = 0; |
580 | List<GridRegion> rinfos = new List<GridRegion>(); | 580 | List<GridRegion> rinfos = new List<GridRegion>(); |
581 | 581 | ||
582 | if (rdatas != null) | 582 | if (count < maxNumber && m_AllowHypergridMapSearch && name.Contains(".")) |
583 | { | ||
584 | string regionURI = ""; | ||
585 | string regionName = ""; | ||
586 | if(!m_HypergridLinker.buildHGRegionURI(name, out regionURI, out regionName)) | ||
587 | return null; | ||
588 | |||
589 | string mapname = regionURI + regionName; | ||
590 | bool haveMatch = false; | ||
591 | |||
592 | if (rdatas != null && (rdatas.Count > 0)) | ||
593 | { | ||
594 | // m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); | ||
595 | foreach (RegionData rdata in rdatas) | ||
596 | { | ||
597 | if (count++ < maxNumber) | ||
598 | rinfos.Add(RegionData2RegionInfo(rdata)); | ||
599 | if(rdata.RegionName == mapname) | ||
600 | { | ||
601 | haveMatch = true; | ||
602 | if(count == maxNumber) | ||
603 | { | ||
604 | rinfos.RemoveAt(count - 1); | ||
605 | rinfos.Add(RegionData2RegionInfo(rdata)); | ||
606 | } | ||
607 | } | ||
608 | } | ||
609 | if(haveMatch) | ||
610 | return rinfos; | ||
611 | } | ||
612 | |||
613 | rdatas = m_Database.Get(Util.EscapeForLike(mapname)+ "%", scopeID); | ||
614 | if (rdatas != null && (rdatas.Count > 0)) | ||
615 | { | ||
616 | // m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); | ||
617 | foreach (RegionData rdata in rdatas) | ||
618 | { | ||
619 | if (count++ < maxNumber) | ||
620 | rinfos.Add(RegionData2RegionInfo(rdata)); | ||
621 | if(rdata.RegionName == mapname) | ||
622 | { | ||
623 | haveMatch = true; | ||
624 | if(count == maxNumber) | ||
625 | { | ||
626 | rinfos.RemoveAt(count - 1); | ||
627 | rinfos.Add(RegionData2RegionInfo(rdata)); | ||
628 | break; | ||
629 | } | ||
630 | } | ||
631 | } | ||
632 | if(haveMatch) | ||
633 | return rinfos; | ||
634 | } | ||
635 | |||
636 | string HGname = regionURI +" "+ regionName; | ||
637 | GridRegion r = m_HypergridLinker.LinkRegion(scopeID, HGname); | ||
638 | if (r != null) | ||
639 | { | ||
640 | if( count == maxNumber) | ||
641 | rinfos.RemoveAt(count - 1); | ||
642 | rinfos.Add(r); | ||
643 | } | ||
644 | } | ||
645 | else if (rdatas != null && (rdatas.Count > 0)) | ||
583 | { | 646 | { |
584 | // m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); | 647 | // m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count); |
585 | foreach (RegionData rdata in rdatas) | 648 | foreach (RegionData rdata in rdatas) |
@@ -589,13 +652,6 @@ namespace OpenSim.Services.GridService | |||
589 | } | 652 | } |
590 | } | 653 | } |
591 | 654 | ||
592 | if (m_AllowHypergridMapSearch && (rdatas == null || (rdatas != null && rdatas.Count == 0))) | ||
593 | { | ||
594 | GridRegion r = GetHypergridRegionByName(scopeID, name); | ||
595 | if (r != null) | ||
596 | rinfos.Add(r); | ||
597 | } | ||
598 | |||
599 | return rinfos; | 655 | return rinfos; |
600 | } | 656 | } |
601 | 657 | ||
@@ -608,7 +664,20 @@ namespace OpenSim.Services.GridService | |||
608 | protected GridRegion GetHypergridRegionByName(UUID scopeID, string name) | 664 | protected GridRegion GetHypergridRegionByName(UUID scopeID, string name) |
609 | { | 665 | { |
610 | if (name.Contains(".")) | 666 | if (name.Contains(".")) |
611 | return m_HypergridLinker.LinkRegion(scopeID, name); | 667 | { |
668 | string regionURI = ""; | ||
669 | string regionName = ""; | ||
670 | if(!m_HypergridLinker.buildHGRegionURI(name, out regionURI, out regionName)) | ||
671 | return null; | ||
672 | |||
673 | string mapname = regionURI + regionName; | ||
674 | List<RegionData> rdatas = m_Database.Get(Util.EscapeForLike(mapname), scopeID); | ||
675 | if ((rdatas != null) && (rdatas.Count > 0)) | ||
676 | return RegionData2RegionInfo(rdatas[0]); // get the first | ||
677 | |||
678 | string HGname = regionURI +" "+ regionName; | ||
679 | return m_HypergridLinker.LinkRegion(scopeID, HGname); | ||
680 | } | ||
612 | else | 681 | else |
613 | return null; | 682 | return null; |
614 | } | 683 | } |
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 | |||
191 | return TryLinkRegionToCoords(scopeID, mapName, xloc, yloc, UUID.Zero, out reason); | 191 | return TryLinkRegionToCoords(scopeID, mapName, xloc, yloc, UUID.Zero, out reason); |
192 | } | 192 | } |
193 | 193 | ||
194 | public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason) | 194 | public bool buildHGRegionURI(string inputName, out string serverURI, out string regionName) |
195 | { | 195 | { |
196 | reason = string.Empty; | 196 | serverURI = string.Empty; |
197 | GridRegion regInfo = null; | 197 | regionName = string.Empty; |
198 | 198 | ||
199 | mapName = mapName.Trim(); | 199 | inputName = inputName.Trim(); |
200 | 200 | ||
201 | if (!mapName.StartsWith("http") && !mapName.StartsWith("https")) | 201 | if (!inputName.StartsWith("http") && !inputName.StartsWith("https")) |
202 | { | 202 | { |
203 | // Formats: grid.example.com:8002:region name | 203 | // Formats: grid.example.com:8002:region name |
204 | // grid.example.com:region name | 204 | // grid.example.com:region name |
@@ -207,38 +207,59 @@ namespace OpenSim.Services.GridService | |||
207 | 207 | ||
208 | string host; | 208 | string host; |
209 | uint port = 80; | 209 | uint port = 80; |
210 | string regionName = ""; | ||
211 | |||
212 | string[] parts = mapName.Split(new char[] { ':' }); | ||
213 | |||
214 | if (parts.Length == 0) | ||
215 | { | ||
216 | reason = "Wrong format for link-region"; | ||
217 | return null; | ||
218 | } | ||
219 | 210 | ||
220 | host = parts[0]; | 211 | string[] parts = inputName.Split(new char[] { ':' }); |
221 | 212 | int indx; | |
222 | if (parts.Length >= 2) | 213 | if(parts.Length == 0) |
214 | return false; | ||
215 | if (parts.Length == 1) | ||
223 | { | 216 | { |
224 | // If it's a number then assume it's a port. Otherwise, it's a region name. | 217 | indx = inputName.IndexOf('/'); |
225 | if (!UInt32.TryParse(parts[1], out port)) | 218 | if (indx < 0) |
226 | regionName = parts[1]; | 219 | serverURI = "http://"+ inputName + "/"; |
220 | else | ||
221 | { | ||
222 | serverURI = "http://"+ inputName.Substring(0,indx + 1); | ||
223 | if(indx + 2 < inputName.Length) | ||
224 | regionName = inputName.Substring(indx + 1); | ||
225 | } | ||
227 | } | 226 | } |
228 | 227 | else | |
229 | // always take the last one | ||
230 | if (parts.Length >= 3) | ||
231 | { | 228 | { |
232 | regionName = parts[2]; | 229 | host = parts[0]; |
233 | } | 230 | |
231 | if (parts.Length >= 2) | ||
232 | { | ||
233 | indx = parts[1].IndexOf('/'); | ||
234 | if(indx < 0) | ||
235 | { | ||
236 | // If it's a number then assume it's a port. Otherwise, it's a region name. | ||
237 | if (!UInt32.TryParse(parts[1], out port)) | ||
238 | { | ||
239 | port = 80; | ||
240 | regionName = parts[1]; | ||
241 | } | ||
242 | } | ||
243 | else | ||
244 | { | ||
245 | string portstr = parts[1].Substring(0, indx); | ||
246 | if(indx + 2 < parts[1].Length) | ||
247 | regionName = parts[1].Substring(indx + 1); | ||
248 | if (!UInt32.TryParse(portstr, out port)) | ||
249 | port = 80; | ||
250 | } | ||
251 | } | ||
252 | // always take the last one | ||
253 | if (parts.Length >= 3) | ||
254 | { | ||
255 | regionName = parts[2]; | ||
256 | } | ||
234 | 257 | ||
235 | string serverURI = "http://"+ host +":"+ port.ToString() + "/"; | 258 | if(port == 80) |
236 | // bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, ownerID, out regInfo, out reason); | 259 | serverURI = "http://"+ host + "/"; |
237 | if(TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) | 260 | else |
238 | { | 261 | serverURI = "http://"+ host +":"+ port.ToString() + "/"; |
239 | regInfo.RegionName = mapName; | 262 | } |
240 | return regInfo; | ||
241 | } | ||
242 | } | 263 | } |
243 | else | 264 | else |
244 | { | 265 | { |
@@ -246,34 +267,63 @@ namespace OpenSim.Services.GridService | |||
246 | // http://grid.example.com "region name" | 267 | // http://grid.example.com "region name" |
247 | // http://grid.example.com | 268 | // http://grid.example.com |
248 | 269 | ||
249 | string serverURI; | 270 | string[] parts = inputName.Split(new char[] { ' ' }); |
250 | string regionName = ""; | ||
251 | |||
252 | string[] parts = mapName.Split(new char[] { ' ' }); | ||
253 | 271 | ||
254 | if (parts.Length == 0) | 272 | if (parts.Length == 0) |
255 | { | 273 | return false; |
256 | reason = "Wrong format for link-region"; | ||
257 | return null; | ||
258 | } | ||
259 | 274 | ||
260 | serverURI = parts[0]; | 275 | serverURI = parts[0]; |
261 | if (!serverURI.EndsWith("/")) | ||
262 | serverURI = serverURI + "/"; | ||
263 | 276 | ||
264 | if (parts.Length >= 2) | 277 | int indx = serverURI.LastIndexOf('/'); |
278 | if(indx > 10) | ||
265 | { | 279 | { |
266 | regionName = mapName.Substring(serverURI.Length); | 280 | if(indx + 2 < inputName.Length) |
267 | regionName = regionName.Trim(new char[] { '"', ' ' }); | 281 | regionName = inputName.Substring(indx + 1); |
282 | serverURI = inputName.Substring(0, indx + 1); | ||
268 | } | 283 | } |
269 | 284 | else if (parts.Length >= 2) | |
270 | if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) | ||
271 | { | 285 | { |
272 | regInfo.RegionName = mapName; | 286 | regionName = inputName.Substring(serverURI.Length); |
273 | return regInfo; | ||
274 | } | 287 | } |
275 | } | 288 | } |
276 | 289 | ||
290 | // use better code for sanity check | ||
291 | Uri uri; | ||
292 | try | ||
293 | { | ||
294 | uri = new Uri(serverURI); | ||
295 | } | ||
296 | catch | ||
297 | { | ||
298 | return false; | ||
299 | } | ||
300 | |||
301 | if(!string.IsNullOrEmpty(regionName)) | ||
302 | regionName = regionName.Trim(new char[] { '"', ' ' }); | ||
303 | serverURI = uri.AbsoluteUri; | ||
304 | return true; | ||
305 | } | ||
306 | |||
307 | public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason) | ||
308 | { | ||
309 | reason = string.Empty; | ||
310 | GridRegion regInfo = null; | ||
311 | |||
312 | string serverURI = string.Empty; | ||
313 | string regionName = string.Empty; | ||
314 | |||
315 | if(!buildHGRegionURI(mapName, out serverURI, out regionName)) | ||
316 | { | ||
317 | reason = "Wrong URI format for link-region"; | ||
318 | return null; | ||
319 | } | ||
320 | |||
321 | if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason)) | ||
322 | { | ||
323 | regInfo.RegionName = serverURI + regionName; | ||
324 | return regInfo; | ||
325 | } | ||
326 | |||
277 | return null; | 327 | return null; |
278 | } | 328 | } |
279 | 329 | ||