From e93defd0ca326754d1bd5a1a503d6d47428272be Mon Sep 17 00:00:00 2001
From: Mic Bowman
Date: Fri, 8 Feb 2013 15:07:43 -0800
Subject: Adds size limits to JsonStore. Adds a separate configuration variable
to enable binding to dynamic attributes.
---
.../Scripting/JsonStore/JsonStore.cs | 51 +++++++++++++++++++++-
1 file changed, 49 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs')
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStore.cs
index c7f0001..088d0cd 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
// -----------------------------------------------------------------
///
+ /// This is a simple estimator for the size of the stored data, it
+ /// is not precise, but should be close enough to implement reasonable
+ /// limits on the storage space used
+ ///
+ // -----------------------------------------------------------------
+ public int StringSpace { get; set; }
+
+ // -----------------------------------------------------------------
+ ///
///
///
// -----------------------------------------------------------------
@@ -110,6 +119,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
// -----------------------------------------------------------------
public JsonStore()
{
+ StringSpace = 0;
m_TakeStore = new List();
m_ReadStore = new List();
}
@@ -247,6 +257,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
if (path.Count == 0)
{
ValueStore = ovalue;
+ StringSpace = 0;
return true;
}
@@ -278,8 +289,13 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
{
string npkey = String.Format("[{0}]",amap.Count);
- amap.Add(ovalue);
- InvokeNextCallback(pexpr + npkey);
+ if (ovalue != null)
+ {
+ StringSpace += ComputeSizeOf(ovalue);
+
+ amap.Add(ovalue);
+ InvokeNextCallback(pexpr + npkey);
+ }
return true;
}
@@ -287,9 +303,14 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
if (0 <= aval && aval < amap.Count)
{
if (ovalue == null)
+ {
+ StringSpace -= ComputeSizeOf(amap[aval]);
amap.RemoveAt(aval);
+ }
else
{
+ StringSpace -= ComputeSizeOf(amap[aval]);
+ StringSpace += ComputeSizeOf(ovalue);
amap[aval] = ovalue;
InvokeNextCallback(pexpr + pkey);
}
@@ -313,6 +334,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
OSDMap hmap = result as OSDMap;
if (ovalue != null)
{
+ StringSpace -= ComputeSizeOf(hmap[hkey]);
+ StringSpace += ComputeSizeOf(ovalue);
+
hmap[hkey] = ovalue;
InvokeNextCallback(pexpr + pkey);
return true;
@@ -321,6 +345,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
// this is the remove case
if (hmap.ContainsKey(hkey))
{
+ StringSpace -= ComputeSizeOf(hmap[hkey]);
hmap.Remove(hkey);
return true;
}
@@ -531,8 +556,27 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
return pkey;
}
+
+ // -----------------------------------------------------------------
+ ///
+ ///
+ ///
+ // -----------------------------------------------------------------
+ protected static int ComputeSizeOf(OSD value)
+ {
+ string sval;
+
+ if (ConvertOutputValue(value,out sval,true))
+ return sval.Length;
+
+ return 0;
+ }
}
+ // -----------------------------------------------------------------
+ ///
+ ///
+ // -----------------------------------------------------------------
public class JsonObjectStore : JsonStore
{
private static readonly ILog m_log =
@@ -566,6 +610,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
{
m_scene = scene;
m_objectID = oid;
+
+ // the size limit is imposed on whatever is already in the store
+ StringSpace = ComputeSizeOf(ValueStore);
}
}
--
cgit v1.1