add first version of other data storage typs
parent
ab7039177e
commit
bd9124da1f
111
src/DataValue.cs
111
src/DataValue.cs
|
@ -32,6 +32,11 @@ namespace OpenSim.Modules.DataValue
|
||||||
private String m_storageTyp = null;
|
private String m_storageTyp = null;
|
||||||
private iStorage m_storage = null;
|
private iStorage m_storage = null;
|
||||||
|
|
||||||
|
private List<StorageElement> m_cache = new List<StorageElement>();
|
||||||
|
|
||||||
|
private Timer m_timer = null;
|
||||||
|
private int m_rateLimit = 0;
|
||||||
|
|
||||||
public string Name
|
public string Name
|
||||||
{
|
{
|
||||||
get { return "DataValueModule"; }
|
get { return "DataValueModule"; }
|
||||||
|
@ -58,13 +63,18 @@ namespace OpenSim.Modules.DataValue
|
||||||
{
|
{
|
||||||
m_config = source.Configs["XEngine"];
|
m_config = source.Configs["XEngine"];
|
||||||
|
|
||||||
m_storageTyp = m_config.GetString("DataStorageTyp", "RegionExtras").ToUpper().Trim();
|
m_storageTyp = m_config.GetString("DataStorageTyp", "FileSystem").ToUpper().Trim();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[" + Name + "]: initialization error: {0}", e.Message);
|
m_log.ErrorFormat("[" + Name + "]: initialization error: {0}", e.Message);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_timer = new Timer();
|
||||||
|
m_timer.Interval = 1000;
|
||||||
|
m_timer.Elapsed += cleanUp;
|
||||||
|
m_timer.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegionLoaded(Scene scene)
|
public void RegionLoaded(Scene scene)
|
||||||
|
@ -83,26 +93,16 @@ namespace OpenSim.Modules.DataValue
|
||||||
m_storage = new MySQL(m_scene, m_config);
|
m_storage = new MySQL(m_scene, m_config);
|
||||||
|
|
||||||
if(m_storage == null)
|
if(m_storage == null)
|
||||||
m_storage = new RegionExtras(m_scene, m_config);
|
m_storage = new FileSystem(m_scene, m_config);
|
||||||
|
|
||||||
m_scriptModule = m_scene.RequestModuleInterface<IScriptModuleComms>();
|
m_scriptModule = m_scene.RequestModuleInterface<IScriptModuleComms>();
|
||||||
if (m_scriptModule == null)
|
if (m_scriptModule != null)
|
||||||
{
|
|
||||||
m_log.ErrorFormat("[" + Name + "]: Failed to load IScriptModuleComms!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
m_scriptModule.RegisterScriptInvocation(this, "osGetDataValue");
|
m_scriptModule.RegisterScriptInvocation(this, "osGetDataValue");
|
||||||
m_scriptModule.RegisterScriptInvocation(this, "osSetDataValue");
|
m_scriptModule.RegisterScriptInvocation(this, "osSetDataValue");
|
||||||
m_scriptModule.RegisterScriptInvocation(this, "osDeleteDataValue");
|
m_scriptModule.RegisterScriptInvocation(this, "osDeleteDataValue");
|
||||||
m_scriptModule.RegisterScriptInvocation(this, "osCheckDataValue");
|
m_scriptModule.RegisterScriptInvocation(this, "osCheckDataValue");
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
m_log.WarnFormat("[" + Name + "]: script method registration failed; {0}", e.Message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
|
@ -117,24 +117,109 @@ namespace OpenSim.Modules.DataValue
|
||||||
[ScriptInvocation]
|
[ScriptInvocation]
|
||||||
public string osGetDataValue(UUID hostID, UUID scriptID, string key)
|
public string osGetDataValue(UUID hostID, UUID scriptID, string key)
|
||||||
{
|
{
|
||||||
|
if(m_storage != null)
|
||||||
|
{
|
||||||
|
SceneObjectGroup _host = m_scene.GetSceneObjectGroup(hostID);
|
||||||
|
StorageElement _element = m_cache.Find(X => X.Group == _host.GroupID.ToString() && X.Index == key);
|
||||||
|
|
||||||
|
if (_element != null)
|
||||||
|
return _element.get();
|
||||||
|
|
||||||
|
checkRateLimit();
|
||||||
|
|
||||||
|
String _data = m_storage.get(_host.GroupID.ToString(), key);
|
||||||
|
|
||||||
|
if (_data == null)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
m_cache.Add(new StorageElement(_host.GroupID.ToString(), key, _data, m_storage));
|
||||||
|
|
||||||
|
return _data;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Exception("No data Storage aviable.");
|
||||||
}
|
}
|
||||||
|
|
||||||
[ScriptInvocation]
|
[ScriptInvocation]
|
||||||
public void osSetDataValue(UUID hostID, UUID scriptID, string key, string value)
|
public void osSetDataValue(UUID hostID, UUID scriptID, string key, string value)
|
||||||
{
|
{
|
||||||
|
if (m_storage != null)
|
||||||
|
{
|
||||||
|
SceneObjectGroup _host = m_scene.GetSceneObjectGroup(hostID);
|
||||||
|
StorageElement _element = m_cache.Find(X => X.Group == _host.GroupID.ToString() && X.Index == key);
|
||||||
|
|
||||||
|
if(_element != null)
|
||||||
|
{
|
||||||
|
_element.save(value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
checkRateLimit();
|
||||||
|
|
||||||
|
m_cache.Add(new StorageElement(_host.GroupID.ToString(), key, value, m_storage));
|
||||||
|
m_storage.save(_host.GroupID.ToString(), key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Exception("No data Storage aviable.");
|
||||||
|
}
|
||||||
[ScriptInvocation]
|
[ScriptInvocation]
|
||||||
public void osDeleteDataValue(UUID hostID, UUID scriptID, string key, string value)
|
public void osDeleteDataValue(UUID hostID, UUID scriptID, string key, string value)
|
||||||
{
|
{
|
||||||
|
if (m_storage != null)
|
||||||
|
{
|
||||||
|
SceneObjectGroup _host = m_scene.GetSceneObjectGroup(hostID);
|
||||||
|
StorageElement _element = m_cache.Find(X => X.Group == _host.GroupID.ToString() && X.Index == key);
|
||||||
|
|
||||||
|
checkRateLimit();
|
||||||
|
|
||||||
|
if (_element != null)
|
||||||
|
m_cache.Remove(_element);
|
||||||
|
|
||||||
|
m_storage.remove(_host.GroupID.ToString(), key);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Exception("No data Storage aviable.");
|
||||||
}
|
}
|
||||||
|
|
||||||
[ScriptInvocation]
|
[ScriptInvocation]
|
||||||
public int osCheckDataValue(UUID hostID, UUID scriptID, string key)
|
public int osCheckDataValue(UUID hostID, UUID scriptID, string key)
|
||||||
{
|
{
|
||||||
|
if (m_storage != null)
|
||||||
|
{
|
||||||
|
SceneObjectGroup _host = m_scene.GetSceneObjectGroup(hostID);
|
||||||
|
StorageElement _element = m_cache.Find(X => X.Group == _host.GroupID.ToString() && X.Index == key);
|
||||||
|
|
||||||
|
if (_element != null)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
checkRateLimit();
|
||||||
|
|
||||||
|
if (m_storage.check(_host.GroupID.ToString(), key))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Exception("No data Storage aviable.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cleanUp(object sender, ElapsedEventArgs e)
|
||||||
|
{
|
||||||
|
if(m_rateLimit >= 0)
|
||||||
|
m_rateLimit = m_rateLimit - 100;
|
||||||
|
|
||||||
|
List<StorageElement> _allStorageElements = m_cache.FindAll(X => X.LastUse + 10 <= (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
|
||||||
|
|
||||||
|
foreach(StorageElement _element in _allStorageElements)
|
||||||
|
m_cache.Remove(_element);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkRateLimit()
|
||||||
|
{
|
||||||
|
m_rateLimit++;
|
||||||
|
|
||||||
|
if (m_rateLimit >= 1000)
|
||||||
|
throw new Exception("Data storage rate limit reached!");
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -26,45 +26,34 @@ namespace OpenSim.Modules.DataValue.Storage
|
||||||
{
|
{
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
|
||||||
m_dataValueDirectory = config.Configs["XEngine"].GetString("DataValueStorageDirectory", m_dataValueDirectory);
|
m_dataValueDirectory = config.GetString("DataValueStorageDirectory", m_dataValueDirectory);
|
||||||
m_enabledCompress = config.Configs["XEngine"].GetBoolean("EnabledDataStorageCompressing", m_enabledCompress);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool check(String storageID, string key)
|
public bool check(String storageID, string key)
|
||||||
{
|
{
|
||||||
string _filePath = getFilePath(hostID, key);
|
string _filePath = getFilePath(storageID, key);
|
||||||
|
|
||||||
FileInfo file = new FileInfo(_filePath);
|
FileInfo file = new FileInfo(_filePath);
|
||||||
|
|
||||||
if (file.Exists)
|
if (file.Exists)
|
||||||
return 1;
|
return true;
|
||||||
|
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string get(String storageID, string key)
|
public String get(String storageID, string key)
|
||||||
{
|
{
|
||||||
string _filePath = getFilePath(hostID, key);
|
FileInfo file = new FileInfo(getFilePath(storageID, key));
|
||||||
|
|
||||||
FileInfo file = new FileInfo(_filePath);
|
|
||||||
|
|
||||||
if (file.Exists)
|
if (file.Exists)
|
||||||
{
|
|
||||||
if (m_enabledCompress)
|
|
||||||
return Compress.Unzip(File.ReadAllBytes(file.FullName));
|
|
||||||
|
|
||||||
return File.ReadAllText(file.FullName);
|
return File.ReadAllText(file.FullName);
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void remove(string storageID, string key)
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
public string remove(string storageID, string key)
|
|
||||||
{
|
{
|
||||||
string _filePath = getFilePath(hostID, key);
|
FileInfo file = new FileInfo(getFilePath(storageID, key));
|
||||||
|
|
||||||
FileInfo file = new FileInfo(_filePath);
|
|
||||||
|
|
||||||
if (file.Exists)
|
if (file.Exists)
|
||||||
file.Delete();
|
file.Delete();
|
||||||
|
@ -72,21 +61,11 @@ namespace OpenSim.Modules.DataValue.Storage
|
||||||
|
|
||||||
public void save(String storageID, string key, string data)
|
public void save(String storageID, string key, string data)
|
||||||
{
|
{
|
||||||
string _filePath = getFilePath(hostID, key);
|
FileInfo file = new FileInfo(getFilePath(storageID, key));
|
||||||
|
File.WriteAllText(file.FullName, data);
|
||||||
FileInfo file = new FileInfo(_filePath);
|
|
||||||
|
|
||||||
if (m_enabledCompress)
|
|
||||||
{
|
|
||||||
File.WriteAllBytes(file.FullName, Compress.Zip(value));
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
File.WriteAllText(file.FullName, value);
|
private string getFilePath(String host, String index)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private string getFilePath(UUID host, string index)
|
|
||||||
{
|
{
|
||||||
SceneObjectGroup _host = m_scene.GetSceneObjectGroup(host);
|
SceneObjectGroup _host = m_scene.GetSceneObjectGroup(host);
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace OpenSim.Modules.DataValue.Storage
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public string remove(string storageID, string key)
|
public void remove(string storageID, string key)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ namespace OpenSim.Modules.DataValue.Storage
|
||||||
return m_scene.GetExtraSetting("V:" + storageID + "." + key);
|
return m_scene.GetExtraSetting("V:" + storageID + "." + key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string remove(string storageID, string key)
|
public void remove(string storageID, string key)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,8 @@ namespace OpenSim.Modules.DataValue.Storage
|
||||||
interface iStorage
|
interface iStorage
|
||||||
{
|
{
|
||||||
void save(String storageID, String key, String data);
|
void save(String storageID, String key, String data);
|
||||||
string get(String storageID, String key);
|
String get(String storageID, String key);
|
||||||
string remove(String storageID, String key);
|
void remove(String storageID, String key);
|
||||||
bool check(String storageID, String key);
|
bool check(String storageID, String key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
using OpenSim.Modules.DataValue.Storage;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace OpenSim.Modules.DataValue
|
||||||
|
{
|
||||||
|
class StorageElement
|
||||||
|
{
|
||||||
|
private String m_group = null;
|
||||||
|
private String m_index = null;
|
||||||
|
private String m_data = null;
|
||||||
|
|
||||||
|
private int m_lastUseTime = 0;
|
||||||
|
|
||||||
|
private iStorage m_storage = null;
|
||||||
|
|
||||||
|
public StorageElement(String group, String index, String data, iStorage storage)
|
||||||
|
{
|
||||||
|
m_group = group;
|
||||||
|
m_index = index;
|
||||||
|
m_data = data;
|
||||||
|
|
||||||
|
m_storage = storage;
|
||||||
|
|
||||||
|
m_lastUseTime = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string get()
|
||||||
|
{
|
||||||
|
m_lastUseTime = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
|
||||||
|
|
||||||
|
return m_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove()
|
||||||
|
{
|
||||||
|
m_lastUseTime = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
|
||||||
|
m_storage.remove(m_group, m_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save(string data)
|
||||||
|
{
|
||||||
|
m_lastUseTime = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
|
||||||
|
m_data = data;
|
||||||
|
m_storage.save(m_group, m_index, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int LastUse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_lastUseTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Group
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_group;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Index
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue