From af22b7cb1af041ab685128f507265d9c7e7fac9c Mon Sep 17 00:00:00 2001 From: Marck Date: Tue, 22 Feb 2011 13:00:45 +0100 Subject: GetRegion(s)ByName with SQLite behaves like it does with other databases. The in-memory storage of region data that is used by default with SQLite now handles wildcards in region names in the same way as SQL queries do with other databases. --- OpenSim/Data/Null/NullRegionData.cs | 48 +++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 10 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Data/Null/NullRegionData.cs b/OpenSim/Data/Null/NullRegionData.cs index 2065355..53e5207 100644 --- a/OpenSim/Data/Null/NullRegionData.cs +++ b/OpenSim/Data/Null/NullRegionData.cs @@ -51,28 +51,56 @@ namespace OpenSim.Data.Null //Console.WriteLine("[XXX] NullRegionData constructor"); } + private delegate bool Matcher(string value); + public List Get(string regionName, UUID scopeID) { if (Instance != this) return Instance.Get(regionName, scopeID); - List ret = new List(); + string cleanName = regionName.ToLower(); - foreach (RegionData r in m_regionData.Values) + // Handle SQL wildcards + const string wildcard = "%"; + bool wildcardPrefix = false; + bool wildcardSuffix = false; + if (cleanName.Equals(wildcard)) { - if (regionName.Contains("%")) + wildcardPrefix = wildcardSuffix = true; + cleanName = string.Empty; + } + else + { + if (cleanName.StartsWith(wildcard)) { - string cleanname = regionName.Replace("%", ""); - m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanname.ToLower(), r.RegionName.ToLower()); - if (r.RegionName.ToLower().Contains(cleanname.ToLower())) - ret.Add(r); + wildcardPrefix = true; + cleanName = cleanName.Substring(1); } - else + if (regionName.EndsWith(wildcard)) { - if (r.RegionName.ToLower() == regionName.ToLower()) - ret.Add(r); + wildcardSuffix = true; + cleanName = cleanName.Remove(cleanName.Length - 1); } } + Matcher queryMatch; + if (wildcardPrefix && wildcardSuffix) + queryMatch = delegate(string s) { return s.Contains(cleanName); }; + else if (wildcardSuffix) + queryMatch = delegate(string s) { return s.StartsWith(cleanName); }; + else if (wildcardPrefix) + queryMatch = delegate(string s) { return s.EndsWith(cleanName); }; + else + queryMatch = delegate(string s) { return s.Equals(cleanName); }; + + // Find region data + List ret = new List(); + + foreach (RegionData r in m_regionData.Values) + { + m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanName, r.RegionName.ToLower()); + if (queryMatch(r.RegionName.ToLower())) + ret.Add(r); + } if (ret.Count > 0) return ret; -- cgit v1.1