diff options
author | Justin Clark-Casey (justincc) | 2013-02-09 01:11:41 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2013-02-09 01:11:41 +0000 |
commit | 6935bec0ab83f25f69ad08e9bbc4b8d98aac1b1b (patch) | |
tree | 647e2ce5747ad8992111e9e89aefa825bffbbef2 /OpenSim/Region/OptionalModules/Scripting/JsonStore | |
parent | Change TestDestroyStore() and TestJsonRemoveValue() to reflect the fact that ... (diff) | |
parent | BulletSim: add parameter to set global contact breaking threshold. Update DLL... (diff) | |
download | opensim-SC_OLD-6935bec0ab83f25f69ad08e9bbc4b8d98aac1b1b.zip opensim-SC_OLD-6935bec0ab83f25f69ad08e9bbc4b8d98aac1b1b.tar.gz opensim-SC_OLD-6935bec0ab83f25f69ad08e9bbc4b8d98aac1b1b.tar.bz2 opensim-SC_OLD-6935bec0ab83f25f69ad08e9bbc4b8d98aac1b1b.tar.xz |
Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
Diffstat (limited to 'OpenSim/Region/OptionalModules/Scripting/JsonStore')
-rw-r--r-- | OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs | 82 | ||||
-rw-r--r-- | OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs | 17 |
2 files changed, 95 insertions, 4 deletions
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs index c7f0001..5c89717 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs | |||
@@ -95,6 +95,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
95 | 95 | ||
96 | // ----------------------------------------------------------------- | 96 | // ----------------------------------------------------------------- |
97 | /// <summary> | 97 | /// <summary> |
98 | /// This is a simple estimator for the size of the stored data, it | ||
99 | /// is not precise, but should be close enough to implement reasonable | ||
100 | /// limits on the storage space used | ||
101 | /// </summary> | ||
102 | // ----------------------------------------------------------------- | ||
103 | public int StringSpace { get; set; } | ||
104 | |||
105 | // ----------------------------------------------------------------- | ||
106 | /// <summary> | ||
98 | /// | 107 | /// |
99 | /// </summary> | 108 | /// </summary> |
100 | // ----------------------------------------------------------------- | 109 | // ----------------------------------------------------------------- |
@@ -110,6 +119,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
110 | // ----------------------------------------------------------------- | 119 | // ----------------------------------------------------------------- |
111 | public JsonStore() | 120 | public JsonStore() |
112 | { | 121 | { |
122 | StringSpace = 0; | ||
113 | m_TakeStore = new List<TakeValueCallbackClass>(); | 123 | m_TakeStore = new List<TakeValueCallbackClass>(); |
114 | m_ReadStore = new List<TakeValueCallbackClass>(); | 124 | m_ReadStore = new List<TakeValueCallbackClass>(); |
115 | } | 125 | } |
@@ -135,7 +145,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
135 | if (result == null) | 145 | if (result == null) |
136 | return false; | 146 | return false; |
137 | 147 | ||
138 | if (useJson || result.Type == OSDType.String) | 148 | if (useJson || OSDBaseType(result.Type)) |
139 | return true; | 149 | return true; |
140 | 150 | ||
141 | return false; | 151 | return false; |
@@ -247,6 +257,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
247 | if (path.Count == 0) | 257 | if (path.Count == 0) |
248 | { | 258 | { |
249 | ValueStore = ovalue; | 259 | ValueStore = ovalue; |
260 | StringSpace = 0; | ||
250 | return true; | 261 | return true; |
251 | } | 262 | } |
252 | 263 | ||
@@ -278,8 +289,13 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
278 | { | 289 | { |
279 | string npkey = String.Format("[{0}]",amap.Count); | 290 | string npkey = String.Format("[{0}]",amap.Count); |
280 | 291 | ||
281 | amap.Add(ovalue); | 292 | if (ovalue != null) |
282 | InvokeNextCallback(pexpr + npkey); | 293 | { |
294 | StringSpace += ComputeSizeOf(ovalue); | ||
295 | |||
296 | amap.Add(ovalue); | ||
297 | InvokeNextCallback(pexpr + npkey); | ||
298 | } | ||
283 | return true; | 299 | return true; |
284 | } | 300 | } |
285 | 301 | ||
@@ -287,9 +303,14 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
287 | if (0 <= aval && aval < amap.Count) | 303 | if (0 <= aval && aval < amap.Count) |
288 | { | 304 | { |
289 | if (ovalue == null) | 305 | if (ovalue == null) |
306 | { | ||
307 | StringSpace -= ComputeSizeOf(amap[aval]); | ||
290 | amap.RemoveAt(aval); | 308 | amap.RemoveAt(aval); |
309 | } | ||
291 | else | 310 | else |
292 | { | 311 | { |
312 | StringSpace -= ComputeSizeOf(amap[aval]); | ||
313 | StringSpace += ComputeSizeOf(ovalue); | ||
293 | amap[aval] = ovalue; | 314 | amap[aval] = ovalue; |
294 | InvokeNextCallback(pexpr + pkey); | 315 | InvokeNextCallback(pexpr + pkey); |
295 | } | 316 | } |
@@ -313,6 +334,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
313 | OSDMap hmap = result as OSDMap; | 334 | OSDMap hmap = result as OSDMap; |
314 | if (ovalue != null) | 335 | if (ovalue != null) |
315 | { | 336 | { |
337 | StringSpace -= ComputeSizeOf(hmap[hkey]); | ||
338 | StringSpace += ComputeSizeOf(ovalue); | ||
339 | |||
316 | hmap[hkey] = ovalue; | 340 | hmap[hkey] = ovalue; |
317 | InvokeNextCallback(pexpr + pkey); | 341 | InvokeNextCallback(pexpr + pkey); |
318 | return true; | 342 | return true; |
@@ -321,6 +345,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
321 | // this is the remove case | 345 | // this is the remove case |
322 | if (hmap.ContainsKey(hkey)) | 346 | if (hmap.ContainsKey(hkey)) |
323 | { | 347 | { |
348 | StringSpace -= ComputeSizeOf(hmap[hkey]); | ||
324 | hmap.Remove(hkey); | 349 | hmap.Remove(hkey); |
325 | return true; | 350 | return true; |
326 | } | 351 | } |
@@ -506,7 +531,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
506 | return true; | 531 | return true; |
507 | } | 532 | } |
508 | 533 | ||
509 | if (result.Type == OSDType.String) | 534 | if (OSDBaseType(result.Type)) |
510 | { | 535 | { |
511 | value = result.AsString(); | 536 | value = result.AsString(); |
512 | return true; | 537 | return true; |
@@ -531,8 +556,54 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
531 | 556 | ||
532 | return pkey; | 557 | return pkey; |
533 | } | 558 | } |
559 | |||
560 | // ----------------------------------------------------------------- | ||
561 | /// <summary> | ||
562 | /// | ||
563 | /// </summary> | ||
564 | // ----------------------------------------------------------------- | ||
565 | protected static bool OSDBaseType(OSDType type) | ||
566 | { | ||
567 | // Should be the list of base types for which AsString() returns | ||
568 | // something useful | ||
569 | if (type == OSDType.Boolean) | ||
570 | return true; | ||
571 | if (type == OSDType.Integer) | ||
572 | return true; | ||
573 | if (type == OSDType.Real) | ||
574 | return true; | ||
575 | if (type == OSDType.String) | ||
576 | return true; | ||
577 | if (type == OSDType.UUID) | ||
578 | return true; | ||
579 | if (type == OSDType.Date) | ||
580 | return true; | ||
581 | if (type == OSDType.URI) | ||
582 | return true; | ||
583 | |||
584 | return false; | ||
585 | } | ||
586 | |||
587 | // ----------------------------------------------------------------- | ||
588 | /// <summary> | ||
589 | /// | ||
590 | /// </summary> | ||
591 | // ----------------------------------------------------------------- | ||
592 | protected static int ComputeSizeOf(OSD value) | ||
593 | { | ||
594 | string sval; | ||
595 | |||
596 | if (ConvertOutputValue(value,out sval,true)) | ||
597 | return sval.Length; | ||
598 | |||
599 | return 0; | ||
600 | } | ||
534 | } | 601 | } |
535 | 602 | ||
603 | // ----------------------------------------------------------------- | ||
604 | /// <summary> | ||
605 | /// </summary> | ||
606 | // ----------------------------------------------------------------- | ||
536 | public class JsonObjectStore : JsonStore | 607 | public class JsonObjectStore : JsonStore |
537 | { | 608 | { |
538 | private static readonly ILog m_log = | 609 | private static readonly ILog m_log = |
@@ -566,6 +637,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
566 | { | 637 | { |
567 | m_scene = scene; | 638 | m_scene = scene; |
568 | m_objectID = oid; | 639 | m_objectID = oid; |
640 | |||
641 | // the size limit is imposed on whatever is already in the store | ||
642 | StringSpace = ComputeSizeOf(ValueStore); | ||
569 | } | 643 | } |
570 | } | 644 | } |
571 | 645 | ||
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs index 3249aa3..f1ce856 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreModule.cs | |||
@@ -54,6 +54,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
54 | 54 | ||
55 | private IConfig m_config = null; | 55 | private IConfig m_config = null; |
56 | private bool m_enabled = false; | 56 | private bool m_enabled = false; |
57 | private bool m_enableObjectStore = false; | ||
58 | private int m_maxStringSpace = Int32.MaxValue; | ||
59 | |||
57 | private Scene m_scene = null; | 60 | private Scene m_scene = null; |
58 | 61 | ||
59 | private Dictionary<UUID,JsonStore> m_JsonValueStore; | 62 | private Dictionary<UUID,JsonStore> m_JsonValueStore; |
@@ -90,6 +93,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
90 | } | 93 | } |
91 | 94 | ||
92 | m_enabled = m_config.GetBoolean("Enabled", m_enabled); | 95 | m_enabled = m_config.GetBoolean("Enabled", m_enabled); |
96 | m_enableObjectStore = m_config.GetBoolean("EnableObjectStore", m_enableObjectStore); | ||
97 | m_maxStringSpace = m_config.GetInt("MaxStringSpace", m_maxStringSpace); | ||
98 | if (m_maxStringSpace == 0) | ||
99 | m_maxStringSpace = Int32.MaxValue; | ||
93 | } | 100 | } |
94 | catch (Exception e) | 101 | catch (Exception e) |
95 | { | 102 | { |
@@ -178,6 +185,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
178 | public bool AttachObjectStore(UUID objectID) | 185 | public bool AttachObjectStore(UUID objectID) |
179 | { | 186 | { |
180 | if (! m_enabled) return false; | 187 | if (! m_enabled) return false; |
188 | if (! m_enableObjectStore) return false; | ||
181 | 189 | ||
182 | SceneObjectPart sop = m_scene.GetSceneObjectPart(objectID); | 190 | SceneObjectPart sop = m_scene.GetSceneObjectPart(objectID); |
183 | if (sop == null) | 191 | if (sop == null) |
@@ -311,7 +319,16 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
311 | try | 319 | try |
312 | { | 320 | { |
313 | lock (map) | 321 | lock (map) |
322 | { | ||
323 | if (map.StringSpace > m_maxStringSpace) | ||
324 | { | ||
325 | m_log.WarnFormat("[JsonStore] {0} exceeded string size; {1} bytes used of {2} limit", | ||
326 | storeID,map.StringSpace,m_maxStringSpace); | ||
327 | return false; | ||
328 | } | ||
329 | |||
314 | return map.SetValue(path,value,useJson); | 330 | return map.SetValue(path,value,useJson); |
331 | } | ||
315 | } | 332 | } |
316 | catch (Exception e) | 333 | catch (Exception e) |
317 | { | 334 | { |