diff options
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.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Data/Null/NullRegionData.cs | 48 |
1 files changed, 38 insertions, 10 deletions
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 | |||
51 | //Console.WriteLine("[XXX] NullRegionData constructor"); | 51 | //Console.WriteLine("[XXX] NullRegionData constructor"); |
52 | } | 52 | } |
53 | 53 | ||
54 | private delegate bool Matcher(string value); | ||
55 | |||
54 | public List<RegionData> Get(string regionName, UUID scopeID) | 56 | public List<RegionData> Get(string regionName, UUID scopeID) |
55 | { | 57 | { |
56 | if (Instance != this) | 58 | if (Instance != this) |
57 | return Instance.Get(regionName, scopeID); | 59 | return Instance.Get(regionName, scopeID); |
58 | 60 | ||
59 | List<RegionData> ret = new List<RegionData>(); | 61 | string cleanName = regionName.ToLower(); |
60 | 62 | ||
61 | foreach (RegionData r in m_regionData.Values) | 63 | // Handle SQL wildcards |
64 | const string wildcard = "%"; | ||
65 | bool wildcardPrefix = false; | ||
66 | bool wildcardSuffix = false; | ||
67 | if (cleanName.Equals(wildcard)) | ||
62 | { | 68 | { |
63 | if (regionName.Contains("%")) | 69 | wildcardPrefix = wildcardSuffix = true; |
70 | cleanName = string.Empty; | ||
71 | } | ||
72 | else | ||
73 | { | ||
74 | if (cleanName.StartsWith(wildcard)) | ||
64 | { | 75 | { |
65 | string cleanname = regionName.Replace("%", ""); | 76 | wildcardPrefix = true; |
66 | m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanname.ToLower(), r.RegionName.ToLower()); | 77 | cleanName = cleanName.Substring(1); |
67 | if (r.RegionName.ToLower().Contains(cleanname.ToLower())) | ||
68 | ret.Add(r); | ||
69 | } | 78 | } |
70 | else | 79 | if (regionName.EndsWith(wildcard)) |
71 | { | 80 | { |
72 | if (r.RegionName.ToLower() == regionName.ToLower()) | 81 | wildcardSuffix = true; |
73 | ret.Add(r); | 82 | cleanName = cleanName.Remove(cleanName.Length - 1); |
74 | } | 83 | } |
75 | } | 84 | } |
85 | Matcher queryMatch; | ||
86 | if (wildcardPrefix && wildcardSuffix) | ||
87 | queryMatch = delegate(string s) { return s.Contains(cleanName); }; | ||
88 | else if (wildcardSuffix) | ||
89 | queryMatch = delegate(string s) { return s.StartsWith(cleanName); }; | ||
90 | else if (wildcardPrefix) | ||
91 | queryMatch = delegate(string s) { return s.EndsWith(cleanName); }; | ||
92 | else | ||
93 | queryMatch = delegate(string s) { return s.Equals(cleanName); }; | ||
94 | |||
95 | // Find region data | ||
96 | List<RegionData> ret = new List<RegionData>(); | ||
97 | |||
98 | foreach (RegionData r in m_regionData.Values) | ||
99 | { | ||
100 | m_log.DebugFormat("[NULL REGION DATA]: comparing {0} to {1}", cleanName, r.RegionName.ToLower()); | ||
101 | if (queryMatch(r.RegionName.ToLower())) | ||
102 | ret.Add(r); | ||
103 | } | ||
76 | 104 | ||
77 | if (ret.Count > 0) | 105 | if (ret.Count > 0) |
78 | return ret; | 106 | return ret; |