Merge git://opensimulator.org/git/opensim
commit
9c0f3c73b1
|
@ -28,7 +28,7 @@ people that make the day to day of OpenSim happen.
|
|||
* Diva (Crista Lopes, University of California, Irvine)
|
||||
* nlin (3Di)
|
||||
* Arthur Rodrigo S Valadares (IBM)
|
||||
|
||||
* BlueWall (James Hughes)
|
||||
|
||||
= Past Open Sim Developers =
|
||||
These folks are alumns of the OpenSim core group, but are now
|
||||
|
@ -117,6 +117,7 @@ what it is today.
|
|||
* SachaMagne
|
||||
* Salahzar Stenvaag
|
||||
* sempuki
|
||||
* SignpostMarv
|
||||
* Snoopy
|
||||
* Strawberry Fride
|
||||
* tglion
|
||||
|
|
|
@ -68,7 +68,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
|
|||
|
||||
public void Initialise()
|
||||
{
|
||||
m_log.Error("[LOADREGIONS]: " + Name + " cannot be default-initialized!");
|
||||
m_log.Error("[LOAD REGIONS PLUGIN]: " + Name + " cannot be default-initialized!");
|
||||
throw new PluginNotInitialisedException(Name);
|
||||
}
|
||||
|
||||
|
@ -85,41 +85,39 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
|
|||
IRegionLoader regionLoader;
|
||||
if (m_openSim.ConfigSource.Source.Configs["Startup"].GetString("region_info_source", "filesystem") == "filesystem")
|
||||
{
|
||||
m_log.Info("[LOADREGIONS]: Loading region configurations from filesystem");
|
||||
m_log.Info("[LOAD REGIONS PLUGIN]: Loading region configurations from filesystem");
|
||||
regionLoader = new RegionLoaderFileSystem();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Info("[LOADREGIONSPLUGIN]: Loading region configurations from web");
|
||||
m_log.Info("[LOAD REGIONS PLUGIN]: Loading region configurations from web");
|
||||
regionLoader = new RegionLoaderWebServer();
|
||||
}
|
||||
|
||||
m_log.Info("[LOADREGIONSPLUGIN]: Loading region configurations...");
|
||||
|
||||
regionLoader.SetIniConfigSource(m_openSim.ConfigSource.Source);
|
||||
RegionInfo[] regionsToLoad = regionLoader.LoadRegions();
|
||||
|
||||
m_log.Info("[LOADREGIONSPLUGIN]: Loading specific shared modules...");
|
||||
m_log.Info("[LOADREGIONSPLUGIN]: DynamicTextureModule...");
|
||||
m_log.Info("[LOAD REGIONS PLUGIN]: Loading specific shared modules...");
|
||||
m_log.Info("[LOAD REGIONS PLUGIN]: DynamicTextureModule...");
|
||||
m_openSim.ModuleLoader.LoadDefaultSharedModule(new DynamicTextureModule());
|
||||
m_log.Info("[LOADREGIONSPLUGIN]: LoadImageURLModule...");
|
||||
m_log.Info("[LOAD REGIONS PLUGIN]: LoadImageURLModule...");
|
||||
m_openSim.ModuleLoader.LoadDefaultSharedModule(new LoadImageURLModule());
|
||||
m_log.Info("[LOADREGIONSPLUGIN]: XMLRPCModule...");
|
||||
m_log.Info("[LOAD REGIONS PLUGIN]: XMLRPCModule...");
|
||||
m_openSim.ModuleLoader.LoadDefaultSharedModule(new XMLRPCModule());
|
||||
// m_log.Info("[LOADREGIONSPLUGIN]: AssetTransactionModule...");
|
||||
// m_openSim.ModuleLoader.LoadDefaultSharedModule(new AssetTransactionModule());
|
||||
m_log.Info("[LOADREGIONSPLUGIN]: Done.");
|
||||
m_log.Info("[LOAD REGIONS PLUGIN]: Done.");
|
||||
|
||||
if (!CheckRegionsForSanity(regionsToLoad))
|
||||
{
|
||||
m_log.Error("[LOADREGIONS]: Halting startup due to conflicts in region configurations");
|
||||
m_log.Error("[LOAD REGIONS PLUGIN]: Halting startup due to conflicts in region configurations");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
for (int i = 0; i < regionsToLoad.Length; i++)
|
||||
{
|
||||
IScene scene;
|
||||
m_log.Debug("[LOADREGIONS]: Creating Region: " + regionsToLoad[i].RegionName + " (ThreadID: " +
|
||||
m_log.Debug("[LOAD REGIONS PLUGIN]: Creating Region: " + regionsToLoad[i].RegionName + " (ThreadID: " +
|
||||
Thread.CurrentThread.ManagedThreadId.ToString() +
|
||||
")");
|
||||
|
||||
|
@ -164,7 +162,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
|
|||
if (regions[i].RegionID == regions[j].RegionID)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[LOADREGIONS]: Regions {0} and {1} have the same UUID {2}",
|
||||
"[LOAD REGIONS PLUGIN]: Regions {0} and {1} have the same UUID {2}",
|
||||
regions[i].RegionName, regions[j].RegionName, regions[i].RegionID);
|
||||
return false;
|
||||
}
|
||||
|
@ -172,14 +170,14 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
|
|||
regions[i].RegionLocX == regions[j].RegionLocX && regions[i].RegionLocY == regions[j].RegionLocY)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[LOADREGIONS]: Regions {0} and {1} have the same grid location ({2}, {3})",
|
||||
"[LOAD REGIONS PLUGIN]: Regions {0} and {1} have the same grid location ({2}, {3})",
|
||||
regions[i].RegionName, regions[j].RegionName, regions[i].RegionLocX, regions[i].RegionLocY);
|
||||
return false;
|
||||
}
|
||||
else if (regions[i].InternalEndPoint.Port == regions[j].InternalEndPoint.Port)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[LOADREGIONS]: Regions {0} and {1} have the same internal IP port {2}",
|
||||
"[LOAD REGIONS PLUGIN]: Regions {0} and {1} have the same internal IP port {2}",
|
||||
regions[i].RegionName, regions[j].RegionName, regions[i].InternalEndPoint.Port);
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -2129,17 +2129,17 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
|
|||
}
|
||||
catch (DllNotFoundException)
|
||||
{
|
||||
Rest.Log.ErrorFormat("OpenJpeg is not installed correctly on this system. Asset Data is emtpy for {0}", ic.Item.Name);
|
||||
Rest.Log.ErrorFormat("OpenJpeg is not installed correctly on this system. Asset Data is empty for {0}", ic.Item.Name);
|
||||
ic.Asset.Data = new Byte[0];
|
||||
}
|
||||
catch (IndexOutOfRangeException)
|
||||
{
|
||||
Rest.Log.ErrorFormat("OpenJpeg was unable to encode this. Asset Data is emtpy for {0}", ic.Item.Name);
|
||||
Rest.Log.ErrorFormat("OpenJpeg was unable to encode this. Asset Data is empty for {0}", ic.Item.Name);
|
||||
ic.Asset.Data = new Byte[0];
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
Rest.Log.ErrorFormat("OpenJpeg was unable to encode this. Asset Data is emtpy for {0}", ic.Item.Name);
|
||||
Rest.Log.ErrorFormat("OpenJpeg was unable to encode this. Asset Data is empty for {0}", ic.Item.Name);
|
||||
ic.Asset.Data = new Byte[0];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -66,8 +66,8 @@ namespace OpenSim.Client.MXP.ClientStack
|
|||
private readonly IScene m_scene;
|
||||
private readonly string m_firstName;
|
||||
private readonly string m_lastName;
|
||||
private int m_objectsToSynchronize = 0;
|
||||
private int m_objectsSynchronized = -1;
|
||||
// private int m_objectsToSynchronize = 0;
|
||||
// private int m_objectsSynchronized = -1;
|
||||
|
||||
private Vector3 m_startPosition=new Vector3(128f, 128f, 128f);
|
||||
#endregion
|
||||
|
@ -462,8 +462,8 @@ namespace OpenSim.Client.MXP.ClientStack
|
|||
|
||||
public void MXPSendSynchronizationBegin(int objectCount)
|
||||
{
|
||||
m_objectsToSynchronize = objectCount;
|
||||
m_objectsSynchronized = 0;
|
||||
// m_objectsToSynchronize = objectCount;
|
||||
// m_objectsSynchronized = 0;
|
||||
SynchronizationBeginEventMessage synchronizationBeginEventMessage = new SynchronizationBeginEventMessage();
|
||||
synchronizationBeginEventMessage.ObjectCount = (uint)objectCount;
|
||||
Session.Send(synchronizationBeginEventMessage);
|
||||
|
@ -1252,7 +1252,7 @@ namespace OpenSim.Client.MXP.ClientStack
|
|||
// Need to translate to MXP somehow
|
||||
}
|
||||
|
||||
public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, LandData landData, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
|
||||
public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, ILandObject lo, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
|
||||
{
|
||||
// Need to translate to MXP somehow
|
||||
}
|
||||
|
|
|
@ -799,7 +799,7 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
|
|||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, LandData landData, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
|
||||
public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, ILandObject lo, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ namespace OpenSim.Data.MSSQL
|
|||
public class MSSQLAvatarData : MSSQLGenericTableHandler<AvatarBaseData>,
|
||||
IAvatarData
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public MSSQLAvatarData(string connectionString, string realm) :
|
||||
base(connectionString, realm, "Avatar")
|
||||
|
|
|
@ -350,26 +350,48 @@ namespace OpenSim.Data.MSSQL
|
|||
|
||||
public EstateSettings LoadEstateSettings(int estateID)
|
||||
{
|
||||
// TODO: Implementation!
|
||||
return new EstateSettings();
|
||||
}
|
||||
|
||||
public List<EstateSettings> LoadEstateSettingsAll()
|
||||
{
|
||||
// TODO: Implementation!
|
||||
return new List<EstateSettings>();
|
||||
}
|
||||
|
||||
public List<int> GetEstates(string search)
|
||||
{
|
||||
// TODO: Implementation!
|
||||
return new List<int>();
|
||||
}
|
||||
|
||||
public List<int> GetEstatesAll()
|
||||
{
|
||||
// TODO: Implementation!
|
||||
return new List<int>();
|
||||
}
|
||||
|
||||
public List<int> GetEstatesByOwner(UUID ownerID)
|
||||
{
|
||||
return new List<int>();
|
||||
}
|
||||
|
||||
public bool LinkRegion(UUID regionID, int estateID)
|
||||
{
|
||||
// TODO: Implementation!
|
||||
return false;
|
||||
}
|
||||
|
||||
public List<UUID> GetRegions(int estateID)
|
||||
{
|
||||
// TODO: Implementation!
|
||||
return new List<UUID>();
|
||||
}
|
||||
|
||||
public bool DeleteEstate(int estateID)
|
||||
{
|
||||
// TODO: Implementation!
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
|
|
|
@ -40,8 +40,8 @@ namespace OpenSim.Data.MSSQL
|
|||
{
|
||||
public class MSSQLGenericTableHandler<T> where T : class, new()
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
// private static readonly ILog m_log =
|
||||
// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected string m_ConnectionString;
|
||||
protected MSSQLManager m_database; //used for parameter type translation
|
||||
|
|
|
@ -43,7 +43,7 @@ namespace OpenSim.Data.MSSQL
|
|||
public class MSSQLGridUserData : MSSQLGenericTableHandler<GridUserData>,
|
||||
IGridUserData
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public MSSQLGridUserData(string connectionString, string realm) :
|
||||
base(connectionString, realm, "GridUserStore")
|
||||
|
|
|
@ -41,7 +41,7 @@ namespace OpenSim.Data.MSSQL
|
|||
/// </summary>
|
||||
public class MSSQLManager
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// Connection string for ADO.net
|
||||
|
@ -180,8 +180,6 @@ namespace OpenSim.Data.MSSQL
|
|||
return parameter;
|
||||
}
|
||||
|
||||
private static readonly Dictionary<string, string> emptyDictionary = new Dictionary<string, string>();
|
||||
|
||||
/// <summary>
|
||||
/// Checks if we need to do some migrations to the database
|
||||
/// </summary>
|
||||
|
|
|
@ -43,7 +43,7 @@ namespace OpenSim.Data.MSSQL
|
|||
public class MSSQLPresenceData : MSSQLGenericTableHandler<PresenceData>,
|
||||
IPresenceData
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public MSSQLPresenceData(string connectionString, string realm) :
|
||||
base(connectionString, realm, "Presence")
|
||||
|
|
|
@ -40,8 +40,8 @@ namespace OpenSim.Data.MSSQL
|
|||
{
|
||||
public class MSSQLXInventoryData : IXInventoryData
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(
|
||||
MethodBase.GetCurrentMethod().DeclaringType);
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(
|
||||
// MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private MSSQLGenericTableHandler<XInventoryFolder> m_Folders;
|
||||
private MSSQLItemHandler m_Items;
|
||||
|
|
|
@ -47,6 +47,11 @@ namespace OpenSim.Data.MySQL
|
|||
private string m_connectionString;
|
||||
private object m_dbLock = new object();
|
||||
|
||||
protected virtual Assembly Assembly
|
||||
{
|
||||
get { return GetType().Assembly; }
|
||||
}
|
||||
|
||||
#region IPlugin Members
|
||||
|
||||
public override string Version { get { return "1.0.0.0"; } }
|
||||
|
@ -66,13 +71,10 @@ namespace OpenSim.Data.MySQL
|
|||
{
|
||||
m_connectionString = connect;
|
||||
|
||||
// This actually does the roll forward assembly stuff
|
||||
Assembly assem = GetType().Assembly;
|
||||
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
Migration m = new Migration(dbcon, assem, "AssetStore");
|
||||
Migration m = new Migration(dbcon, Assembly, "AssetStore");
|
||||
m.Update();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Data;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
@ -42,6 +43,11 @@ namespace OpenSim.Data.MySQL
|
|||
private int m_LastExpire;
|
||||
// private string m_connectionString;
|
||||
|
||||
protected virtual Assembly Assembly
|
||||
{
|
||||
get { return GetType().Assembly; }
|
||||
}
|
||||
|
||||
public MySqlAuthenticationData(string connectionString, string realm)
|
||||
: base(connectionString)
|
||||
{
|
||||
|
@ -51,7 +57,7 @@ namespace OpenSim.Data.MySQL
|
|||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
Migration m = new Migration(dbcon, GetType().Assembly, "AuthStore");
|
||||
Migration m = new Migration(dbcon, Assembly, "AuthStore");
|
||||
m.Update();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,6 +54,11 @@ namespace OpenSim.Data.MySQL
|
|||
private Dictionary<string, FieldInfo> m_FieldMap =
|
||||
new Dictionary<string, FieldInfo>();
|
||||
|
||||
protected virtual Assembly Assembly
|
||||
{
|
||||
get { return GetType().Assembly; }
|
||||
}
|
||||
|
||||
public MySQLEstateStore()
|
||||
{
|
||||
}
|
||||
|
@ -82,8 +87,7 @@ namespace OpenSim.Data.MySQL
|
|||
{
|
||||
dbcon.Open();
|
||||
|
||||
Assembly assem = GetType().Assembly;
|
||||
Migration m = new Migration(dbcon, assem, "EstateStore");
|
||||
Migration m = new Migration(dbcon, Assembly, "EstateStore");
|
||||
m.Update();
|
||||
|
||||
Type t = typeof(EstateSettings);
|
||||
|
@ -409,6 +413,46 @@ namespace OpenSim.Data.MySQL
|
|||
return DoLoad(cmd, UUID.Zero, false);
|
||||
}
|
||||
}
|
||||
|
||||
public List<EstateSettings> LoadEstateSettingsAll()
|
||||
{
|
||||
List<EstateSettings> allEstateSettings = new List<EstateSettings>();
|
||||
|
||||
List<int> allEstateIds = GetEstatesAll();
|
||||
|
||||
foreach (int estateId in allEstateIds)
|
||||
allEstateSettings.Add(LoadEstateSettings(estateId));
|
||||
|
||||
return allEstateSettings;
|
||||
}
|
||||
|
||||
public List<int> GetEstatesAll()
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
|
||||
using (MySqlCommand cmd = dbcon.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "select estateID from estate_settings";
|
||||
|
||||
using (IDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(Convert.ToInt32(reader["EstateID"]));
|
||||
}
|
||||
reader.Close();
|
||||
}
|
||||
}
|
||||
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<int> GetEstates(string search)
|
||||
{
|
||||
|
@ -440,6 +484,36 @@ namespace OpenSim.Data.MySQL
|
|||
return result;
|
||||
}
|
||||
|
||||
public List<int> GetEstatesByOwner(UUID ownerID)
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
|
||||
using (MySqlCommand cmd = dbcon.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "select estateID from estate_settings where EstateOwner = ?EstateOwner";
|
||||
cmd.Parameters.AddWithValue("?EstateOwner", ownerID);
|
||||
|
||||
using (IDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(Convert.ToInt32(reader["EstateID"]));
|
||||
}
|
||||
reader.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool LinkRegion(UUID regionID, int estateID)
|
||||
{
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
|
|
|
@ -46,6 +46,11 @@ namespace OpenSim.Data.MySQL
|
|||
protected string m_Realm;
|
||||
protected FieldInfo m_DataField = null;
|
||||
|
||||
protected virtual Assembly Assembly
|
||||
{
|
||||
get { return GetType().Assembly; }
|
||||
}
|
||||
|
||||
public MySQLGenericTableHandler(string connectionString,
|
||||
string realm, string storeName) : base(connectionString)
|
||||
{
|
||||
|
@ -57,7 +62,7 @@ namespace OpenSim.Data.MySQL
|
|||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
Migration m = new Migration(dbcon, GetType().Assembly, storeName);
|
||||
Migration m = new Migration(dbcon, Assembly, storeName);
|
||||
m.Update();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,6 +29,8 @@ using System;
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Data;
|
||||
|
@ -42,6 +44,11 @@ namespace OpenSim.Data.MySQL
|
|||
private List<string> m_ColumnNames;
|
||||
//private string m_connectionString;
|
||||
|
||||
protected virtual Assembly Assembly
|
||||
{
|
||||
get { return GetType().Assembly; }
|
||||
}
|
||||
|
||||
public MySqlRegionData(string connectionString, string realm)
|
||||
: base(connectionString)
|
||||
{
|
||||
|
@ -51,7 +58,7 @@ namespace OpenSim.Data.MySQL
|
|||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
Migration m = new Migration(dbcon, GetType().Assembly, "GridStore");
|
||||
Migration m = new Migration(dbcon, Assembly, "GridStore");
|
||||
m.Update();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,6 +52,11 @@ namespace OpenSim.Data.MySQL
|
|||
private string m_connectionString;
|
||||
private object m_dbLock = new object();
|
||||
|
||||
protected virtual Assembly Assembly
|
||||
{
|
||||
get { return GetType().Assembly; }
|
||||
}
|
||||
|
||||
public MySQLSimulationData()
|
||||
{
|
||||
}
|
||||
|
@ -71,8 +76,7 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
// Apply new Migrations
|
||||
//
|
||||
Assembly assem = GetType().Assembly;
|
||||
Migration m = new Migration(dbcon, assem, "RegionStore");
|
||||
Migration m = new Migration(dbcon, Assembly, "RegionStore");
|
||||
m.Update();
|
||||
|
||||
// Clean dropped attachments
|
||||
|
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
|
||||
namespace OpenSim.Data.Null
|
||||
{
|
||||
public class NullEstateStore : IEstateDataStore
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private string m_connectionString;
|
||||
|
||||
protected virtual Assembly Assembly
|
||||
{
|
||||
get { return GetType().Assembly; }
|
||||
}
|
||||
|
||||
public NullEstateStore()
|
||||
{
|
||||
}
|
||||
|
||||
public NullEstateStore(string connectionString)
|
||||
{
|
||||
Initialise(connectionString);
|
||||
}
|
||||
|
||||
public void Initialise(string connectionString)
|
||||
{
|
||||
m_connectionString = connectionString;
|
||||
}
|
||||
|
||||
private string[] FieldList
|
||||
{
|
||||
get { return new string[0]; }
|
||||
}
|
||||
|
||||
public EstateSettings LoadEstateSettings(UUID regionID, bool create)
|
||||
{
|
||||
// This fools the initialization caller into thinking an estate was fetched (a check in OpenSimBase).
|
||||
// The estate info is pretty empty so don't try banning anyone.
|
||||
EstateSettings oneEstate = new EstateSettings();
|
||||
oneEstate.EstateID = 1;
|
||||
return oneEstate;
|
||||
}
|
||||
|
||||
public void StoreEstateSettings(EstateSettings es)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public EstateSettings LoadEstateSettings(int estateID)
|
||||
{
|
||||
return new EstateSettings();
|
||||
}
|
||||
|
||||
public List<EstateSettings> LoadEstateSettingsAll()
|
||||
{
|
||||
List<EstateSettings> allEstateSettings = new List<EstateSettings>();
|
||||
allEstateSettings.Add(new EstateSettings());
|
||||
return allEstateSettings;
|
||||
}
|
||||
|
||||
public List<int> GetEstatesAll()
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<int> GetEstates(string search)
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool LinkRegion(UUID regionID, int estateID)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public List<UUID> GetRegions(int estateID)
|
||||
{
|
||||
List<UUID> result = new List<UUID>();
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool DeleteEstate(int estateID)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#region IEstateDataStore Members
|
||||
|
||||
|
||||
public List<int> GetEstatesByOwner(UUID ownerID)
|
||||
{
|
||||
return new List<int>();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -38,6 +38,15 @@ namespace OpenSim.Data.Null
|
|||
/// </summary>
|
||||
public class NullSimulationData : ISimulationDataStore
|
||||
{
|
||||
public NullSimulationData()
|
||||
{
|
||||
}
|
||||
|
||||
public NullSimulationData(string connectionString)
|
||||
{
|
||||
Initialise(connectionString);
|
||||
}
|
||||
|
||||
public void Initialise(string dbfile)
|
||||
{
|
||||
return;
|
||||
|
@ -85,12 +94,20 @@ namespace OpenSim.Data.Null
|
|||
return new List<SceneObjectGroup>();
|
||||
}
|
||||
|
||||
Dictionary<UUID, double[,]> m_terrains = new Dictionary<UUID, double[,]>();
|
||||
public void StoreTerrain(double[,] ter, UUID regionID)
|
||||
{
|
||||
if (m_terrains.ContainsKey(regionID))
|
||||
m_terrains.Remove(regionID);
|
||||
m_terrains.Add(regionID, ter);
|
||||
}
|
||||
|
||||
public double[,] LoadTerrain(UUID regionID)
|
||||
{
|
||||
if (m_terrains.ContainsKey(regionID))
|
||||
{
|
||||
return m_terrains[regionID];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,9 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Data;
|
||||
|
@ -36,12 +39,17 @@ namespace OpenSim.Data.Null
|
|||
{
|
||||
public class NullUserAccountData : IUserAccountData
|
||||
{
|
||||
private static Dictionary<UUID, UserAccountData> m_DataByUUID = new Dictionary<UUID, UserAccountData>();
|
||||
private static Dictionary<string, UserAccountData> m_DataByName = new Dictionary<string, UserAccountData>();
|
||||
private static Dictionary<string, UserAccountData> m_DataByEmail = new Dictionary<string, UserAccountData>();
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private Dictionary<UUID, UserAccountData> m_DataByUUID = new Dictionary<UUID, UserAccountData>();
|
||||
private Dictionary<string, UserAccountData> m_DataByName = new Dictionary<string, UserAccountData>();
|
||||
private Dictionary<string, UserAccountData> m_DataByEmail = new Dictionary<string, UserAccountData>();
|
||||
|
||||
public NullUserAccountData(string connectionString, string realm)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[NULL USER ACCOUNT DATA]: Initializing new NullUserAccountData with connectionString [{0}], realm [{1}]",
|
||||
// connectionString, realm);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -54,6 +62,15 @@ namespace OpenSim.Data.Null
|
|||
/// <returns></returns>
|
||||
public UserAccountData[] Get(string[] fields, string[] values)
|
||||
{
|
||||
// if (m_log.IsDebugEnabled)
|
||||
// {
|
||||
// m_log.DebugFormat(
|
||||
// "[NULL USER ACCOUNT DATA]: Called Get with fields [{0}], values [{1}]",
|
||||
// string.Join(", ", fields), string.Join(", ", values));
|
||||
// }
|
||||
|
||||
UserAccountData[] userAccounts = new UserAccountData[0];
|
||||
|
||||
List<string> fieldsLst = new List<string>(fields);
|
||||
if (fieldsLst.Contains("PrincipalID"))
|
||||
{
|
||||
|
@ -61,41 +78,61 @@ namespace OpenSim.Data.Null
|
|||
UUID id = UUID.Zero;
|
||||
if (UUID.TryParse(values[i], out id))
|
||||
if (m_DataByUUID.ContainsKey(id))
|
||||
return new UserAccountData[] { m_DataByUUID[id] };
|
||||
}
|
||||
if (fieldsLst.Contains("FirstName") && fieldsLst.Contains("LastName"))
|
||||
userAccounts = new UserAccountData[] { m_DataByUUID[id] };
|
||||
}
|
||||
else if (fieldsLst.Contains("FirstName") && fieldsLst.Contains("LastName"))
|
||||
{
|
||||
int findex = fieldsLst.IndexOf("FirstName");
|
||||
int lindex = fieldsLst.IndexOf("LastName");
|
||||
if (m_DataByName.ContainsKey(values[findex] + " " + values[lindex]))
|
||||
return new UserAccountData[] { m_DataByName[values[findex] + " " + values[lindex]] };
|
||||
}
|
||||
if (fieldsLst.Contains("Email"))
|
||||
{
|
||||
userAccounts = new UserAccountData[] { m_DataByName[values[findex] + " " + values[lindex]] };
|
||||
}
|
||||
}
|
||||
else if (fieldsLst.Contains("Email"))
|
||||
{
|
||||
int i = fieldsLst.IndexOf("Email");
|
||||
if (m_DataByEmail.ContainsKey(values[i]))
|
||||
return new UserAccountData[] { m_DataByEmail[values[i]] };
|
||||
userAccounts = new UserAccountData[] { m_DataByEmail[values[i]] };
|
||||
}
|
||||
|
||||
// Fail
|
||||
return new UserAccountData[0];
|
||||
|
||||
// if (m_log.IsDebugEnabled)
|
||||
// {
|
||||
// StringBuilder sb = new StringBuilder();
|
||||
// foreach (UserAccountData uad in userAccounts)
|
||||
// sb.AppendFormat("({0} {1} {2}) ", uad.FirstName, uad.LastName, uad.PrincipalID);
|
||||
//
|
||||
// m_log.DebugFormat(
|
||||
// "[NULL USER ACCOUNT DATA]: Returning {0} user accounts out of {1}: [{2}]", userAccounts.Length, m_DataByName.Count, sb);
|
||||
// }
|
||||
|
||||
return userAccounts;
|
||||
}
|
||||
|
||||
public bool Store(UserAccountData data)
|
||||
{
|
||||
if (data == null)
|
||||
return false;
|
||||
|
||||
|
||||
m_log.DebugFormat(
|
||||
"[NULL USER ACCOUNT DATA]: Storing user account {0} {1} {2} {3}",
|
||||
data.FirstName, data.LastName, data.PrincipalID, this.GetHashCode());
|
||||
|
||||
m_DataByUUID[data.PrincipalID] = data;
|
||||
m_DataByName[data.FirstName + " " + data.LastName] = data;
|
||||
if (data.Data.ContainsKey("Email") && data.Data["Email"] != null && data.Data["Email"] != string.Empty)
|
||||
m_DataByEmail[data.Data["Email"]] = data;
|
||||
|
||||
// m_log.DebugFormat("m_DataByUUID count is {0}, m_DataByName count is {1}", m_DataByUUID.Count, m_DataByName.Count);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public UserAccountData[] GetUsers(UUID scopeID, string query)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[NULL USER ACCOUNT DATA]: Called GetUsers with scope [{0}], query [{1}]", scopeID, query);
|
||||
|
||||
string[] words = query.Split(new char[] { ' ' });
|
||||
|
||||
for (int i = 0; i < words.Length; i++)
|
||||
|
|
|
@ -357,6 +357,17 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
return DoLoad(cmd, UUID.Zero, false);
|
||||
}
|
||||
|
||||
public List<EstateSettings> LoadEstateSettingsAll()
|
||||
{
|
||||
List<EstateSettings> estateSettings = new List<EstateSettings>();
|
||||
|
||||
List<int> estateIds = GetEstatesAll();
|
||||
foreach (int estateId in estateIds)
|
||||
estateSettings.Add(LoadEstateSettings(estateId));
|
||||
|
||||
return estateSettings;
|
||||
}
|
||||
|
||||
public List<int> GetEstates(string search)
|
||||
{
|
||||
|
@ -379,6 +390,49 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<int> GetEstatesAll()
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
|
||||
string sql = "select EstateID from estate_settings";
|
||||
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = sql;
|
||||
|
||||
IDataReader r = cmd.ExecuteReader();
|
||||
|
||||
while (r.Read())
|
||||
{
|
||||
result.Add(Convert.ToInt32(r["EstateID"]));
|
||||
}
|
||||
r.Close();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<int> GetEstatesByOwner(UUID ownerID)
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
|
||||
string sql = "select EstateID from estate_settings where estate_settings.EstateOwner = :EstateOwner";
|
||||
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = sql;
|
||||
cmd.Parameters.AddWithValue(":EstateOwner", ownerID);
|
||||
|
||||
IDataReader r = cmd.ExecuteReader();
|
||||
|
||||
while (r.Read())
|
||||
{
|
||||
result.Add(Convert.ToInt32(r["EstateID"]));
|
||||
}
|
||||
r.Close();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool LinkRegion(UUID regionID, int estateID)
|
||||
{
|
||||
|
|
|
@ -1,65 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
|
||||
[assembly : AssemblyTitle("OpenSim.Data.SQLiteLegacy")]
|
||||
[assembly : AssemblyDescription("")]
|
||||
[assembly : AssemblyConfiguration("")]
|
||||
[assembly : AssemblyCompany("http://opensimulator.org")]
|
||||
[assembly : AssemblyProduct("OpenSim.Data.SQLiteLegacy")]
|
||||
[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")]
|
||||
[assembly : AssemblyTrademark("")]
|
||||
[assembly : AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
|
||||
[assembly : ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
|
||||
[assembly : Guid("6113d5ce-4547-49f4-9236-0dcc503457b1")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
|
||||
[assembly : AssemblyVersion("0.6.5.*")]
|
||||
[assembly : AssemblyFileVersion("0.6.5.0")]
|
|
@ -1,12 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
CREATE TABLE assets(
|
||||
UUID varchar(255) primary key,
|
||||
Name varchar(255),
|
||||
Description varchar(255),
|
||||
Type integer,
|
||||
InvType integer,
|
||||
Local integer,
|
||||
Temporary integer,
|
||||
Data blob);
|
||||
|
||||
COMMIT;
|
|
@ -1,18 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE auth (
|
||||
UUID char(36) NOT NULL,
|
||||
passwordHash char(32) NOT NULL default '',
|
||||
passwordSalt char(32) NOT NULL default '',
|
||||
webLoginKey varchar(255) NOT NULL default '',
|
||||
accountType VARCHAR(32) NOT NULL DEFAULT 'UserAccount',
|
||||
PRIMARY KEY (`UUID`)
|
||||
);
|
||||
|
||||
CREATE TABLE tokens (
|
||||
UUID char(36) NOT NULL,
|
||||
token varchar(255) NOT NULL,
|
||||
validity datetime NOT NULL
|
||||
);
|
||||
|
||||
COMMIT;
|
|
@ -1,9 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE Avatars (
|
||||
PrincipalID CHAR(36) NOT NULL,
|
||||
Name VARCHAR(32) NOT NULL,
|
||||
Value VARCHAR(255) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY(PrincipalID, Name));
|
||||
|
||||
COMMIT;
|
|
@ -1,10 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE `Friends` (
|
||||
`PrincipalID` CHAR(36) NOT NULL,
|
||||
`Friend` VARCHAR(255) NOT NULL,
|
||||
`Flags` VARCHAR(16) NOT NULL DEFAULT 0,
|
||||
`Offered` VARCHAR(32) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY(`PrincipalID`, `Friend`));
|
||||
|
||||
COMMIT;
|
|
@ -1,32 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE inventoryfolders(
|
||||
UUID varchar(255) primary key,
|
||||
name varchar(255),
|
||||
agentID varchar(255),
|
||||
parentID varchar(255),
|
||||
type integer,
|
||||
version integer);
|
||||
|
||||
CREATE TABLE inventoryitems(
|
||||
UUID varchar(255) primary key,
|
||||
assetID varchar(255),
|
||||
assetType integer,
|
||||
invType integer,
|
||||
parentFolderID varchar(255),
|
||||
avatarID varchar(255),
|
||||
creatorsID varchar(255),
|
||||
inventoryName varchar(255),
|
||||
inventoryDescription varchar(255),
|
||||
inventoryNextPermissions integer,
|
||||
inventoryCurrentPermissions integer,
|
||||
inventoryBasePermissions integer,
|
||||
inventoryEveryOnePermissions integer,
|
||||
salePrice integer default 99,
|
||||
saleType integer default 0,
|
||||
creationDate integer default 2000,
|
||||
groupID varchar(255) default '00000000-0000-0000-0000-000000000000',
|
||||
groupOwned integer default 0,
|
||||
flags integer default 0);
|
||||
|
||||
COMMIT;
|
|
@ -1,144 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE prims(
|
||||
UUID varchar(255) primary key,
|
||||
RegionUUID varchar(255),
|
||||
ParentID integer,
|
||||
CreationDate integer,
|
||||
Name varchar(255),
|
||||
SceneGroupID varchar(255),
|
||||
Text varchar(255),
|
||||
Description varchar(255),
|
||||
SitName varchar(255),
|
||||
TouchName varchar(255),
|
||||
CreatorID varchar(255),
|
||||
OwnerID varchar(255),
|
||||
GroupID varchar(255),
|
||||
LastOwnerID varchar(255),
|
||||
OwnerMask integer,
|
||||
NextOwnerMask integer,
|
||||
GroupMask integer,
|
||||
EveryoneMask integer,
|
||||
BaseMask integer,
|
||||
PositionX float,
|
||||
PositionY float,
|
||||
PositionZ float,
|
||||
GroupPositionX float,
|
||||
GroupPositionY float,
|
||||
GroupPositionZ float,
|
||||
VelocityX float,
|
||||
VelocityY float,
|
||||
VelocityZ float,
|
||||
AngularVelocityX float,
|
||||
AngularVelocityY float,
|
||||
AngularVelocityZ float,
|
||||
AccelerationX float,
|
||||
AccelerationY float,
|
||||
AccelerationZ float,
|
||||
RotationX float,
|
||||
RotationY float,
|
||||
RotationZ float,
|
||||
RotationW float,
|
||||
ObjectFlags integer,
|
||||
SitTargetOffsetX float NOT NULL default 0,
|
||||
SitTargetOffsetY float NOT NULL default 0,
|
||||
SitTargetOffsetZ float NOT NULL default 0,
|
||||
SitTargetOrientW float NOT NULL default 0,
|
||||
SitTargetOrientX float NOT NULL default 0,
|
||||
SitTargetOrientY float NOT NULL default 0,
|
||||
SitTargetOrientZ float NOT NULL default 0);
|
||||
|
||||
CREATE TABLE primshapes(
|
||||
UUID varchar(255) primary key,
|
||||
Shape integer,
|
||||
ScaleX float,
|
||||
ScaleY float,
|
||||
ScaleZ float,
|
||||
PCode integer,
|
||||
PathBegin integer,
|
||||
PathEnd integer,
|
||||
PathScaleX integer,
|
||||
PathScaleY integer,
|
||||
PathShearX integer,
|
||||
PathShearY integer,
|
||||
PathSkew integer,
|
||||
PathCurve integer,
|
||||
PathRadiusOffset integer,
|
||||
PathRevolutions integer,
|
||||
PathTaperX integer,
|
||||
PathTaperY integer,
|
||||
PathTwist integer,
|
||||
PathTwistBegin integer,
|
||||
ProfileBegin integer,
|
||||
ProfileEnd integer,
|
||||
ProfileCurve integer,
|
||||
ProfileHollow integer,
|
||||
Texture blob,
|
||||
ExtraParams blob,
|
||||
State Integer NOT NULL default 0);
|
||||
|
||||
CREATE TABLE primitems(
|
||||
itemID varchar(255) primary key,
|
||||
primID varchar(255),
|
||||
assetID varchar(255),
|
||||
parentFolderID varchar(255),
|
||||
invType integer,
|
||||
assetType integer,
|
||||
name varchar(255),
|
||||
description varchar(255),
|
||||
creationDate integer,
|
||||
creatorID varchar(255),
|
||||
ownerID varchar(255),
|
||||
lastOwnerID varchar(255),
|
||||
groupID varchar(255),
|
||||
nextPermissions string,
|
||||
currentPermissions string,
|
||||
basePermissions string,
|
||||
everyonePermissions string,
|
||||
groupPermissions string);
|
||||
|
||||
CREATE TABLE terrain(
|
||||
RegionUUID varchar(255),
|
||||
Revision integer,
|
||||
Heightfield blob);
|
||||
|
||||
CREATE TABLE land(
|
||||
UUID varchar(255) primary key,
|
||||
RegionUUID varchar(255),
|
||||
LocalLandID string,
|
||||
Bitmap blob,
|
||||
Name varchar(255),
|
||||
Desc varchar(255),
|
||||
OwnerUUID varchar(255),
|
||||
IsGroupOwned string,
|
||||
Area integer,
|
||||
AuctionID integer,
|
||||
Category integer,
|
||||
ClaimDate integer,
|
||||
ClaimPrice integer,
|
||||
GroupUUID varchar(255),
|
||||
SalePrice integer,
|
||||
LandStatus integer,
|
||||
LandFlags string,
|
||||
LandingType string,
|
||||
MediaAutoScale string,
|
||||
MediaTextureUUID varchar(255),
|
||||
MediaURL varchar(255),
|
||||
MusicURL varchar(255),
|
||||
PassHours float,
|
||||
PassPrice string,
|
||||
SnapshotUUID varchar(255),
|
||||
UserLocationX float,
|
||||
UserLocationY float,
|
||||
UserLocationZ float,
|
||||
UserLookAtX float,
|
||||
UserLookAtY float,
|
||||
UserLookAtZ float,
|
||||
AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000');
|
||||
|
||||
CREATE TABLE landaccesslist(
|
||||
LandUUID varchar(255),
|
||||
AccessUUID varchar(255),
|
||||
Flags string);
|
||||
|
||||
COMMIT;
|
|
@ -1,17 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
-- useraccounts table
|
||||
CREATE TABLE UserAccounts (
|
||||
PrincipalID CHAR(36) primary key,
|
||||
ScopeID CHAR(36) NOT NULL,
|
||||
FirstName VARCHAR(64) NOT NULL,
|
||||
LastName VARCHAR(64) NOT NULL,
|
||||
Email VARCHAR(64),
|
||||
ServiceURLs TEXT,
|
||||
Created INT(11),
|
||||
UserLevel integer NOT NULL DEFAULT 0,
|
||||
UserFlags integer NOT NULL DEFAULT 0,
|
||||
UserTitle varchar(64) NOT NULL DEFAULT ''
|
||||
);
|
||||
|
||||
COMMIT;
|
|
@ -1,39 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
-- users table
|
||||
CREATE TABLE users(
|
||||
UUID varchar(255) primary key,
|
||||
username varchar(255),
|
||||
surname varchar(255),
|
||||
passwordHash varchar(255),
|
||||
passwordSalt varchar(255),
|
||||
homeRegionX integer,
|
||||
homeRegionY integer,
|
||||
homeLocationX float,
|
||||
homeLocationY float,
|
||||
homeLocationZ float,
|
||||
homeLookAtX float,
|
||||
homeLookAtY float,
|
||||
homeLookAtZ float,
|
||||
created integer,
|
||||
lastLogin integer,
|
||||
rootInventoryFolderID varchar(255),
|
||||
userInventoryURI varchar(255),
|
||||
userAssetURI varchar(255),
|
||||
profileCanDoMask integer,
|
||||
profileWantDoMask integer,
|
||||
profileAboutText varchar(255),
|
||||
profileFirstText varchar(255),
|
||||
profileImage varchar(255),
|
||||
profileFirstImage varchar(255),
|
||||
webLoginKey text default '00000000-0000-0000-0000-000000000000');
|
||||
-- friends table
|
||||
CREATE TABLE userfriends(
|
||||
ownerID varchar(255),
|
||||
friendID varchar(255),
|
||||
friendPerms integer,
|
||||
ownerPerms integer,
|
||||
datetimestamp integer);
|
||||
|
||||
COMMIT;
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TEMPORARY TABLE assets_backup(UUID,Name,Description,Type,Local,Temporary,Data);
|
||||
INSERT INTO assets_backup SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets;
|
||||
DROP TABLE assets;
|
||||
CREATE TABLE assets(UUID,Name,Description,Type,Local,Temporary,Data);
|
||||
INSERT INTO assets SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets_backup;
|
||||
DROP TABLE assets_backup;
|
||||
|
||||
COMMIT;
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users;
|
||||
|
||||
COMMIT;
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
INSERT INTO `Friends` SELECT `ownerID`, `friendID`, `friendPerms`, 0 FROM `userfriends`;
|
||||
|
||||
COMMIT;
|
|
@ -1,8 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
create index inventoryfolders_agentid on inventoryfolders(agentid);
|
||||
create index inventoryfolders_parentid on inventoryfolders(parentid);
|
||||
create index inventoryitems_parentfolderid on inventoryitems(parentfolderid);
|
||||
create index inventoryitems_avatarid on inventoryitems(avatarid);
|
||||
|
||||
COMMIT;
|
|
@ -1,10 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE regionban(
|
||||
regionUUID varchar (255),
|
||||
bannedUUID varchar (255),
|
||||
bannedIp varchar (255),
|
||||
bannedIpHostMask varchar (255)
|
||||
);
|
||||
|
||||
COMMIT;
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, surname AS LastName, '' as Email, '' AS ServiceURLs, created as Created FROM users;
|
||||
|
||||
COMMIT;
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE users add homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000';
|
||||
|
||||
COMMIT;
|
|
@ -1 +0,0 @@
|
|||
DELETE FROM assets WHERE UUID = 'dc4b9f0bd00845c696a401dd947ac621'
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
alter table inventoryitems add column inventoryGroupPermissions integer unsigned not null default 0;
|
||||
|
||||
COMMIT;
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE primitems add flags integer not null default 0;
|
||||
|
||||
COMMIT;
|
|
@ -1,6 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE users add userFlags integer NOT NULL default 0;
|
||||
ALTER TABLE users add godLevel integer NOT NULL default 0;
|
||||
|
||||
COMMIT;
|
|
@ -1,7 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
update assets
|
||||
set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
|
||||
where UUID not like '%-%';
|
||||
|
||||
COMMIT;
|
|
@ -1,36 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
update inventoryitems
|
||||
set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
|
||||
where UUID not like '%-%';
|
||||
|
||||
update inventoryitems
|
||||
set assetID = substr(assetID, 1, 8) || "-" || substr(assetID, 9, 4) || "-" || substr(assetID, 13, 4) || "-" || substr(assetID, 17, 4) || "-" || substr(assetID, 21, 12)
|
||||
where assetID not like '%-%';
|
||||
|
||||
update inventoryitems
|
||||
set parentFolderID = substr(parentFolderID, 1, 8) || "-" || substr(parentFolderID, 9, 4) || "-" || substr(parentFolderID, 13, 4) || "-" || substr(parentFolderID, 17, 4) || "-" || substr(parentFolderID, 21, 12)
|
||||
where parentFolderID not like '%-%';
|
||||
|
||||
update inventoryitems
|
||||
set avatarID = substr(avatarID, 1, 8) || "-" || substr(avatarID, 9, 4) || "-" || substr(avatarID, 13, 4) || "-" || substr(avatarID, 17, 4) || "-" || substr(avatarID, 21, 12)
|
||||
where avatarID not like '%-%';
|
||||
|
||||
update inventoryitems
|
||||
set creatorsID = substr(creatorsID, 1, 8) || "-" || substr(creatorsID, 9, 4) || "-" || substr(creatorsID, 13, 4) || "-" || substr(creatorsID, 17, 4) || "-" || substr(creatorsID, 21, 12)
|
||||
where creatorsID not like '%-%';
|
||||
|
||||
|
||||
update inventoryfolders
|
||||
set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
|
||||
where UUID not like '%-%';
|
||||
|
||||
update inventoryfolders
|
||||
set agentID = substr(agentID, 1, 8) || "-" || substr(agentID, 9, 4) || "-" || substr(agentID, 13, 4) || "-" || substr(agentID, 17, 4) || "-" || substr(agentID, 21, 12)
|
||||
where agentID not like '%-%';
|
||||
|
||||
update inventoryfolders
|
||||
set parentID = substr(parentID, 1, 8) || "-" || substr(parentID, 9, 4) || "-" || substr(parentID, 13, 4) || "-" || substr(parentID, 17, 4) || "-" || substr(parentID, 21, 12)
|
||||
where parentID not like '%-%';
|
||||
|
||||
COMMIT;
|
|
@ -1,38 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
create table regionsettings (
|
||||
regionUUID char(36) not null,
|
||||
block_terraform integer not null,
|
||||
block_fly integer not null,
|
||||
allow_damage integer not null,
|
||||
restrict_pushing integer not null,
|
||||
allow_land_resell integer not null,
|
||||
allow_land_join_divide integer not null,
|
||||
block_show_in_search integer not null,
|
||||
agent_limit integer not null,
|
||||
object_bonus float not null,
|
||||
maturity integer not null,
|
||||
disable_scripts integer not null,
|
||||
disable_collisions integer not null,
|
||||
disable_physics integer not null,
|
||||
terrain_texture_1 char(36) not null,
|
||||
terrain_texture_2 char(36) not null,
|
||||
terrain_texture_3 char(36) not null,
|
||||
terrain_texture_4 char(36) not null,
|
||||
elevation_1_nw float not null,
|
||||
elevation_2_nw float not null,
|
||||
elevation_1_ne float not null,
|
||||
elevation_2_ne float not null,
|
||||
elevation_1_se float not null,
|
||||
elevation_2_se float not null,
|
||||
elevation_1_sw float not null,
|
||||
elevation_2_sw float not null,
|
||||
water_height float not null,
|
||||
terrain_raise_limit float not null,
|
||||
terrain_lower_limit float not null,
|
||||
use_estate_sun integer not null,
|
||||
fixed_sun integer not null,
|
||||
sun_position float not null,
|
||||
covenant char(36));
|
||||
|
||||
COMMIT;
|
|
@ -1,6 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE users add customType varchar(32) not null default '';
|
||||
ALTER TABLE users add partner char(36) not null default '00000000-0000-0000-0000-000000000000';
|
||||
|
||||
COMMIT;
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
delete from regionsettings;
|
||||
|
||||
COMMIT;
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
CREATE TABLE `avatarattachments` (`UUID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `attachpoint` int(11) NOT NULL DEFAULT 0, `item` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `asset` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000');
|
||||
|
||||
COMMIT;
|
|
@ -1,102 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE estate_groups (
|
||||
EstateID int(10) NOT NULL,
|
||||
uuid char(36) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE estate_managers (
|
||||
EstateID int(10) NOT NULL,
|
||||
uuid char(36) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE estate_map (
|
||||
RegionID char(36) NOT NULL default '00000000-0000-0000-0000-000000000000',
|
||||
EstateID int(11) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE estate_settings (
|
||||
EstateID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
EstateName varchar(64) default NULL,
|
||||
AbuseEmailToEstateOwner tinyint(4) NOT NULL,
|
||||
DenyAnonymous tinyint(4) NOT NULL,
|
||||
ResetHomeOnTeleport tinyint(4) NOT NULL,
|
||||
FixedSun tinyint(4) NOT NULL,
|
||||
DenyTransacted tinyint(4) NOT NULL,
|
||||
BlockDwell tinyint(4) NOT NULL,
|
||||
DenyIdentified tinyint(4) NOT NULL,
|
||||
AllowVoice tinyint(4) NOT NULL,
|
||||
UseGlobalTime tinyint(4) NOT NULL,
|
||||
PricePerMeter int(11) NOT NULL,
|
||||
TaxFree tinyint(4) NOT NULL,
|
||||
AllowDirectTeleport tinyint(4) NOT NULL,
|
||||
RedirectGridX int(11) NOT NULL,
|
||||
RedirectGridY int(11) NOT NULL,
|
||||
ParentEstateID int(10) NOT NULL,
|
||||
SunPosition double NOT NULL,
|
||||
EstateSkipScripts tinyint(4) NOT NULL,
|
||||
BillableFactor float NOT NULL,
|
||||
PublicAccess tinyint(4) NOT NULL
|
||||
);
|
||||
insert into estate_settings (EstateID,EstateName,AbuseEmailToEstateOwner,DenyAnonymous,ResetHomeOnTeleport,FixedSun,DenyTransacted,BlockDwell,DenyIdentified,AllowVoice,UseGlobalTime,PricePerMeter,TaxFree,AllowDirectTeleport,RedirectGridX,RedirectGridY,ParentEstateID,SunPosition,PublicAccess,EstateSkipScripts,BillableFactor) values ( 99, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
|
||||
delete from estate_settings;
|
||||
CREATE TABLE estate_users (
|
||||
EstateID int(10) NOT NULL,
|
||||
uuid char(36) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE estateban (
|
||||
EstateID int(10) NOT NULL,
|
||||
bannedUUID varchar(36) NOT NULL,
|
||||
bannedIp varchar(16) NOT NULL,
|
||||
bannedIpHostMask varchar(16) NOT NULL,
|
||||
bannedNameMask varchar(64) default NULL
|
||||
);
|
||||
|
||||
drop table regionsettings;
|
||||
CREATE TABLE regionsettings (
|
||||
regionUUID char(36) NOT NULL,
|
||||
block_terraform int(11) NOT NULL,
|
||||
block_fly int(11) NOT NULL,
|
||||
allow_damage int(11) NOT NULL,
|
||||
restrict_pushing int(11) NOT NULL,
|
||||
allow_land_resell int(11) NOT NULL,
|
||||
allow_land_join_divide int(11) NOT NULL,
|
||||
block_show_in_search int(11) NOT NULL,
|
||||
agent_limit int(11) NOT NULL,
|
||||
object_bonus float NOT NULL,
|
||||
maturity int(11) NOT NULL,
|
||||
disable_scripts int(11) NOT NULL,
|
||||
disable_collisions int(11) NOT NULL,
|
||||
disable_physics int(11) NOT NULL,
|
||||
terrain_texture_1 char(36) NOT NULL,
|
||||
terrain_texture_2 char(36) NOT NULL,
|
||||
terrain_texture_3 char(36) NOT NULL,
|
||||
terrain_texture_4 char(36) NOT NULL,
|
||||
elevation_1_nw float NOT NULL,
|
||||
elevation_2_nw float NOT NULL,
|
||||
elevation_1_ne float NOT NULL,
|
||||
elevation_2_ne float NOT NULL,
|
||||
elevation_1_se float NOT NULL,
|
||||
elevation_2_se float NOT NULL,
|
||||
elevation_1_sw float NOT NULL,
|
||||
elevation_2_sw float NOT NULL,
|
||||
water_height float NOT NULL,
|
||||
terrain_raise_limit float NOT NULL,
|
||||
terrain_lower_limit float NOT NULL,
|
||||
use_estate_sun int(11) NOT NULL,
|
||||
fixed_sun int(11) NOT NULL,
|
||||
sun_position float NOT NULL,
|
||||
covenant char(36) default NULL,
|
||||
Sandbox tinyint(4) NOT NULL,
|
||||
PRIMARY KEY (regionUUID)
|
||||
);
|
||||
|
||||
CREATE INDEX estate_ban_estate_id on estateban(EstateID);
|
||||
CREATE INDEX estate_groups_estate_id on estate_groups(EstateID);
|
||||
CREATE INDEX estate_managers_estate_id on estate_managers(EstateID);
|
||||
CREATE INDEX estate_map_estate_id on estate_map(EstateID);
|
||||
CREATE UNIQUE INDEX estate_map_region_id on estate_map(RegionID);
|
||||
CREATE INDEX estate_users_estate_id on estate_users(EstateID);
|
||||
|
||||
COMMIT;
|
|
@ -1,20 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
-- usersagents table
|
||||
CREATE TABLE IF NOT EXISTS useragents(
|
||||
UUID varchar(255) primary key,
|
||||
agentIP varchar(255),
|
||||
agentPort integer,
|
||||
agentOnline boolean,
|
||||
sessionID varchar(255),
|
||||
secureSessionID varchar(255),
|
||||
regionID varchar(255),
|
||||
loginTime integer,
|
||||
logoutTime integer,
|
||||
currentRegion varchar(255),
|
||||
currentHandle varchar(255),
|
||||
currentPosX float,
|
||||
currentPosY float,
|
||||
currentPosZ float);
|
||||
|
||||
COMMIT;
|
|
@ -1,8 +0,0 @@
|
|||
begin;
|
||||
|
||||
alter table estate_settings add column AbuseEmail varchar(255) not null default '';
|
||||
|
||||
alter table estate_settings add column EstateOwner varchar(36) not null default '';
|
||||
|
||||
commit;
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE useragents add currentLookAtX float not null default 128;
|
||||
ALTER TABLE useragents add currentLookAtY float not null default 128;
|
||||
ALTER TABLE useragents add currentLookAtZ float not null default 70;
|
||||
|
||||
COMMIT;
|
|
@ -1,6 +0,0 @@
|
|||
begin;
|
||||
|
||||
alter table estate_settings add column DenyMinors tinyint not null default 0;
|
||||
|
||||
commit;
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE users add email varchar(250);
|
||||
|
||||
COMMIT;
|
|
@ -1,8 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE prims ADD COLUMN ColorR integer not null default 0;
|
||||
ALTER TABLE prims ADD COLUMN ColorG integer not null default 0;
|
||||
ALTER TABLE prims ADD COLUMN ColorB integer not null default 0;
|
||||
ALTER TABLE prims ADD COLUMN ColorA integer not null default 0;
|
||||
|
||||
COMMIT;
|
|
@ -1,11 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
update users
|
||||
set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
|
||||
where UUID not like '%-%';
|
||||
|
||||
update useragents
|
||||
set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
|
||||
where UUID not like '%-%';
|
||||
|
||||
COMMIT;
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE prims ADD COLUMN ClickAction INTEGER NOT NULL default 0;
|
||||
|
||||
COMMIT;
|
|
@ -1,37 +0,0 @@
|
|||
BEGIN TRANSACTION;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS avatarappearance(
|
||||
Owner varchar(36) NOT NULL primary key,
|
||||
BodyItem varchar(36) DEFAULT NULL,
|
||||
BodyAsset varchar(36) DEFAULT NULL,
|
||||
SkinItem varchar(36) DEFAULT NULL,
|
||||
SkinAsset varchar(36) DEFAULT NULL,
|
||||
HairItem varchar(36) DEFAULT NULL,
|
||||
HairAsset varchar(36) DEFAULT NULL,
|
||||
EyesItem varchar(36) DEFAULT NULL,
|
||||
EyesAsset varchar(36) DEFAULT NULL,
|
||||
ShirtItem varchar(36) DEFAULT NULL,
|
||||
ShirtAsset varchar(36) DEFAULT NULL,
|
||||
PantsItem varchar(36) DEFAULT NULL,
|
||||
PantsAsset varchar(36) DEFAULT NULL,
|
||||
ShoesItem varchar(36) DEFAULT NULL,
|
||||
ShoesAsset varchar(36) DEFAULT NULL,
|
||||
SocksItem varchar(36) DEFAULT NULL,
|
||||
SocksAsset varchar(36) DEFAULT NULL,
|
||||
JacketItem varchar(36) DEFAULT NULL,
|
||||
JacketAsset varchar(36) DEFAULT NULL,
|
||||
GlovesItem varchar(36) DEFAULT NULL,
|
||||
GlovesAsset varchar(36) DEFAULT NULL,
|
||||
UnderShirtItem varchar(36) DEFAULT NULL,
|
||||
UnderShirtAsset varchar(36) DEFAULT NULL,
|
||||
UnderPantsItem varchar(36) DEFAULT NULL,
|
||||
UnderPantsAsset varchar(36) DEFAULT NULL,
|
||||
SkirtItem varchar(36) DEFAULT NULL,
|
||||
SkirtAsset varchar(36) DEFAULT NULL,
|
||||
Texture blob,
|
||||
VisualParams blob,
|
||||
Serial int DEFAULT NULL,
|
||||
AvatarHeight float DEFAULT NULL
|
||||
);
|
||||
|
||||
COMMIT;
|
|
@ -1,28 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE prims ADD COLUMN PayPrice INTEGER NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN PayButton1 INTEGER NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN PayButton2 INTEGER NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN PayButton3 INTEGER NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN PayButton4 INTEGER NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN LoopedSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000';
|
||||
ALTER TABLE prims ADD COLUMN LoopedSoundGain float NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN TextureAnimation string;
|
||||
ALTER TABLE prims ADD COLUMN ParticleSystem string;
|
||||
ALTER TABLE prims ADD COLUMN OmegaX float NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN OmegaY float NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN OmegaZ float NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN CameraAtOffsetX float NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN CameraAtOffsetY float NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN ForceMouselook string NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN ScriptAccessPin INTEGER NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN AllowedDrop INTEGER NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN DieAtEdge string NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN SalePrice INTEGER NOT NULL default 0;
|
||||
ALTER TABLE prims ADD COLUMN SaleType string NOT NULL default 0;
|
||||
|
||||
COMMIT;
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE prims ADD COLUMN Material INTEGER NOT NULL default 3;
|
||||
|
||||
COMMIT;
|
|
@ -1,6 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE land ADD COLUMN OtherCleanTime INTEGER NOT NULL default 0;
|
||||
ALTER TABLE land ADD COLUMN Dwell INTEGER NOT NULL default 0;
|
||||
|
||||
COMMIT;
|
|
@ -1,8 +0,0 @@
|
|||
begin;
|
||||
|
||||
ALTER TABLE regionsettings ADD COLUMN sunvectorx double NOT NULL default 0;
|
||||
ALTER TABLE regionsettings ADD COLUMN sunvectory double NOT NULL default 0;
|
||||
ALTER TABLE regionsettings ADD COLUMN sunvectorz double NOT NULL default 0;
|
||||
|
||||
commit;
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE prims ADD COLUMN CollisionSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000';
|
||||
ALTER TABLE prims ADD COLUMN CollisionSoundVolume float NOT NULL default 0;
|
||||
|
||||
COMMIT;
|
|
@ -1,5 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
ALTER TABLE prims ADD COLUMN VolumeDetect INTEGER NOT NULL DEFAULT 0;
|
||||
|
||||
COMMIT;
|
|
@ -1,8 +0,0 @@
|
|||
BEGIN;
|
||||
CREATE TEMPORARY TABLE prims_backup(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect);
|
||||
INSERT INTO prims_backup SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims;
|
||||
DROP TABLE prims;
|
||||
CREATE TABLE prims(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect);
|
||||
INSERT INTO prims SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims_backup;
|
||||
DROP TABLE prims_backup;
|
||||
COMMIT;
|
|
@ -1,79 +0,0 @@
|
|||
BEGIN;
|
||||
|
||||
update terrain
|
||||
set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12)
|
||||
where RegionUUID not like '%-%';
|
||||
|
||||
|
||||
update landaccesslist
|
||||
set LandUUID = substr(LandUUID, 1, 8) || "-" || substr(LandUUID, 9, 4) || "-" || substr(LandUUID, 13, 4) || "-" || substr(LandUUID, 17, 4) || "-" || substr(LandUUID, 21, 12)
|
||||
where LandUUID not like '%-%';
|
||||
|
||||
update landaccesslist
|
||||
set AccessUUID = substr(AccessUUID, 1, 8) || "-" || substr(AccessUUID, 9, 4) || "-" || substr(AccessUUID, 13, 4) || "-" || substr(AccessUUID, 17, 4) || "-" || substr(AccessUUID, 21, 12)
|
||||
where AccessUUID not like '%-%';
|
||||
|
||||
|
||||
update prims
|
||||
set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
|
||||
where UUID not like '%-%';
|
||||
|
||||
update prims
|
||||
set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12)
|
||||
where RegionUUID not like '%-%';
|
||||
|
||||
update prims
|
||||
set SceneGroupID = substr(SceneGroupID, 1, 8) || "-" || substr(SceneGroupID, 9, 4) || "-" || substr(SceneGroupID, 13, 4) || "-" || substr(SceneGroupID, 17, 4) || "-" || substr(SceneGroupID, 21, 12)
|
||||
where SceneGroupID not like '%-%';
|
||||
|
||||
update prims
|
||||
set CreatorID = substr(CreatorID, 1, 8) || "-" || substr(CreatorID, 9, 4) || "-" || substr(CreatorID, 13, 4) || "-" || substr(CreatorID, 17, 4) || "-" || substr(CreatorID, 21, 12)
|
||||
where CreatorID not like '%-%';
|
||||
|
||||
update prims
|
||||
set OwnerID = substr(OwnerID, 1, 8) || "-" || substr(OwnerID, 9, 4) || "-" || substr(OwnerID, 13, 4) || "-" || substr(OwnerID, 17, 4) || "-" || substr(OwnerID, 21, 12)
|
||||
where OwnerID not like '%-%';
|
||||
|
||||
update prims
|
||||
set GroupID = substr(GroupID, 1, 8) || "-" || substr(GroupID, 9, 4) || "-" || substr(GroupID, 13, 4) || "-" || substr(GroupID, 17, 4) || "-" || substr(GroupID, 21, 12)
|
||||
where GroupID not like '%-%';
|
||||
|
||||
update prims
|
||||
set LastOwnerID = substr(LastOwnerID, 1, 8) || "-" || substr(LastOwnerID, 9, 4) || "-" || substr(LastOwnerID, 13, 4) || "-" || substr(LastOwnerID, 17, 4) || "-" || substr(LastOwnerID, 21, 12)
|
||||
where LastOwnerID not like '%-%';
|
||||
|
||||
|
||||
update primshapes
|
||||
set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
|
||||
where UUID not like '%-%';
|
||||
|
||||
|
||||
update land
|
||||
set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
|
||||
where UUID not like '%-%';
|
||||
|
||||
update land
|
||||
set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12)
|
||||
where RegionUUID not like '%-%';
|
||||
|
||||
update land
|
||||
set OwnerUUID = substr(OwnerUUID, 1, 8) || "-" || substr(OwnerUUID, 9, 4) || "-" || substr(OwnerUUID, 13, 4) || "-" || substr(OwnerUUID, 17, 4) || "-" || substr(OwnerUUID, 21, 12)
|
||||
where OwnerUUID not like '%-%';
|
||||
|
||||
update land
|
||||
set GroupUUID = substr(GroupUUID, 1, 8) || "-" || substr(GroupUUID, 9, 4) || "-" || substr(GroupUUID, 13, 4) || "-" || substr(GroupUUID, 17, 4) || "-" || substr(GroupUUID, 21, 12)
|
||||
where GroupUUID not like '%-%';
|
||||
|
||||
update land
|
||||
set MediaTextureUUID = substr(MediaTextureUUID, 1, 8) || "-" || substr(MediaTextureUUID, 9, 4) || "-" || substr(MediaTextureUUID, 13, 4) || "-" || substr(MediaTextureUUID, 17, 4) || "-" || substr(MediaTextureUUID, 21, 12)
|
||||
where MediaTextureUUID not like '%-%';
|
||||
|
||||
update land
|
||||
set SnapshotUUID = substr(SnapshotUUID, 1, 8) || "-" || substr(SnapshotUUID, 9, 4) || "-" || substr(SnapshotUUID, 13, 4) || "-" || substr(SnapshotUUID, 17, 4) || "-" || substr(SnapshotUUID, 21, 12)
|
||||
where SnapshotUUID not like '%-%';
|
||||
|
||||
update land
|
||||
set AuthbuyerID = substr(AuthbuyerID, 1, 8) || "-" || substr(AuthbuyerID, 9, 4) || "-" || substr(AuthbuyerID, 13, 4) || "-" || substr(AuthbuyerID, 17, 4) || "-" || substr(AuthbuyerID, 21, 12)
|
||||
where AuthbuyerID not like '%-%';
|
||||
|
||||
COMMIT;
|
|
@ -1,20 +0,0 @@
|
|||
<Addin id="OpenSim.Data.SQLite" version="0.1">
|
||||
<Runtime>
|
||||
<Import assembly="OpenSim.Data.SQLite.dll"/>
|
||||
</Runtime>
|
||||
<Dependencies>
|
||||
<Addin id="OpenSim.Data" version="0.5" />
|
||||
</Dependencies>
|
||||
<Extension path = "/OpenSim/GridData">
|
||||
<Plugin id="SQLiteGridData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteGridData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/AssetData">
|
||||
<Plugin id="SQLiteAssetData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteAssetData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/InventoryData">
|
||||
<Plugin id="SQLiteInventoryData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteInventoryStore" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/UserData">
|
||||
<Plugin id="SQLiteUserData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteUserData" />
|
||||
</Extension>
|
||||
</Addin>
|
|
@ -1,347 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using System.Collections.Generic;
|
||||
using log4net;
|
||||
using Mono.Data.SqliteClient;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
{
|
||||
/// <summary>
|
||||
/// An asset storage interface for the SQLite database system
|
||||
/// </summary>
|
||||
public class SQLiteAssetData : AssetDataBase
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private const string SelectAssetSQL = "select * from assets where UUID=:UUID";
|
||||
private const string SelectAssetMetadataSQL = "select Name, Description, Type, Temporary, UUID from assets limit :start, :count";
|
||||
private const string DeleteAssetSQL = "delete from assets where UUID=:UUID";
|
||||
private const string InsertAssetSQL = "insert into assets(UUID, Name, Description, Type, Local, Temporary, Data) values(:UUID, :Name, :Description, :Type, :Local, :Temporary, :Data)";
|
||||
private const string UpdateAssetSQL = "update assets set Name=:Name, Description=:Description, Type=:Type, Local=:Local, Temporary=:Temporary, Data=:Data where UUID=:UUID";
|
||||
private const string assetSelect = "select * from assets";
|
||||
|
||||
private SqliteConnection m_conn;
|
||||
|
||||
override public void Dispose()
|
||||
{
|
||||
if (m_conn != null)
|
||||
{
|
||||
m_conn.Close();
|
||||
m_conn = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <list type="bullet">
|
||||
/// <item>Initialises AssetData interface</item>
|
||||
/// <item>Loads and initialises a new SQLite connection and maintains it.</item>
|
||||
/// <item>use default URI if connect string is empty.</item>
|
||||
/// </list>
|
||||
/// </summary>
|
||||
/// <param name="dbconnect">connect string</param>
|
||||
override public void Initialise(string dbconnect)
|
||||
{
|
||||
if (dbconnect == string.Empty)
|
||||
{
|
||||
dbconnect = "URI=file:Asset.db,version=3";
|
||||
}
|
||||
m_conn = new SqliteConnection(dbconnect);
|
||||
m_conn.Open();
|
||||
|
||||
Assembly assem = GetType().Assembly;
|
||||
Migration m = new Migration(m_conn, assem, "AssetStore");
|
||||
m.Update();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fetch Asset
|
||||
/// </summary>
|
||||
/// <param name="uuid">UUID of ... ?</param>
|
||||
/// <returns>Asset base</returns>
|
||||
override public AssetBase GetAsset(UUID uuid)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
using (SqliteCommand cmd = new SqliteCommand(SelectAssetSQL, m_conn))
|
||||
{
|
||||
cmd.Parameters.Add(new SqliteParameter(":UUID", uuid.ToString()));
|
||||
using (IDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
AssetBase asset = buildAsset(reader);
|
||||
reader.Close();
|
||||
return asset;
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.Close();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an asset
|
||||
/// </summary>
|
||||
/// <param name="asset">Asset Base</param>
|
||||
override public void StoreAsset(AssetBase asset)
|
||||
{
|
||||
//m_log.Info("[ASSET DB]: Creating Asset " + asset.FullID.ToString());
|
||||
if (ExistsAsset(asset.FullID))
|
||||
{
|
||||
//LogAssetLoad(asset);
|
||||
|
||||
lock (this)
|
||||
{
|
||||
using (SqliteCommand cmd = new SqliteCommand(UpdateAssetSQL, m_conn))
|
||||
{
|
||||
cmd.Parameters.Add(new SqliteParameter(":UUID", asset.FullID.ToString()));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Name", asset.Name));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Description", asset.Description));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Type", asset.Type));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Local", asset.Local));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Temporary", asset.Temporary));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Data", asset.Data));
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
using (SqliteCommand cmd = new SqliteCommand(InsertAssetSQL, m_conn))
|
||||
{
|
||||
cmd.Parameters.Add(new SqliteParameter(":UUID", asset.FullID.ToString()));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Name", asset.Name));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Description", asset.Description));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Type", asset.Type));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Local", asset.Local));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Temporary", asset.Temporary));
|
||||
cmd.Parameters.Add(new SqliteParameter(":Data", asset.Data));
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// /// <summary>
|
||||
// /// Some... logging functionnality
|
||||
// /// </summary>
|
||||
// /// <param name="asset"></param>
|
||||
// private static void LogAssetLoad(AssetBase asset)
|
||||
// {
|
||||
// string temporary = asset.Temporary ? "Temporary" : "Stored";
|
||||
// string local = asset.Local ? "Local" : "Remote";
|
||||
//
|
||||
// int assetLength = (asset.Data != null) ? asset.Data.Length : 0;
|
||||
//
|
||||
// m_log.Debug("[ASSET DB]: " +
|
||||
// string.Format("Loaded {5} {4} Asset: [{0}][{3}] \"{1}\":{2} ({6} bytes)",
|
||||
// asset.FullID, asset.Name, asset.Description, asset.Type,
|
||||
// temporary, local, assetLength));
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// Check if an asset exist in database
|
||||
/// </summary>
|
||||
/// <param name="uuid">The asset UUID</param>
|
||||
/// <returns>True if exist, or false.</returns>
|
||||
override public bool ExistsAsset(UUID uuid)
|
||||
{
|
||||
lock (this) {
|
||||
using (SqliteCommand cmd = new SqliteCommand(SelectAssetSQL, m_conn))
|
||||
{
|
||||
cmd.Parameters.Add(new SqliteParameter(":UUID", uuid.ToString()));
|
||||
using (IDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
reader.Close();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.Close();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete an asset from database
|
||||
/// </summary>
|
||||
/// <param name="uuid"></param>
|
||||
public void DeleteAsset(UUID uuid)
|
||||
{
|
||||
using (SqliteCommand cmd = new SqliteCommand(DeleteAssetSQL, m_conn))
|
||||
{
|
||||
cmd.Parameters.Add(new SqliteParameter(":UUID", uuid.ToString()));
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="row"></param>
|
||||
/// <returns></returns>
|
||||
private static AssetBase buildAsset(IDataReader row)
|
||||
{
|
||||
// TODO: this doesn't work yet because something more
|
||||
// interesting has to be done to actually get these values
|
||||
// back out. Not enough time to figure it out yet.
|
||||
AssetBase asset = new AssetBase(
|
||||
new UUID((String)row["UUID"]),
|
||||
(String)row["Name"],
|
||||
Convert.ToSByte(row["Type"]),
|
||||
UUID.Zero.ToString()
|
||||
);
|
||||
|
||||
asset.Description = (String) row["Description"];
|
||||
asset.Local = Convert.ToBoolean(row["Local"]);
|
||||
asset.Temporary = Convert.ToBoolean(row["Temporary"]);
|
||||
asset.Data = (byte[]) row["Data"];
|
||||
return asset;
|
||||
}
|
||||
|
||||
private static AssetMetadata buildAssetMetadata(IDataReader row)
|
||||
{
|
||||
AssetMetadata metadata = new AssetMetadata();
|
||||
|
||||
metadata.FullID = new UUID((string) row["UUID"]);
|
||||
metadata.Name = (string) row["Name"];
|
||||
metadata.Description = (string) row["Description"];
|
||||
metadata.Type = Convert.ToSByte(row["Type"]);
|
||||
metadata.Temporary = Convert.ToBoolean(row["Temporary"]); // Not sure if this is correct.
|
||||
|
||||
// Current SHA1s are not stored/computed.
|
||||
metadata.SHA1 = new byte[] {};
|
||||
|
||||
return metadata;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of AssetMetadata objects. The list is a subset of
|
||||
/// the entire data set offset by <paramref name="start" /> containing
|
||||
/// <paramref name="count" /> elements.
|
||||
/// </summary>
|
||||
/// <param name="start">The number of results to discard from the total data set.</param>
|
||||
/// <param name="count">The number of rows the returned list should contain.</param>
|
||||
/// <returns>A list of AssetMetadata objects.</returns>
|
||||
public override List<AssetMetadata> FetchAssetMetadataSet(int start, int count)
|
||||
{
|
||||
List<AssetMetadata> retList = new List<AssetMetadata>(count);
|
||||
|
||||
lock (this)
|
||||
{
|
||||
using (SqliteCommand cmd = new SqliteCommand(SelectAssetMetadataSQL, m_conn))
|
||||
{
|
||||
cmd.Parameters.Add(new SqliteParameter(":start", start));
|
||||
cmd.Parameters.Add(new SqliteParameter(":count", count));
|
||||
|
||||
using (IDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
AssetMetadata metadata = buildAssetMetadata(reader);
|
||||
retList.Add(metadata);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return retList;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Database Binding functions
|
||||
*
|
||||
* These will be db specific due to typing, and minor differences
|
||||
* in databases.
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
#region IPlugin interface
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
override public string Version
|
||||
{
|
||||
get
|
||||
{
|
||||
Module module = GetType().Module;
|
||||
// string dllName = module.Assembly.ManifestModule.Name;
|
||||
Version dllVersion = module.Assembly.GetName().Version;
|
||||
|
||||
return
|
||||
string.Format("{0}.{1}.{2}.{3}", dllVersion.Major, dllVersion.Minor, dllVersion.Build,
|
||||
dllVersion.Revision);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initialise the AssetData interface using default URI
|
||||
/// </summary>
|
||||
override public void Initialise()
|
||||
{
|
||||
Initialise("URI=file:Asset.db,version=3");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Name of this DB provider
|
||||
/// </summary>
|
||||
override public string Name
|
||||
{
|
||||
get { return "SQLite Asset storage engine"; }
|
||||
}
|
||||
|
||||
public override bool Delete(string id)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -1,266 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using Mono.Data.SqliteClient;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
{
|
||||
public class SQLiteAuthenticationData : SQLiteFramework, IAuthenticationData
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private string m_Realm;
|
||||
private List<string> m_ColumnNames;
|
||||
private int m_LastExpire;
|
||||
private string m_connectionString;
|
||||
|
||||
protected static SqliteConnection m_Connection;
|
||||
private static bool m_initialized = false;
|
||||
|
||||
public SQLiteAuthenticationData(string connectionString, string realm)
|
||||
: base(connectionString)
|
||||
{
|
||||
m_Realm = realm;
|
||||
m_connectionString = connectionString;
|
||||
|
||||
if (!m_initialized)
|
||||
{
|
||||
m_Connection = new SqliteConnection(connectionString);
|
||||
m_Connection.Open();
|
||||
|
||||
using (SqliteConnection dbcon = (SqliteConnection)((ICloneable)m_Connection).Clone())
|
||||
{
|
||||
dbcon.Open();
|
||||
Migration m = new Migration(dbcon, GetType().Assembly, "AuthStore");
|
||||
m.Update();
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
m_initialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
public AuthenticationData Get(UUID principalID)
|
||||
{
|
||||
AuthenticationData ret = new AuthenticationData();
|
||||
ret.Data = new Dictionary<string, object>();
|
||||
|
||||
SqliteCommand cmd = new SqliteCommand("select * from `" + m_Realm + "` where UUID = :PrincipalID");
|
||||
cmd.Parameters.Add(new SqliteParameter(":PrincipalID", principalID.ToString()));
|
||||
|
||||
IDataReader result = ExecuteReader(cmd, m_Connection);
|
||||
|
||||
try
|
||||
{
|
||||
if (result.Read())
|
||||
{
|
||||
ret.PrincipalID = principalID;
|
||||
|
||||
if (m_ColumnNames == null)
|
||||
{
|
||||
m_ColumnNames = new List<string>();
|
||||
|
||||
DataTable schemaTable = result.GetSchemaTable();
|
||||
foreach (DataRow row in schemaTable.Rows)
|
||||
m_ColumnNames.Add(row["ColumnName"].ToString());
|
||||
}
|
||||
|
||||
foreach (string s in m_ColumnNames)
|
||||
{
|
||||
if (s == "UUID")
|
||||
continue;
|
||||
|
||||
ret.Data[s] = result[s].ToString();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
finally
|
||||
{
|
||||
CloseCommand(cmd);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public bool Store(AuthenticationData data)
|
||||
{
|
||||
if (data.Data.ContainsKey("UUID"))
|
||||
data.Data.Remove("UUID");
|
||||
|
||||
string[] fields = new List<string>(data.Data.Keys).ToArray();
|
||||
string[] values = new string[data.Data.Count];
|
||||
int i = 0;
|
||||
foreach (object o in data.Data.Values)
|
||||
values[i++] = o.ToString();
|
||||
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
if (Get(data.PrincipalID) != null)
|
||||
{
|
||||
|
||||
|
||||
string update = "update `" + m_Realm + "` set ";
|
||||
bool first = true;
|
||||
foreach (string field in fields)
|
||||
{
|
||||
if (!first)
|
||||
update += ", ";
|
||||
update += "`" + field + "` = :" + field;
|
||||
cmd.Parameters.Add(new SqliteParameter(":" + field, data.Data[field]));
|
||||
|
||||
first = false;
|
||||
}
|
||||
|
||||
update += " where UUID = :UUID";
|
||||
cmd.Parameters.Add(new SqliteParameter(":UUID", data.PrincipalID.ToString()));
|
||||
|
||||
cmd.CommandText = update;
|
||||
try
|
||||
{
|
||||
if (ExecuteNonQuery(cmd, m_Connection) < 1)
|
||||
{
|
||||
CloseCommand(cmd);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[SQLITE]: Exception storing authentication data", e);
|
||||
CloseCommand(cmd);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
string insert = "insert into `" + m_Realm + "` (`UUID`, `" +
|
||||
String.Join("`, `", fields) +
|
||||
"`) values (:UUID, :" + String.Join(", :", fields) + ")";
|
||||
|
||||
cmd.Parameters.Add(new SqliteParameter(":UUID", data.PrincipalID.ToString()));
|
||||
foreach (string field in fields)
|
||||
cmd.Parameters.Add(new SqliteParameter(":" + field, data.Data[field]));
|
||||
|
||||
cmd.CommandText = insert;
|
||||
|
||||
try
|
||||
{
|
||||
if (ExecuteNonQuery(cmd, m_Connection) < 1)
|
||||
{
|
||||
CloseCommand(cmd);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.ToString());
|
||||
CloseCommand(cmd);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
CloseCommand(cmd);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool SetDataItem(UUID principalID, string item, string value)
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand("update `" + m_Realm +
|
||||
"` set `" + item + "` = " + value + " where UUID = '" + principalID.ToString() + "'");
|
||||
|
||||
if (ExecuteNonQuery(cmd, m_Connection) > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool SetToken(UUID principalID, string token, int lifetime)
|
||||
{
|
||||
if (System.Environment.TickCount - m_LastExpire > 30000)
|
||||
DoExpire();
|
||||
|
||||
SqliteCommand cmd = new SqliteCommand("insert into tokens (UUID, token, validity) values ('" + principalID.ToString() +
|
||||
"', '" + token + "', datetime('now', 'localtime', '+" + lifetime.ToString() + " minutes'))");
|
||||
|
||||
if (ExecuteNonQuery(cmd, m_Connection) > 0)
|
||||
{
|
||||
cmd.Dispose();
|
||||
return true;
|
||||
}
|
||||
|
||||
cmd.Dispose();
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool CheckToken(UUID principalID, string token, int lifetime)
|
||||
{
|
||||
if (System.Environment.TickCount - m_LastExpire > 30000)
|
||||
DoExpire();
|
||||
|
||||
SqliteCommand cmd = new SqliteCommand("update tokens set validity = datetime('now', 'localtime', '+" + lifetime.ToString() +
|
||||
" minutes') where UUID = '" + principalID.ToString() + "' and token = '" + token + "' and validity > datetime('now', 'localtime')");
|
||||
|
||||
if (ExecuteNonQuery(cmd, m_Connection) > 0)
|
||||
{
|
||||
cmd.Dispose();
|
||||
return true;
|
||||
}
|
||||
|
||||
cmd.Dispose();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void DoExpire()
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand("delete from tokens where validity < datetime('now', 'localtime')");
|
||||
ExecuteNonQuery(cmd, m_Connection);
|
||||
|
||||
cmd.Dispose();
|
||||
|
||||
m_LastExpire = System.Environment.TickCount;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,396 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using Mono.Data.SqliteClient;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
{
|
||||
public class SQLiteEstateStore : IEstateDataStore
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private SqliteConnection m_connection;
|
||||
private string m_connectionString;
|
||||
|
||||
private FieldInfo[] m_Fields;
|
||||
private Dictionary<string, FieldInfo> m_FieldMap =
|
||||
new Dictionary<string, FieldInfo>();
|
||||
|
||||
public SQLiteEstateStore()
|
||||
{
|
||||
}
|
||||
|
||||
public SQLiteEstateStore(string connectionString)
|
||||
{
|
||||
Initialise(connectionString);
|
||||
}
|
||||
|
||||
public void Initialise(string connectionString)
|
||||
{
|
||||
m_connectionString = connectionString;
|
||||
|
||||
m_log.Info("[ESTATE DB]: Sqlite - connecting: "+m_connectionString);
|
||||
|
||||
m_connection = new SqliteConnection(m_connectionString);
|
||||
m_connection.Open();
|
||||
|
||||
Assembly assem = GetType().Assembly;
|
||||
Migration m = new Migration(m_connection, assem, "EstateStore");
|
||||
m.Update();
|
||||
|
||||
m_connection.Close();
|
||||
m_connection.Open();
|
||||
|
||||
Type t = typeof(EstateSettings);
|
||||
m_Fields = t.GetFields(BindingFlags.NonPublic |
|
||||
BindingFlags.Instance |
|
||||
BindingFlags.DeclaredOnly);
|
||||
|
||||
foreach (FieldInfo f in m_Fields)
|
||||
if (f.Name.Substring(0, 2) == "m_")
|
||||
m_FieldMap[f.Name.Substring(2)] = f;
|
||||
}
|
||||
|
||||
private string[] FieldList
|
||||
{
|
||||
get { return new List<string>(m_FieldMap.Keys).ToArray(); }
|
||||
}
|
||||
|
||||
public EstateSettings LoadEstateSettings(UUID regionID, bool create)
|
||||
{
|
||||
string sql = "select estate_settings."+String.Join(",estate_settings.", FieldList)+" from estate_map left join estate_settings on estate_map.EstateID = estate_settings.EstateID where estate_settings.EstateID is not null and RegionID = :RegionID";
|
||||
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = sql;
|
||||
cmd.Parameters.Add(":RegionID", regionID.ToString());
|
||||
|
||||
return DoLoad(cmd, regionID, create);
|
||||
}
|
||||
|
||||
private EstateSettings DoLoad(SqliteCommand cmd, UUID regionID, bool create)
|
||||
{
|
||||
EstateSettings es = new EstateSettings();
|
||||
es.OnSave += StoreEstateSettings;
|
||||
|
||||
IDataReader r = cmd.ExecuteReader();
|
||||
|
||||
if (r.Read())
|
||||
{
|
||||
foreach (string name in FieldList)
|
||||
{
|
||||
if (m_FieldMap[name].GetValue(es) is bool)
|
||||
{
|
||||
int v = Convert.ToInt32(r[name]);
|
||||
if (v != 0)
|
||||
m_FieldMap[name].SetValue(es, true);
|
||||
else
|
||||
m_FieldMap[name].SetValue(es, false);
|
||||
}
|
||||
else if (m_FieldMap[name].GetValue(es) is UUID)
|
||||
{
|
||||
UUID uuid = UUID.Zero;
|
||||
|
||||
UUID.TryParse(r[name].ToString(), out uuid);
|
||||
m_FieldMap[name].SetValue(es, uuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_FieldMap[name].SetValue(es, Convert.ChangeType(r[name], m_FieldMap[name].FieldType));
|
||||
}
|
||||
}
|
||||
r.Close();
|
||||
}
|
||||
else if (create)
|
||||
{
|
||||
r.Close();
|
||||
|
||||
List<string> names = new List<string>(FieldList);
|
||||
|
||||
names.Remove("EstateID");
|
||||
|
||||
string sql = "insert into estate_settings ("+String.Join(",", names.ToArray())+") values ( :"+String.Join(", :", names.ToArray())+")";
|
||||
|
||||
cmd.CommandText = sql;
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
foreach (string name in FieldList)
|
||||
{
|
||||
if (m_FieldMap[name].GetValue(es) is bool)
|
||||
{
|
||||
if ((bool)m_FieldMap[name].GetValue(es))
|
||||
cmd.Parameters.Add(":"+name, "1");
|
||||
else
|
||||
cmd.Parameters.Add(":"+name, "0");
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd.Parameters.Add(":"+name, m_FieldMap[name].GetValue(es).ToString());
|
||||
}
|
||||
}
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
cmd.CommandText = "select LAST_INSERT_ROWID() as id";
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
r = cmd.ExecuteReader();
|
||||
|
||||
r.Read();
|
||||
|
||||
es.EstateID = Convert.ToUInt32(r["id"]);
|
||||
|
||||
r.Close();
|
||||
|
||||
cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)";
|
||||
cmd.Parameters.Add(":RegionID", regionID.ToString());
|
||||
cmd.Parameters.Add(":EstateID", es.EstateID.ToString());
|
||||
|
||||
// This will throw on dupe key
|
||||
try
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
|
||||
es.Save();
|
||||
}
|
||||
|
||||
LoadBanList(es);
|
||||
|
||||
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
|
||||
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
|
||||
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
|
||||
return es;
|
||||
}
|
||||
|
||||
public void StoreEstateSettings(EstateSettings es)
|
||||
{
|
||||
List<string> fields = new List<string>(FieldList);
|
||||
fields.Remove("EstateID");
|
||||
|
||||
List<string> terms = new List<string>();
|
||||
|
||||
foreach (string f in fields)
|
||||
terms.Add(f+" = :"+f);
|
||||
|
||||
string sql = "update estate_settings set "+String.Join(", ", terms.ToArray())+" where EstateID = :EstateID";
|
||||
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = sql;
|
||||
|
||||
foreach (string name in FieldList)
|
||||
{
|
||||
if (m_FieldMap[name].GetValue(es) is bool)
|
||||
{
|
||||
if ((bool)m_FieldMap[name].GetValue(es))
|
||||
cmd.Parameters.Add(":"+name, "1");
|
||||
else
|
||||
cmd.Parameters.Add(":"+name, "0");
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd.Parameters.Add(":"+name, m_FieldMap[name].GetValue(es).ToString());
|
||||
}
|
||||
}
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
SaveBanList(es);
|
||||
SaveUUIDList(es.EstateID, "estate_managers", es.EstateManagers);
|
||||
SaveUUIDList(es.EstateID, "estate_users", es.EstateAccess);
|
||||
SaveUUIDList(es.EstateID, "estate_groups", es.EstateGroups);
|
||||
}
|
||||
|
||||
private void LoadBanList(EstateSettings es)
|
||||
{
|
||||
es.ClearBans();
|
||||
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = "select bannedUUID from estateban where EstateID = :EstateID";
|
||||
cmd.Parameters.Add(":EstateID", es.EstateID);
|
||||
|
||||
IDataReader r = cmd.ExecuteReader();
|
||||
|
||||
while (r.Read())
|
||||
{
|
||||
EstateBan eb = new EstateBan();
|
||||
|
||||
UUID uuid = new UUID();
|
||||
UUID.TryParse(r["bannedUUID"].ToString(), out uuid);
|
||||
|
||||
eb.BannedUserID = uuid;
|
||||
eb.BannedHostAddress = "0.0.0.0";
|
||||
eb.BannedHostIPMask = "0.0.0.0";
|
||||
es.AddBan(eb);
|
||||
}
|
||||
r.Close();
|
||||
}
|
||||
|
||||
private void SaveBanList(EstateSettings es)
|
||||
{
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = "delete from estateban where EstateID = :EstateID";
|
||||
cmd.Parameters.Add(":EstateID", es.EstateID.ToString());
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) values ( :EstateID, :bannedUUID, '', '', '' )";
|
||||
|
||||
foreach (EstateBan b in es.EstateBans)
|
||||
{
|
||||
cmd.Parameters.Add(":EstateID", es.EstateID.ToString());
|
||||
cmd.Parameters.Add(":bannedUUID", b.BannedUserID.ToString());
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
cmd.Parameters.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
void SaveUUIDList(uint EstateID, string table, UUID[] data)
|
||||
{
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = "delete from "+table+" where EstateID = :EstateID";
|
||||
cmd.Parameters.Add(":EstateID", EstateID.ToString());
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
cmd.CommandText = "insert into "+table+" (EstateID, uuid) values ( :EstateID, :uuid )";
|
||||
|
||||
foreach (UUID uuid in data)
|
||||
{
|
||||
cmd.Parameters.Add(":EstateID", EstateID.ToString());
|
||||
cmd.Parameters.Add(":uuid", uuid.ToString());
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
cmd.Parameters.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
UUID[] LoadUUIDList(uint EstateID, string table)
|
||||
{
|
||||
List<UUID> uuids = new List<UUID>();
|
||||
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = "select uuid from "+table+" where EstateID = :EstateID";
|
||||
cmd.Parameters.Add(":EstateID", EstateID);
|
||||
|
||||
IDataReader r = cmd.ExecuteReader();
|
||||
|
||||
while (r.Read())
|
||||
{
|
||||
// EstateBan eb = new EstateBan();
|
||||
|
||||
UUID uuid = new UUID();
|
||||
UUID.TryParse(r["uuid"].ToString(), out uuid);
|
||||
|
||||
uuids.Add(uuid);
|
||||
}
|
||||
r.Close();
|
||||
|
||||
return uuids.ToArray();
|
||||
}
|
||||
|
||||
public EstateSettings LoadEstateSettings(int estateID)
|
||||
{
|
||||
string sql = "select estate_settings."+String.Join(",estate_settings.", FieldList)+" from estate_settings where estate_settings.EstateID = :EstateID";
|
||||
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = sql;
|
||||
cmd.Parameters.Add(":EstateID", estateID.ToString());
|
||||
|
||||
return DoLoad(cmd, UUID.Zero, false);
|
||||
}
|
||||
|
||||
public List<int> GetEstates(string search)
|
||||
{
|
||||
List<int> result = new List<int>();
|
||||
|
||||
string sql = "select EstateID from estate_settings where estate_settings.EstateName = :EstateName";
|
||||
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = sql;
|
||||
cmd.Parameters.Add(":EstateName", search);
|
||||
|
||||
IDataReader r = cmd.ExecuteReader();
|
||||
|
||||
while (r.Read())
|
||||
{
|
||||
result.Add(Convert.ToInt32(r["EstateID"]));
|
||||
}
|
||||
r.Close();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool LinkRegion(UUID regionID, int estateID)
|
||||
{
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
|
||||
cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)";
|
||||
cmd.Parameters.Add(":RegionID", regionID.ToString());
|
||||
cmd.Parameters.Add(":EstateID", estateID.ToString());
|
||||
|
||||
if (cmd.ExecuteNonQuery() == 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<UUID> GetRegions(int estateID)
|
||||
{
|
||||
return new List<UUID>();
|
||||
}
|
||||
|
||||
public bool DeleteEstate(int estateID)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,91 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using Mono.Data.SqliteClient;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
{
|
||||
/// <summary>
|
||||
/// A database interface class to a user profile storage system
|
||||
/// </summary>
|
||||
public class SQLiteFramework
|
||||
{
|
||||
protected Object m_lockObject = new Object();
|
||||
|
||||
protected SQLiteFramework(string connectionString)
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
//
|
||||
// All non queries are funneled through one connection
|
||||
// to increase performance a little
|
||||
//
|
||||
protected int ExecuteNonQuery(SqliteCommand cmd, SqliteConnection connection)
|
||||
{
|
||||
lock (connection)
|
||||
{
|
||||
SqliteConnection newConnection =
|
||||
(SqliteConnection)((ICloneable)connection).Clone();
|
||||
newConnection.Open();
|
||||
|
||||
cmd.Connection = newConnection;
|
||||
//Console.WriteLine("XXX " + cmd.CommandText);
|
||||
|
||||
return cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
|
||||
protected IDataReader ExecuteReader(SqliteCommand cmd, SqliteConnection connection)
|
||||
{
|
||||
lock (connection)
|
||||
{
|
||||
SqliteConnection newConnection =
|
||||
(SqliteConnection)((ICloneable)connection).Clone();
|
||||
newConnection.Open();
|
||||
|
||||
cmd.Connection = newConnection;
|
||||
//Console.WriteLine("XXX " + cmd.CommandText);
|
||||
|
||||
return cmd.ExecuteReader();
|
||||
}
|
||||
}
|
||||
|
||||
protected void CloseCommand(SqliteCommand cmd)
|
||||
{
|
||||
cmd.Connection.Close();
|
||||
cmd.Connection.Dispose();
|
||||
cmd.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using Mono.Data.SqliteClient;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
{
|
||||
public class SQLiteFriendsData : SQLiteGenericTableHandler<FriendsData>, IFriendsData
|
||||
{
|
||||
public SQLiteFriendsData(string connectionString, string realm)
|
||||
: base(connectionString, realm, "FriendsStore")
|
||||
{
|
||||
}
|
||||
|
||||
public FriendsData[] GetFriends(UUID userID)
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID = :PrincipalID", m_Realm);
|
||||
cmd.Parameters.Add(":PrincipalID", userID.ToString());
|
||||
|
||||
return DoQuery(cmd);
|
||||
|
||||
}
|
||||
|
||||
public bool Delete(UUID principalID, string friend)
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
cmd.CommandText = String.Format("delete from {0} where PrincipalID = :PrincipalID and Friend = :Friend", m_Realm);
|
||||
cmd.Parameters.Add(":PrincipalID", principalID.ToString());
|
||||
cmd.Parameters.Add(":Friend", friend);
|
||||
|
||||
ExecuteNonQuery(cmd, cmd.Connection);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,268 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using Mono.Data.SqliteClient;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
{
|
||||
public class SQLiteGenericTableHandler<T> : SQLiteFramework where T: class, new()
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected Dictionary<string, FieldInfo> m_Fields =
|
||||
new Dictionary<string, FieldInfo>();
|
||||
|
||||
protected List<string> m_ColumnNames = null;
|
||||
protected string m_Realm;
|
||||
protected FieldInfo m_DataField = null;
|
||||
|
||||
protected static SqliteConnection m_Connection;
|
||||
private static bool m_initialized;
|
||||
|
||||
public SQLiteGenericTableHandler(string connectionString,
|
||||
string realm, string storeName) : base(connectionString)
|
||||
{
|
||||
m_Realm = realm;
|
||||
|
||||
if (!m_initialized)
|
||||
{
|
||||
m_Connection = new SqliteConnection(connectionString);
|
||||
m_Connection.Open();
|
||||
|
||||
if (storeName != String.Empty)
|
||||
{
|
||||
Assembly assem = GetType().Assembly;
|
||||
SqliteConnection newConnection =
|
||||
(SqliteConnection)((ICloneable)m_Connection).Clone();
|
||||
newConnection.Open();
|
||||
|
||||
Migration m = new Migration(newConnection, assem, storeName);
|
||||
m.Update();
|
||||
newConnection.Close();
|
||||
newConnection.Dispose();
|
||||
}
|
||||
|
||||
m_initialized = true;
|
||||
}
|
||||
|
||||
Type t = typeof(T);
|
||||
FieldInfo[] fields = t.GetFields(BindingFlags.Public |
|
||||
BindingFlags.Instance |
|
||||
BindingFlags.DeclaredOnly);
|
||||
|
||||
if (fields.Length == 0)
|
||||
return;
|
||||
|
||||
foreach (FieldInfo f in fields)
|
||||
{
|
||||
if (f.Name != "Data")
|
||||
m_Fields[f.Name] = f;
|
||||
else
|
||||
m_DataField = f;
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckColumnNames(IDataReader reader)
|
||||
{
|
||||
if (m_ColumnNames != null)
|
||||
return;
|
||||
|
||||
m_ColumnNames = new List<string>();
|
||||
|
||||
DataTable schemaTable = reader.GetSchemaTable();
|
||||
foreach (DataRow row in schemaTable.Rows)
|
||||
{
|
||||
if (row["ColumnName"] != null &&
|
||||
(!m_Fields.ContainsKey(row["ColumnName"].ToString())))
|
||||
m_ColumnNames.Add(row["ColumnName"].ToString());
|
||||
}
|
||||
}
|
||||
|
||||
public T[] Get(string field, string key)
|
||||
{
|
||||
return Get(new string[] { field }, new string[] { key });
|
||||
}
|
||||
|
||||
public T[] Get(string[] fields, string[] keys)
|
||||
{
|
||||
if (fields.Length != keys.Length)
|
||||
return new T[0];
|
||||
|
||||
List<string> terms = new List<string>();
|
||||
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
for (int i = 0 ; i < fields.Length ; i++)
|
||||
{
|
||||
cmd.Parameters.Add(new SqliteParameter(":" + fields[i], keys[i]));
|
||||
terms.Add("`" + fields[i] + "` = :" + fields[i]);
|
||||
}
|
||||
|
||||
string where = String.Join(" and ", terms.ToArray());
|
||||
|
||||
string query = String.Format("select * from {0} where {1}",
|
||||
m_Realm, where);
|
||||
|
||||
cmd.CommandText = query;
|
||||
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
|
||||
protected T[] DoQuery(SqliteCommand cmd)
|
||||
{
|
||||
IDataReader reader = ExecuteReader(cmd, m_Connection);
|
||||
if (reader == null)
|
||||
return new T[0];
|
||||
|
||||
CheckColumnNames(reader);
|
||||
|
||||
List<T> result = new List<T>();
|
||||
|
||||
while (reader.Read())
|
||||
{
|
||||
T row = new T();
|
||||
|
||||
foreach (string name in m_Fields.Keys)
|
||||
{
|
||||
if (m_Fields[name].GetValue(row) is bool)
|
||||
{
|
||||
int v = Convert.ToInt32(reader[name]);
|
||||
m_Fields[name].SetValue(row, v != 0 ? true : false);
|
||||
}
|
||||
else if (m_Fields[name].GetValue(row) is UUID)
|
||||
{
|
||||
UUID uuid = UUID.Zero;
|
||||
|
||||
UUID.TryParse(reader[name].ToString(), out uuid);
|
||||
m_Fields[name].SetValue(row, uuid);
|
||||
}
|
||||
else if (m_Fields[name].GetValue(row) is int)
|
||||
{
|
||||
int v = Convert.ToInt32(reader[name]);
|
||||
m_Fields[name].SetValue(row, v);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Fields[name].SetValue(row, reader[name]);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_DataField != null)
|
||||
{
|
||||
Dictionary<string, string> data =
|
||||
new Dictionary<string, string>();
|
||||
|
||||
foreach (string col in m_ColumnNames)
|
||||
{
|
||||
data[col] = reader[col].ToString();
|
||||
if (data[col] == null)
|
||||
data[col] = String.Empty;
|
||||
}
|
||||
|
||||
m_DataField.SetValue(row, data);
|
||||
}
|
||||
|
||||
result.Add(row);
|
||||
}
|
||||
|
||||
CloseCommand(cmd);
|
||||
|
||||
return result.ToArray();
|
||||
}
|
||||
|
||||
public T[] Get(string where)
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
string query = String.Format("select * from {0} where {1}",
|
||||
m_Realm, where);
|
||||
|
||||
cmd.CommandText = query;
|
||||
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
|
||||
public bool Store(T row)
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
string query = "";
|
||||
List<String> names = new List<String>();
|
||||
List<String> values = new List<String>();
|
||||
|
||||
foreach (FieldInfo fi in m_Fields.Values)
|
||||
{
|
||||
names.Add(fi.Name);
|
||||
values.Add(":" + fi.Name);
|
||||
cmd.Parameters.Add(new SqliteParameter(":" + fi.Name, fi.GetValue(row).ToString()));
|
||||
}
|
||||
|
||||
if (m_DataField != null)
|
||||
{
|
||||
Dictionary<string, string> data =
|
||||
(Dictionary<string, string>)m_DataField.GetValue(row);
|
||||
|
||||
foreach (KeyValuePair<string, string> kvp in data)
|
||||
{
|
||||
names.Add(kvp.Key);
|
||||
values.Add(":" + kvp.Key);
|
||||
cmd.Parameters.Add(new SqliteParameter(":" + kvp.Key, kvp.Value));
|
||||
}
|
||||
}
|
||||
|
||||
query = String.Format("replace into {0} (`", m_Realm) + String.Join("`,`", names.ToArray()) + "`) values (" + String.Join(",", values.ToArray()) + ")";
|
||||
|
||||
cmd.CommandText = query;
|
||||
|
||||
if (ExecuteNonQuery(cmd, m_Connection) > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool Delete(string field, string val)
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
cmd.CommandText = String.Format("delete from {0} where `{1}` = :{1}", m_Realm, field);
|
||||
cmd.Parameters.Add(new SqliteParameter(field, val));
|
||||
|
||||
if (ExecuteNonQuery(cmd, m_Connection) > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,898 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using Mono.Data.SqliteClient;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
{
|
||||
/// <summary>
|
||||
/// An Inventory Interface to the SQLite database
|
||||
/// </summary>
|
||||
public class SQLiteInventoryStore : SQLiteUtil, IInventoryDataPlugin
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private const string invItemsSelect = "select * from inventoryitems";
|
||||
private const string invFoldersSelect = "select * from inventoryfolders";
|
||||
|
||||
private static SqliteConnection conn;
|
||||
private static DataSet ds;
|
||||
private static SqliteDataAdapter invItemsDa;
|
||||
private static SqliteDataAdapter invFoldersDa;
|
||||
|
||||
private static bool m_Initialized = false;
|
||||
|
||||
public void Initialise()
|
||||
{
|
||||
m_log.Info("[SQLiteInventoryData]: " + Name + " cannot be default-initialized!");
|
||||
throw new PluginNotInitialisedException(Name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <list type="bullet">
|
||||
/// <item>Initialises Inventory interface</item>
|
||||
/// <item>Loads and initialises a new SQLite connection and maintains it.</item>
|
||||
/// <item>use default URI if connect string string is empty.</item>
|
||||
/// </list>
|
||||
/// </summary>
|
||||
/// <param name="dbconnect">connect string</param>
|
||||
public void Initialise(string dbconnect)
|
||||
{
|
||||
if (!m_Initialized)
|
||||
{
|
||||
m_Initialized = true;
|
||||
|
||||
if (dbconnect == string.Empty)
|
||||
{
|
||||
dbconnect = "URI=file:inventoryStore.db,version=3";
|
||||
}
|
||||
m_log.Info("[INVENTORY DB]: Sqlite - connecting: " + dbconnect);
|
||||
conn = new SqliteConnection(dbconnect);
|
||||
|
||||
conn.Open();
|
||||
|
||||
Assembly assem = GetType().Assembly;
|
||||
Migration m = new Migration(conn, assem, "InventoryStore");
|
||||
m.Update();
|
||||
|
||||
SqliteCommand itemsSelectCmd = new SqliteCommand(invItemsSelect, conn);
|
||||
invItemsDa = new SqliteDataAdapter(itemsSelectCmd);
|
||||
// SqliteCommandBuilder primCb = new SqliteCommandBuilder(primDa);
|
||||
|
||||
SqliteCommand foldersSelectCmd = new SqliteCommand(invFoldersSelect, conn);
|
||||
invFoldersDa = new SqliteDataAdapter(foldersSelectCmd);
|
||||
|
||||
ds = new DataSet();
|
||||
|
||||
ds.Tables.Add(createInventoryFoldersTable());
|
||||
invFoldersDa.Fill(ds.Tables["inventoryfolders"]);
|
||||
setupFoldersCommands(invFoldersDa, conn);
|
||||
m_log.Info("[INVENTORY DB]: Populated Inventory Folders Definitions");
|
||||
|
||||
ds.Tables.Add(createInventoryItemsTable());
|
||||
invItemsDa.Fill(ds.Tables["inventoryitems"]);
|
||||
setupItemsCommands(invItemsDa, conn);
|
||||
m_log.Info("[INVENTORY DB]: Populated Inventory Items Definitions");
|
||||
|
||||
ds.AcceptChanges();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the inventory interface
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
if (conn != null)
|
||||
{
|
||||
conn.Close();
|
||||
conn = null;
|
||||
}
|
||||
if (invItemsDa != null)
|
||||
{
|
||||
invItemsDa.Dispose();
|
||||
invItemsDa = null;
|
||||
}
|
||||
if (invFoldersDa != null)
|
||||
{
|
||||
invFoldersDa.Dispose();
|
||||
invFoldersDa = null;
|
||||
}
|
||||
if (ds != null)
|
||||
{
|
||||
ds.Dispose();
|
||||
ds = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="row"></param>
|
||||
/// <returns></returns>
|
||||
public InventoryItemBase buildItem(DataRow row)
|
||||
{
|
||||
InventoryItemBase item = new InventoryItemBase();
|
||||
item.ID = new UUID((string) row["UUID"]);
|
||||
item.AssetID = new UUID((string) row["assetID"]);
|
||||
item.AssetType = Convert.ToInt32(row["assetType"]);
|
||||
item.InvType = Convert.ToInt32(row["invType"]);
|
||||
item.Folder = new UUID((string) row["parentFolderID"]);
|
||||
item.Owner = new UUID((string) row["avatarID"]);
|
||||
item.CreatorIdentification = (string)row["creatorsID"];
|
||||
item.Name = (string) row["inventoryName"];
|
||||
item.Description = (string) row["inventoryDescription"];
|
||||
|
||||
item.NextPermissions = Convert.ToUInt32(row["inventoryNextPermissions"]);
|
||||
item.CurrentPermissions = Convert.ToUInt32(row["inventoryCurrentPermissions"]);
|
||||
item.BasePermissions = Convert.ToUInt32(row["inventoryBasePermissions"]);
|
||||
item.EveryOnePermissions = Convert.ToUInt32(row["inventoryEveryOnePermissions"]);
|
||||
item.GroupPermissions = Convert.ToUInt32(row["inventoryGroupPermissions"]);
|
||||
|
||||
// new fields
|
||||
if (!Convert.IsDBNull(row["salePrice"]))
|
||||
item.SalePrice = Convert.ToInt32(row["salePrice"]);
|
||||
|
||||
if (!Convert.IsDBNull(row["saleType"]))
|
||||
item.SaleType = Convert.ToByte(row["saleType"]);
|
||||
|
||||
if (!Convert.IsDBNull(row["creationDate"]))
|
||||
item.CreationDate = Convert.ToInt32(row["creationDate"]);
|
||||
|
||||
if (!Convert.IsDBNull(row["groupID"]))
|
||||
item.GroupID = new UUID((string)row["groupID"]);
|
||||
|
||||
if (!Convert.IsDBNull(row["groupOwned"]))
|
||||
item.GroupOwned = Convert.ToBoolean(row["groupOwned"]);
|
||||
|
||||
if (!Convert.IsDBNull(row["Flags"]))
|
||||
item.Flags = Convert.ToUInt32(row["Flags"]);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fill a database row with item data
|
||||
/// </summary>
|
||||
/// <param name="row"></param>
|
||||
/// <param name="item"></param>
|
||||
private static void fillItemRow(DataRow row, InventoryItemBase item)
|
||||
{
|
||||
row["UUID"] = item.ID.ToString();
|
||||
row["assetID"] = item.AssetID.ToString();
|
||||
row["assetType"] = item.AssetType;
|
||||
row["invType"] = item.InvType;
|
||||
row["parentFolderID"] = item.Folder.ToString();
|
||||
row["avatarID"] = item.Owner.ToString();
|
||||
row["creatorsID"] = item.CreatorIdentification.ToString();
|
||||
row["inventoryName"] = item.Name;
|
||||
row["inventoryDescription"] = item.Description;
|
||||
|
||||
row["inventoryNextPermissions"] = item.NextPermissions;
|
||||
row["inventoryCurrentPermissions"] = item.CurrentPermissions;
|
||||
row["inventoryBasePermissions"] = item.BasePermissions;
|
||||
row["inventoryEveryOnePermissions"] = item.EveryOnePermissions;
|
||||
row["inventoryGroupPermissions"] = item.GroupPermissions;
|
||||
|
||||
// new fields
|
||||
row["salePrice"] = item.SalePrice;
|
||||
row["saleType"] = item.SaleType;
|
||||
row["creationDate"] = item.CreationDate;
|
||||
row["groupID"] = item.GroupID.ToString();
|
||||
row["groupOwned"] = item.GroupOwned;
|
||||
row["flags"] = item.Flags;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add inventory folder
|
||||
/// </summary>
|
||||
/// <param name="folder">Folder base</param>
|
||||
/// <param name="add">true=create folder. false=update existing folder</param>
|
||||
/// <remarks>nasty</remarks>
|
||||
private void addFolder(InventoryFolderBase folder, bool add)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
|
||||
DataRow inventoryRow = inventoryFolderTable.Rows.Find(folder.ID.ToString());
|
||||
if (inventoryRow == null)
|
||||
{
|
||||
if (! add)
|
||||
m_log.ErrorFormat("Interface Misuse: Attempting to Update non-existant inventory folder: {0}", folder.ID);
|
||||
|
||||
inventoryRow = inventoryFolderTable.NewRow();
|
||||
fillFolderRow(inventoryRow, folder);
|
||||
inventoryFolderTable.Rows.Add(inventoryRow);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (add)
|
||||
m_log.ErrorFormat("Interface Misuse: Attempting to Add inventory folder that already exists: {0}", folder.ID);
|
||||
|
||||
fillFolderRow(inventoryRow, folder);
|
||||
}
|
||||
|
||||
invFoldersDa.Update(ds, "inventoryfolders");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Move an inventory folder
|
||||
/// </summary>
|
||||
/// <param name="folder">folder base</param>
|
||||
private void moveFolder(InventoryFolderBase folder)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
|
||||
DataRow inventoryRow = inventoryFolderTable.Rows.Find(folder.ID.ToString());
|
||||
if (inventoryRow == null)
|
||||
{
|
||||
inventoryRow = inventoryFolderTable.NewRow();
|
||||
fillFolderRow(inventoryRow, folder);
|
||||
inventoryFolderTable.Rows.Add(inventoryRow);
|
||||
}
|
||||
else
|
||||
{
|
||||
moveFolderRow(inventoryRow, folder);
|
||||
}
|
||||
|
||||
invFoldersDa.Update(ds, "inventoryfolders");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// add an item in inventory
|
||||
/// </summary>
|
||||
/// <param name="item">the item</param>
|
||||
/// <param name="add">true=add item ; false=update existing item</param>
|
||||
private void addItem(InventoryItemBase item, bool add)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
DataTable inventoryItemTable = ds.Tables["inventoryitems"];
|
||||
|
||||
DataRow inventoryRow = inventoryItemTable.Rows.Find(item.ID.ToString());
|
||||
if (inventoryRow == null)
|
||||
{
|
||||
if (!add)
|
||||
m_log.ErrorFormat("[INVENTORY DB]: Interface Misuse: Attempting to Update non-existant inventory item: {0}", item.ID);
|
||||
|
||||
inventoryRow = inventoryItemTable.NewRow();
|
||||
fillItemRow(inventoryRow, item);
|
||||
inventoryItemTable.Rows.Add(inventoryRow);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (add)
|
||||
m_log.ErrorFormat("[INVENTORY DB]: Interface Misuse: Attempting to Add inventory item that already exists: {0}", item.ID);
|
||||
|
||||
fillItemRow(inventoryRow, item);
|
||||
}
|
||||
|
||||
invItemsDa.Update(ds, "inventoryitems");
|
||||
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
|
||||
inventoryRow = inventoryFolderTable.Rows.Find(item.Folder.ToString());
|
||||
if (inventoryRow != null) //MySQL doesn't throw an exception here, so sqlite shouldn't either.
|
||||
inventoryRow["version"] = (int)inventoryRow["version"] + 1;
|
||||
|
||||
invFoldersDa.Update(ds, "inventoryfolders");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// TODO : DataSet commit
|
||||
/// </summary>
|
||||
public void Shutdown()
|
||||
{
|
||||
// TODO: DataSet commit
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The name of this DB provider
|
||||
/// </summary>
|
||||
/// <returns>Name of DB provider</returns>
|
||||
public string Name
|
||||
{
|
||||
get { return "SQLite Inventory Data Interface"; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the version of this DB provider
|
||||
/// </summary>
|
||||
/// <returns>A string containing the DB provider version</returns>
|
||||
public string Version
|
||||
{
|
||||
get
|
||||
{
|
||||
Module module = GetType().Module;
|
||||
// string dllName = module.Assembly.ManifestModule.Name;
|
||||
Version dllVersion = module.Assembly.GetName().Version;
|
||||
|
||||
|
||||
return
|
||||
string.Format("{0}.{1}.{2}.{3}", dllVersion.Major, dllVersion.Minor, dllVersion.Build,
|
||||
dllVersion.Revision);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of inventory items contained within the specified folder
|
||||
/// </summary>
|
||||
/// <param name="folderID">The UUID of the target folder</param>
|
||||
/// <returns>A List of InventoryItemBase items</returns>
|
||||
public List<InventoryItemBase> getInventoryInFolder(UUID folderID)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
List<InventoryItemBase> retval = new List<InventoryItemBase>();
|
||||
DataTable inventoryItemTable = ds.Tables["inventoryitems"];
|
||||
string selectExp = "parentFolderID = '" + folderID + "'";
|
||||
DataRow[] rows = inventoryItemTable.Select(selectExp);
|
||||
foreach (DataRow row in rows)
|
||||
{
|
||||
retval.Add(buildItem(row));
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of the root folders within a users inventory
|
||||
/// </summary>
|
||||
/// <param name="user">The user whos inventory is to be searched</param>
|
||||
/// <returns>A list of folder objects</returns>
|
||||
public List<InventoryFolderBase> getUserRootFolders(UUID user)
|
||||
{
|
||||
return new List<InventoryFolderBase>();
|
||||
}
|
||||
|
||||
// see InventoryItemBase.getUserRootFolder
|
||||
public InventoryFolderBase getUserRootFolder(UUID user)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
string selectExp = "agentID = '" + user + "' AND parentID = '" + UUID.Zero + "'";
|
||||
DataRow[] rows = inventoryFolderTable.Select(selectExp);
|
||||
foreach (DataRow row in rows)
|
||||
{
|
||||
folders.Add(buildFolder(row));
|
||||
}
|
||||
|
||||
// There should only ever be one root folder for a user. However, if there's more
|
||||
// than one we'll simply use the first one rather than failing. It would be even
|
||||
// nicer to print some message to this effect, but this feels like it's too low a
|
||||
// to put such a message out, and it's too minor right now to spare the time to
|
||||
// suitably refactor.
|
||||
if (folders.Count > 0)
|
||||
{
|
||||
return folders[0];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Append a list of all the child folders of a parent folder
|
||||
/// </summary>
|
||||
/// <param name="folders">list where folders will be appended</param>
|
||||
/// <param name="parentID">ID of parent</param>
|
||||
protected void getInventoryFolders(ref List<InventoryFolderBase> folders, UUID parentID)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
string selectExp = "parentID = '" + parentID + "'";
|
||||
DataRow[] rows = inventoryFolderTable.Select(selectExp);
|
||||
foreach (DataRow row in rows)
|
||||
{
|
||||
folders.Add(buildFolder(row));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of inventory folders contained in the folder 'parentID'
|
||||
/// </summary>
|
||||
/// <param name="parentID">The folder to get subfolders for</param>
|
||||
/// <returns>A list of inventory folders</returns>
|
||||
public List<InventoryFolderBase> getInventoryFolders(UUID parentID)
|
||||
{
|
||||
List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
|
||||
getInventoryFolders(ref folders, parentID);
|
||||
return folders;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// See IInventoryDataPlugin
|
||||
/// </summary>
|
||||
/// <param name="parentID"></param>
|
||||
/// <returns></returns>
|
||||
public List<InventoryFolderBase> getFolderHierarchy(UUID parentID)
|
||||
{
|
||||
/* Note: There are subtle changes between this implementation of getFolderHierarchy and the previous one
|
||||
* - We will only need to hit the database twice instead of n times.
|
||||
* - We assume the database is well-formed - no stranded/dangling folders, all folders in heirarchy owned
|
||||
* by the same person, each user only has 1 inventory heirarchy
|
||||
* - The returned list is not ordered, instead of breadth-first ordered
|
||||
There are basically 2 usage cases for getFolderHeirarchy:
|
||||
1) Getting the user's entire inventory heirarchy when they log in
|
||||
2) Finding a subfolder heirarchy to delete when emptying the trash.
|
||||
This implementation will pull all inventory folders from the database, and then prune away any folder that
|
||||
is not part of the requested sub-heirarchy. The theory is that it is cheaper to make 1 request from the
|
||||
database than to make n requests. This pays off only if requested heirarchy is large.
|
||||
By making this choice, we are making the worst case better at the cost of making the best case worse
|
||||
- Francis
|
||||
*/
|
||||
|
||||
List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
|
||||
DataRow[] folderRows = null, parentRow;
|
||||
InventoryFolderBase parentFolder = null;
|
||||
lock (ds)
|
||||
{
|
||||
/* Fetch the parent folder from the database to determine the agent ID.
|
||||
* Then fetch all inventory folders for that agent from the agent ID.
|
||||
*/
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
string selectExp = "UUID = '" + parentID + "'";
|
||||
parentRow = inventoryFolderTable.Select(selectExp); // Assume at most 1 result
|
||||
if (parentRow.GetLength(0) >= 1) // No result means parent folder does not exist
|
||||
{
|
||||
parentFolder = buildFolder(parentRow[0]);
|
||||
UUID agentID = parentFolder.Owner;
|
||||
selectExp = "agentID = '" + agentID + "'";
|
||||
folderRows = inventoryFolderTable.Select(selectExp);
|
||||
}
|
||||
|
||||
if (folderRows != null && folderRows.GetLength(0) >= 1) // No result means parent folder does not exist
|
||||
{ // or has no children
|
||||
/* if we're querying the root folder, just return an unordered list of all folders in the user's
|
||||
* inventory
|
||||
*/
|
||||
if (parentFolder.ParentID == UUID.Zero)
|
||||
{
|
||||
foreach (DataRow row in folderRows)
|
||||
{
|
||||
InventoryFolderBase curFolder = buildFolder(row);
|
||||
if (curFolder.ID != parentID) // Return all folders except the parent folder of heirarchy
|
||||
folders.Add(buildFolder(row));
|
||||
}
|
||||
} // If requesting root folder
|
||||
/* else we are querying a non-root folder. We currently have a list of all of the user's folders,
|
||||
* we must construct a list of all folders in the heirarchy below parentID.
|
||||
* Our first step will be to construct a hash table of all folders, indexed by parent ID.
|
||||
* Once we have constructed the hash table, we will do a breadth-first traversal on the tree using the
|
||||
* hash table to find child folders.
|
||||
*/
|
||||
else
|
||||
{ // Querying a non-root folder
|
||||
|
||||
// Build a hash table of all user's inventory folders, indexed by each folder's parent ID
|
||||
Dictionary<UUID, List<InventoryFolderBase>> hashtable =
|
||||
new Dictionary<UUID, List<InventoryFolderBase>>(folderRows.GetLength(0));
|
||||
|
||||
foreach (DataRow row in folderRows)
|
||||
{
|
||||
InventoryFolderBase curFolder = buildFolder(row);
|
||||
if (curFolder.ParentID != UUID.Zero) // Discard root of tree - not needed
|
||||
{
|
||||
if (hashtable.ContainsKey(curFolder.ParentID))
|
||||
{
|
||||
// Current folder already has a sibling - append to sibling list
|
||||
hashtable[curFolder.ParentID].Add(curFolder);
|
||||
}
|
||||
else
|
||||
{
|
||||
List<InventoryFolderBase> siblingList = new List<InventoryFolderBase>();
|
||||
siblingList.Add(curFolder);
|
||||
// Current folder has no known (yet) siblings
|
||||
hashtable.Add(curFolder.ParentID, siblingList);
|
||||
}
|
||||
}
|
||||
} // For all inventory folders
|
||||
|
||||
// Note: Could release the ds lock here - we don't access folderRows or the database anymore.
|
||||
// This is somewhat of a moot point as the callers of this function usually lock db anyways.
|
||||
|
||||
if (hashtable.ContainsKey(parentID)) // if requested folder does have children
|
||||
folders.AddRange(hashtable[parentID]);
|
||||
|
||||
// BreadthFirstSearch build inventory tree **Note: folders.Count is *not* static
|
||||
for (int i = 0; i < folders.Count; i++)
|
||||
if (hashtable.ContainsKey(folders[i].ID))
|
||||
folders.AddRange(hashtable[folders[i].ID]);
|
||||
|
||||
} // if requesting a subfolder heirarchy
|
||||
} // if folder parentID exists and has children
|
||||
} // lock ds
|
||||
return folders;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns an inventory item by its UUID
|
||||
/// </summary>
|
||||
/// <param name="item">The UUID of the item to be returned</param>
|
||||
/// <returns>A class containing item information</returns>
|
||||
public InventoryItemBase getInventoryItem(UUID item)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
DataRow row = ds.Tables["inventoryitems"].Rows.Find(item.ToString());
|
||||
if (row != null)
|
||||
{
|
||||
return buildItem(row);
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a specified inventory folder by its UUID
|
||||
/// </summary>
|
||||
/// <param name="folder">The UUID of the folder to be returned</param>
|
||||
/// <returns>A class containing folder information</returns>
|
||||
public InventoryFolderBase getInventoryFolder(UUID folder)
|
||||
{
|
||||
// TODO: Deep voodoo here. If you enable this code then
|
||||
// multi region breaks. No idea why, but I figured it was
|
||||
// better to leave multi region at this point. It does mean
|
||||
// that you don't get to see system textures why creating
|
||||
// clothes and the like. :(
|
||||
lock (ds)
|
||||
{
|
||||
DataRow row = ds.Tables["inventoryfolders"].Rows.Find(folder.ToString());
|
||||
if (row != null)
|
||||
{
|
||||
return buildFolder(row);
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new inventory item based on item
|
||||
/// </summary>
|
||||
/// <param name="item">The item to be created</param>
|
||||
public void addInventoryItem(InventoryItemBase item)
|
||||
{
|
||||
addItem(item, true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates an inventory item with item (updates based on ID)
|
||||
/// </summary>
|
||||
/// <param name="item">The updated item</param>
|
||||
public void updateInventoryItem(InventoryItemBase item)
|
||||
{
|
||||
addItem(item, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete an inventory item
|
||||
/// </summary>
|
||||
/// <param name="item">The item UUID</param>
|
||||
public void deleteInventoryItem(UUID itemID)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
DataTable inventoryItemTable = ds.Tables["inventoryitems"];
|
||||
|
||||
DataRow inventoryRow = inventoryItemTable.Rows.Find(itemID.ToString());
|
||||
if (inventoryRow != null)
|
||||
{
|
||||
inventoryRow.Delete();
|
||||
}
|
||||
|
||||
invItemsDa.Update(ds, "inventoryitems");
|
||||
}
|
||||
}
|
||||
|
||||
public InventoryItemBase queryInventoryItem(UUID itemID)
|
||||
{
|
||||
return getInventoryItem(itemID);
|
||||
}
|
||||
|
||||
public InventoryFolderBase queryInventoryFolder(UUID folderID)
|
||||
{
|
||||
return getInventoryFolder(folderID);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete all items in the specified folder
|
||||
/// </summary>
|
||||
/// <param name="folderId">id of the folder, whose item content should be deleted</param>
|
||||
/// <todo>this is horribly inefficient, but I don't want to ruin the overall structure of this implementation</todo>
|
||||
private void deleteItemsInFolder(UUID folderId)
|
||||
{
|
||||
List<InventoryItemBase> items = getInventoryInFolder(folderId);
|
||||
|
||||
foreach (InventoryItemBase i in items)
|
||||
deleteInventoryItem(i.ID);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a new folder specified by folder
|
||||
/// </summary>
|
||||
/// <param name="folder">The inventory folder</param>
|
||||
public void addInventoryFolder(InventoryFolderBase folder)
|
||||
{
|
||||
addFolder(folder, true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates a folder based on its ID with folder
|
||||
/// </summary>
|
||||
/// <param name="folder">The inventory folder</param>
|
||||
public void updateInventoryFolder(InventoryFolderBase folder)
|
||||
{
|
||||
addFolder(folder, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Moves a folder based on its ID with folder
|
||||
/// </summary>
|
||||
/// <param name="folder">The inventory folder</param>
|
||||
public void moveInventoryFolder(InventoryFolderBase folder)
|
||||
{
|
||||
moveFolder(folder);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete a folder
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This will clean-up any child folders and child items as well
|
||||
/// </remarks>
|
||||
/// <param name="folderID">the folder UUID</param>
|
||||
public void deleteInventoryFolder(UUID folderID)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
List<InventoryFolderBase> subFolders = getFolderHierarchy(folderID);
|
||||
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
DataRow inventoryRow;
|
||||
|
||||
//Delete all sub-folders
|
||||
foreach (InventoryFolderBase f in subFolders)
|
||||
{
|
||||
inventoryRow = inventoryFolderTable.Rows.Find(f.ID.ToString());
|
||||
if (inventoryRow != null)
|
||||
{
|
||||
deleteItemsInFolder(f.ID);
|
||||
inventoryRow.Delete();
|
||||
}
|
||||
}
|
||||
|
||||
//Delete the actual row
|
||||
inventoryRow = inventoryFolderTable.Rows.Find(folderID.ToString());
|
||||
if (inventoryRow != null)
|
||||
{
|
||||
deleteItemsInFolder(folderID);
|
||||
inventoryRow.Delete();
|
||||
}
|
||||
|
||||
invFoldersDa.Update(ds, "inventoryfolders");
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Data Table definitions
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
/// <summary>
|
||||
/// Create the "inventoryitems" table
|
||||
/// </summary>
|
||||
private static DataTable createInventoryItemsTable()
|
||||
{
|
||||
DataTable inv = new DataTable("inventoryitems");
|
||||
|
||||
createCol(inv, "UUID", typeof (String)); //inventoryID
|
||||
createCol(inv, "assetID", typeof (String));
|
||||
createCol(inv, "assetType", typeof (Int32));
|
||||
createCol(inv, "invType", typeof (Int32));
|
||||
createCol(inv, "parentFolderID", typeof (String));
|
||||
createCol(inv, "avatarID", typeof (String));
|
||||
createCol(inv, "creatorsID", typeof (String));
|
||||
|
||||
createCol(inv, "inventoryName", typeof (String));
|
||||
createCol(inv, "inventoryDescription", typeof (String));
|
||||
// permissions
|
||||
createCol(inv, "inventoryNextPermissions", typeof (Int32));
|
||||
createCol(inv, "inventoryCurrentPermissions", typeof (Int32));
|
||||
createCol(inv, "inventoryBasePermissions", typeof (Int32));
|
||||
createCol(inv, "inventoryEveryOnePermissions", typeof (Int32));
|
||||
createCol(inv, "inventoryGroupPermissions", typeof (Int32));
|
||||
|
||||
// sale info
|
||||
createCol(inv, "salePrice", typeof(Int32));
|
||||
createCol(inv, "saleType", typeof(Byte));
|
||||
|
||||
// creation date
|
||||
createCol(inv, "creationDate", typeof(Int32));
|
||||
|
||||
// group info
|
||||
createCol(inv, "groupID", typeof(String));
|
||||
createCol(inv, "groupOwned", typeof(Boolean));
|
||||
|
||||
// Flags
|
||||
createCol(inv, "flags", typeof(UInt32));
|
||||
|
||||
inv.PrimaryKey = new DataColumn[] { inv.Columns["UUID"] };
|
||||
return inv;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates the "inventoryfolders" table
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private static DataTable createInventoryFoldersTable()
|
||||
{
|
||||
DataTable fol = new DataTable("inventoryfolders");
|
||||
|
||||
createCol(fol, "UUID", typeof (String)); //folderID
|
||||
createCol(fol, "name", typeof (String));
|
||||
createCol(fol, "agentID", typeof (String));
|
||||
createCol(fol, "parentID", typeof (String));
|
||||
createCol(fol, "type", typeof (Int32));
|
||||
createCol(fol, "version", typeof (Int32));
|
||||
|
||||
fol.PrimaryKey = new DataColumn[] {fol.Columns["UUID"]};
|
||||
return fol;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="da"></param>
|
||||
/// <param name="conn"></param>
|
||||
private void setupItemsCommands(SqliteDataAdapter da, SqliteConnection conn)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
da.InsertCommand = createInsertCommand("inventoryitems", ds.Tables["inventoryitems"]);
|
||||
da.InsertCommand.Connection = conn;
|
||||
|
||||
da.UpdateCommand = createUpdateCommand("inventoryitems", "UUID=:UUID", ds.Tables["inventoryitems"]);
|
||||
da.UpdateCommand.Connection = conn;
|
||||
|
||||
SqliteCommand delete = new SqliteCommand("delete from inventoryitems where UUID = :UUID");
|
||||
delete.Parameters.Add(createSqliteParameter("UUID", typeof(String)));
|
||||
delete.Connection = conn;
|
||||
da.DeleteCommand = delete;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="da"></param>
|
||||
/// <param name="conn"></param>
|
||||
private void setupFoldersCommands(SqliteDataAdapter da, SqliteConnection conn)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
da.InsertCommand = createInsertCommand("inventoryfolders", ds.Tables["inventoryfolders"]);
|
||||
da.InsertCommand.Connection = conn;
|
||||
|
||||
da.UpdateCommand = createUpdateCommand("inventoryfolders", "UUID=:UUID", ds.Tables["inventoryfolders"]);
|
||||
da.UpdateCommand.Connection = conn;
|
||||
|
||||
SqliteCommand delete = new SqliteCommand("delete from inventoryfolders where UUID = :UUID");
|
||||
delete.Parameters.Add(createSqliteParameter("UUID", typeof(String)));
|
||||
delete.Connection = conn;
|
||||
da.DeleteCommand = delete;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="row"></param>
|
||||
/// <returns></returns>
|
||||
private static InventoryFolderBase buildFolder(DataRow row)
|
||||
{
|
||||
InventoryFolderBase folder = new InventoryFolderBase();
|
||||
folder.ID = new UUID((string) row["UUID"]);
|
||||
folder.Name = (string) row["name"];
|
||||
folder.Owner = new UUID((string) row["agentID"]);
|
||||
folder.ParentID = new UUID((string) row["parentID"]);
|
||||
folder.Type = Convert.ToInt16(row["type"]);
|
||||
folder.Version = Convert.ToUInt16(row["version"]);
|
||||
return folder;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="row"></param>
|
||||
/// <param name="folder"></param>
|
||||
private static void fillFolderRow(DataRow row, InventoryFolderBase folder)
|
||||
{
|
||||
row["UUID"] = folder.ID.ToString();
|
||||
row["name"] = folder.Name;
|
||||
row["agentID"] = folder.Owner.ToString();
|
||||
row["parentID"] = folder.ParentID.ToString();
|
||||
row["type"] = folder.Type;
|
||||
row["version"] = folder.Version;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="row"></param>
|
||||
/// <param name="folder"></param>
|
||||
private static void moveFolderRow(DataRow row, InventoryFolderBase folder)
|
||||
{
|
||||
row["UUID"] = folder.ID.ToString();
|
||||
row["parentID"] = folder.ParentID.ToString();
|
||||
}
|
||||
|
||||
public List<InventoryItemBase> fetchActiveGestures (UUID avatarID)
|
||||
{
|
||||
lock (ds)
|
||||
{
|
||||
List<InventoryItemBase> items = new List<InventoryItemBase>();
|
||||
|
||||
DataTable inventoryItemTable = ds.Tables["inventoryitems"];
|
||||
string selectExp
|
||||
= "avatarID = '" + avatarID + "' AND assetType = " + (int)AssetType.Gesture + " AND flags = 1";
|
||||
//m_log.DebugFormat("[SQL]: sql = " + selectExp);
|
||||
DataRow[] rows = inventoryItemTable.Select(selectExp);
|
||||
foreach (DataRow row in rows)
|
||||
{
|
||||
items.Add(buildItem(row));
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,81 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using Mono.Data.SqliteClient;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
{
|
||||
public class SQLiteUserAccountData : SQLiteGenericTableHandler<UserAccountData>, IUserAccountData
|
||||
{
|
||||
public SQLiteUserAccountData(string connectionString, string realm)
|
||||
: base(connectionString, realm, "UserAccount")
|
||||
{
|
||||
}
|
||||
|
||||
public UserAccountData[] GetUsers(UUID scopeID, string query)
|
||||
{
|
||||
string[] words = query.Split(new char[] {' '});
|
||||
|
||||
for (int i = 0 ; i < words.Length ; i++)
|
||||
{
|
||||
if (words[i].Length < 3)
|
||||
{
|
||||
if (i != words.Length - 1)
|
||||
Array.Copy(words, i + 1, words, i, words.Length - i - 1);
|
||||
Array.Resize(ref words, words.Length - 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (words.Length == 0)
|
||||
return new UserAccountData[0];
|
||||
|
||||
if (words.Length > 2)
|
||||
return new UserAccountData[0];
|
||||
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
if (words.Length == 1)
|
||||
{
|
||||
cmd.CommandText = String.Format("select * from {0} where (ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{2}%')",
|
||||
m_Realm, scopeID.ToString(), words[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd.CommandText = String.Format("select * from {0} where (ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{3}%')",
|
||||
m_Realm, scopeID.ToString(), words[0], words[1]);
|
||||
}
|
||||
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,307 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Data;
|
||||
using Mono.Data.SqliteClient;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
{
|
||||
/// <summary>
|
||||
/// A base class for methods needed by all SQLite database classes
|
||||
/// </summary>
|
||||
public class SQLiteUtil
|
||||
{
|
||||
/***********************************************************************
|
||||
*
|
||||
* Database Definition Helper Functions
|
||||
*
|
||||
* This should be db agnostic as we define them in ADO.NET terms
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="dt"></param>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="type"></param>
|
||||
public static void createCol(DataTable dt, string name, Type type)
|
||||
{
|
||||
DataColumn col = new DataColumn(name, type);
|
||||
dt.Columns.Add(col);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* SQL Statement Creation Functions
|
||||
*
|
||||
* These functions create SQL statements for update, insert, and create.
|
||||
* They can probably be factored later to have a db independant
|
||||
* portion and a db specific portion
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
/// <summary>
|
||||
/// Create an insert command
|
||||
/// </summary>
|
||||
/// <param name="table">table name</param>
|
||||
/// <param name="dt">data table</param>
|
||||
/// <returns>the created command</returns>
|
||||
/// <remarks>
|
||||
/// This is subtle enough to deserve some commentary.
|
||||
/// Instead of doing *lots* and *lots of hardcoded strings
|
||||
/// for database definitions we'll use the fact that
|
||||
/// realistically all insert statements look like "insert
|
||||
/// into A(b, c) values(:b, :c) on the parameterized query
|
||||
/// front. If we just have a list of b, c, etc... we can
|
||||
/// generate these strings instead of typing them out.
|
||||
/// </remarks>
|
||||
public static SqliteCommand createInsertCommand(string table, DataTable dt)
|
||||
{
|
||||
|
||||
string[] cols = new string[dt.Columns.Count];
|
||||
for (int i = 0; i < dt.Columns.Count; i++)
|
||||
{
|
||||
DataColumn col = dt.Columns[i];
|
||||
cols[i] = col.ColumnName;
|
||||
}
|
||||
|
||||
string sql = "insert into " + table + "(";
|
||||
sql += String.Join(", ", cols);
|
||||
// important, the first ':' needs to be here, the rest get added in the join
|
||||
sql += ") values (:";
|
||||
sql += String.Join(", :", cols);
|
||||
sql += ")";
|
||||
SqliteCommand cmd = new SqliteCommand(sql);
|
||||
|
||||
// this provides the binding for all our parameters, so
|
||||
// much less code than it used to be
|
||||
foreach (DataColumn col in dt.Columns)
|
||||
{
|
||||
cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType));
|
||||
}
|
||||
return cmd;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// create an update command
|
||||
/// </summary>
|
||||
/// <param name="table">table name</param>
|
||||
/// <param name="pk"></param>
|
||||
/// <param name="dt"></param>
|
||||
/// <returns>the created command</returns>
|
||||
public static SqliteCommand createUpdateCommand(string table, string pk, DataTable dt)
|
||||
{
|
||||
string sql = "update " + table + " set ";
|
||||
string subsql = String.Empty;
|
||||
foreach (DataColumn col in dt.Columns)
|
||||
{
|
||||
if (subsql.Length > 0)
|
||||
{
|
||||
// a map function would rock so much here
|
||||
subsql += ", ";
|
||||
}
|
||||
subsql += col.ColumnName + "= :" + col.ColumnName;
|
||||
}
|
||||
sql += subsql;
|
||||
sql += " where " + pk;
|
||||
SqliteCommand cmd = new SqliteCommand(sql);
|
||||
|
||||
// this provides the binding for all our parameters, so
|
||||
// much less code than it used to be
|
||||
|
||||
foreach (DataColumn col in dt.Columns)
|
||||
{
|
||||
cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType));
|
||||
}
|
||||
return cmd;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="dt">Data Table</param>
|
||||
/// <returns></returns>
|
||||
public static string defineTable(DataTable dt)
|
||||
{
|
||||
string sql = "create table " + dt.TableName + "(";
|
||||
string subsql = String.Empty;
|
||||
foreach (DataColumn col in dt.Columns)
|
||||
{
|
||||
if (subsql.Length > 0)
|
||||
{
|
||||
// a map function would rock so much here
|
||||
subsql += ",\n";
|
||||
}
|
||||
subsql += col.ColumnName + " " + sqliteType(col.DataType);
|
||||
if (dt.PrimaryKey.Length > 0)
|
||||
{
|
||||
if (col == dt.PrimaryKey[0])
|
||||
{
|
||||
subsql += " primary key";
|
||||
}
|
||||
}
|
||||
}
|
||||
sql += subsql;
|
||||
sql += ")";
|
||||
return sql;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Database Binding functions
|
||||
*
|
||||
* These will be db specific due to typing, and minor differences
|
||||
* in databases.
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
///<summary>
|
||||
/// <para>
|
||||
/// This is a convenience function that collapses 5 repetitive
|
||||
/// lines for defining SqliteParameters to 2 parameters:
|
||||
/// column name and database type.
|
||||
/// </para>
|
||||
///
|
||||
/// <para>
|
||||
/// It assumes certain conventions like :param as the param
|
||||
/// name to replace in parametrized queries, and that source
|
||||
/// version is always current version, both of which are fine
|
||||
/// for us.
|
||||
/// </para>
|
||||
///</summary>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="type"></param>
|
||||
///<returns>a built sqlite parameter</returns>
|
||||
public static SqliteParameter createSqliteParameter(string name, Type type)
|
||||
{
|
||||
SqliteParameter param = new SqliteParameter();
|
||||
param.ParameterName = ":" + name;
|
||||
param.DbType = dbtypeFromType(type);
|
||||
param.SourceColumn = name;
|
||||
param.SourceVersion = DataRowVersion.Current;
|
||||
return param;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Type conversion functions
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
/// <summary>
|
||||
/// Type conversion function
|
||||
/// </summary>
|
||||
/// <param name="type">a type</param>
|
||||
/// <returns>a DbType</returns>
|
||||
public static DbType dbtypeFromType(Type type)
|
||||
{
|
||||
if (type == typeof (String))
|
||||
{
|
||||
return DbType.String;
|
||||
}
|
||||
else if (type == typeof (Int32))
|
||||
{
|
||||
return DbType.Int32;
|
||||
}
|
||||
else if (type == typeof (UInt32))
|
||||
{
|
||||
return DbType.UInt32;
|
||||
}
|
||||
else if (type == typeof (Int64))
|
||||
{
|
||||
return DbType.Int64;
|
||||
}
|
||||
else if (type == typeof (UInt64))
|
||||
{
|
||||
return DbType.UInt64;
|
||||
}
|
||||
else if (type == typeof (Double))
|
||||
{
|
||||
return DbType.Double;
|
||||
}
|
||||
else if (type == typeof (Boolean))
|
||||
{
|
||||
return DbType.Boolean;
|
||||
}
|
||||
else if (type == typeof (Byte[]))
|
||||
{
|
||||
return DbType.Binary;
|
||||
}
|
||||
else
|
||||
{
|
||||
return DbType.String;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// </summary>
|
||||
/// <param name="type">a Type</param>
|
||||
/// <returns>a string</returns>
|
||||
/// <remarks>this is something we'll need to implement for each db slightly differently.</remarks>
|
||||
public static string sqliteType(Type type)
|
||||
{
|
||||
if (type == typeof (String))
|
||||
{
|
||||
return "varchar(255)";
|
||||
}
|
||||
else if (type == typeof (Int32))
|
||||
{
|
||||
return "integer";
|
||||
}
|
||||
else if (type == typeof (UInt32))
|
||||
{
|
||||
return "integer";
|
||||
}
|
||||
else if (type == typeof (Int64))
|
||||
{
|
||||
return "varchar(255)";
|
||||
}
|
||||
else if (type == typeof (UInt64))
|
||||
{
|
||||
return "varchar(255)";
|
||||
}
|
||||
else if (type == typeof (Double))
|
||||
{
|
||||
return "float";
|
||||
}
|
||||
else if (type == typeof (Boolean))
|
||||
{
|
||||
return "integer";
|
||||
}
|
||||
else if (type == typeof (Byte[]))
|
||||
{
|
||||
return "blob";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "string";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,155 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using System.Collections.Generic;
|
||||
using Mono.Data.SqliteClient;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
{
|
||||
/// <summary>
|
||||
/// A MySQL Interface for the Asset Server
|
||||
/// </summary>
|
||||
public class SQLiteXInventoryData : IXInventoryData
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private SQLiteGenericTableHandler<XInventoryFolder> m_Folders;
|
||||
private SqliteItemHandler m_Items;
|
||||
|
||||
public SQLiteXInventoryData(string conn, string realm)
|
||||
{
|
||||
m_Folders = new SQLiteGenericTableHandler<XInventoryFolder>(
|
||||
conn, "inventoryfolders", "InventoryStore");
|
||||
m_Items = new SqliteItemHandler(
|
||||
conn, "inventoryitems", String.Empty);
|
||||
}
|
||||
|
||||
public XInventoryFolder[] GetFolders(string[] fields, string[] vals)
|
||||
{
|
||||
return m_Folders.Get(fields, vals);
|
||||
}
|
||||
|
||||
public XInventoryItem[] GetItems(string[] fields, string[] vals)
|
||||
{
|
||||
return m_Items.Get(fields, vals);
|
||||
}
|
||||
|
||||
public bool StoreFolder(XInventoryFolder folder)
|
||||
{
|
||||
return m_Folders.Store(folder);
|
||||
}
|
||||
|
||||
public bool StoreItem(XInventoryItem item)
|
||||
{
|
||||
return m_Items.Store(item);
|
||||
}
|
||||
|
||||
public bool DeleteFolders(string field, string val)
|
||||
{
|
||||
return m_Folders.Delete(field, val);
|
||||
}
|
||||
|
||||
public bool DeleteItems(string field, string val)
|
||||
{
|
||||
return m_Items.Delete(field, val);
|
||||
}
|
||||
|
||||
public bool MoveItem(string id, string newParent)
|
||||
{
|
||||
return m_Items.MoveItem(id, newParent);
|
||||
}
|
||||
|
||||
public XInventoryItem[] GetActiveGestures(UUID principalID)
|
||||
{
|
||||
return m_Items.GetActiveGestures(principalID);
|
||||
}
|
||||
|
||||
public int GetAssetPermissions(UUID principalID, UUID assetID)
|
||||
{
|
||||
return m_Items.GetAssetPermissions(principalID, assetID);
|
||||
}
|
||||
}
|
||||
|
||||
public class SqliteItemHandler : SQLiteGenericTableHandler<XInventoryItem>
|
||||
{
|
||||
public SqliteItemHandler(string c, string t, string m) :
|
||||
base(c, t, m)
|
||||
{
|
||||
}
|
||||
|
||||
public bool MoveItem(string id, string newParent)
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
cmd.CommandText = String.Format("update {0} set parentFolderID = :ParentFolderID where inventoryID = :InventoryID", m_Realm);
|
||||
cmd.Parameters.Add(new SqliteParameter(":ParentFolderID", newParent));
|
||||
cmd.Parameters.Add(new SqliteParameter(":InventoryID", id));
|
||||
|
||||
return ExecuteNonQuery(cmd, m_Connection) == 0 ? false : true;
|
||||
}
|
||||
|
||||
public XInventoryItem[] GetActiveGestures(UUID principalID)
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
cmd.CommandText = String.Format("select * from inventoryitems where avatarId = :uuid and assetType = :type and flags = 1", m_Realm);
|
||||
|
||||
cmd.Parameters.Add(new SqliteParameter(":uuid", principalID.ToString()));
|
||||
cmd.Parameters.Add(new SqliteParameter(":type", (int)AssetType.Gesture));
|
||||
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
|
||||
public int GetAssetPermissions(UUID principalID, UUID assetID)
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
cmd.CommandText = String.Format("select inventoryCurrentPermissions from inventoryitems where avatarID = :PrincipalID and assetID = :AssetID", m_Realm);
|
||||
cmd.Parameters.Add(new SqliteParameter(":PrincipalID", principalID.ToString()));
|
||||
cmd.Parameters.Add(new SqliteParameter(":AssetID", assetID.ToString()));
|
||||
|
||||
IDataReader reader = ExecuteReader(cmd, m_Connection);
|
||||
|
||||
int perms = 0;
|
||||
|
||||
while (reader.Read())
|
||||
{
|
||||
perms |= Convert.ToInt32(reader["inventoryCurrentPermissions"]);
|
||||
}
|
||||
|
||||
reader.Close();
|
||||
CloseCommand(cmd);
|
||||
|
||||
return perms;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -32,13 +32,10 @@ using NUnit.Framework;
|
|||
using NUnit.Framework.Constraints;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Tests.Common;
|
||||
using System.Data.Common;
|
||||
using log4net;
|
||||
|
||||
#if !NUNIT25
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
#endif
|
||||
|
||||
// DBMS-specific:
|
||||
using MySql.Data.MySqlClient;
|
||||
using OpenSim.Data.MySQL;
|
||||
|
@ -51,15 +48,6 @@ using OpenSim.Data.SQLite;
|
|||
|
||||
namespace OpenSim.Data.Tests
|
||||
{
|
||||
|
||||
#if NUNIT25
|
||||
|
||||
[TestFixture(typeof(MySqlConnection), typeof(MySQLAssetData), Description="Basic Asset store tests (MySQL)")]
|
||||
[TestFixture(typeof(SqlConnection), typeof(MSSQLAssetData), Description = "Basic Asset store tests (MS SQL Server)")]
|
||||
[TestFixture(typeof(SqliteConnection), typeof(SQLiteAssetData), Description = "Basic Asset store tests (SQLite)")]
|
||||
|
||||
#else
|
||||
|
||||
[TestFixture(Description = "Asset store tests (SQLite)")]
|
||||
public class SQLiteAssetTests : AssetTests<SqliteConnection, SQLiteAssetData>
|
||||
{
|
||||
|
@ -75,9 +63,6 @@ namespace OpenSim.Data.Tests
|
|||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
public class AssetTests<TConn, TAssetData> : BasicDataServiceTest<TConn, TAssetData>
|
||||
where TConn : DbConnection, new()
|
||||
where TAssetData : AssetDataBase, new()
|
||||
|
@ -121,6 +106,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T001_LoadEmpty()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
Assert.That(m_db.ExistsAsset(uuid1), Is.False);
|
||||
Assert.That(m_db.ExistsAsset(uuid2), Is.False);
|
||||
Assert.That(m_db.ExistsAsset(uuid3), Is.False);
|
||||
|
@ -129,6 +116,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T010_StoreReadVerifyAssets()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
AssetBase a1 = new AssetBase(uuid1, "asset one", (sbyte)AssetType.Texture, critter1.ToString());
|
||||
AssetBase a2 = new AssetBase(uuid2, "asset two", (sbyte)AssetType.Texture, critter2.ToString());
|
||||
AssetBase a3 = new AssetBase(uuid3, "asset three", (sbyte)AssetType.Texture, critter3.ToString());
|
||||
|
@ -194,6 +183,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T020_CheckForWeirdCreatorID()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
// It is expected that eventually the CreatorID might be an arbitrary string (an URI)
|
||||
// rather than a valid UUID (?). This test is to make sure that the database layer does not
|
||||
// attempt to convert CreatorID to GUID, but just passes it both ways as a string.
|
||||
|
@ -218,4 +209,4 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(a3a, Constraints.PropertyCompareConstraint(a3));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,10 +28,10 @@
|
|||
using System;
|
||||
using log4net.Config;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Tests.Common;
|
||||
using System.Text;
|
||||
using log4net;
|
||||
using System.Reflection;
|
||||
|
@ -49,15 +49,6 @@ using OpenSim.Data.SQLite;
|
|||
|
||||
namespace OpenSim.Data.Tests
|
||||
{
|
||||
|
||||
#if NUNIT25
|
||||
|
||||
[TestFixture(typeof(MySqlConnection), typeof(MySQLEstateStore), Description = "Estate store tests (MySQL)")]
|
||||
[TestFixture(typeof(SqlConnection), typeof(MSSQLEstateStore), Description = "Estate store tests (MS SQL Server)")]
|
||||
[TestFixture(typeof(SqliteConnection), typeof(SQLiteEstateStore), Description = "Estate store tests (SQLite)")]
|
||||
|
||||
#else
|
||||
|
||||
[TestFixture(Description = "Estate store tests (SQLite)")]
|
||||
public class SQLiteEstateTests : EstateTests<SqliteConnection, SQLiteEstateStore>
|
||||
{
|
||||
|
@ -73,8 +64,6 @@ namespace OpenSim.Data.Tests
|
|||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
public class EstateTests<TConn, TEstateStore> : BasicDataServiceTest<TConn, TEstateStore>
|
||||
where TConn : DbConnection, new()
|
||||
where TEstateStore : class, IEstateDataStore, new()
|
||||
|
@ -118,6 +107,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T010_EstateSettingsSimpleStorage_MinimumParameterSet()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
EstateSettingsSimpleStorage(
|
||||
REGION_ID,
|
||||
DataTestUtil.STRING_MIN,
|
||||
|
@ -149,6 +140,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T011_EstateSettingsSimpleStorage_MaximumParameterSet()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
EstateSettingsSimpleStorage(
|
||||
REGION_ID,
|
||||
DataTestUtil.STRING_MAX(64),
|
||||
|
@ -180,6 +173,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T012_EstateSettingsSimpleStorage_AccurateParameterSet()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
EstateSettingsSimpleStorage(
|
||||
REGION_ID,
|
||||
DataTestUtil.STRING_MAX(1),
|
||||
|
@ -211,6 +206,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T012_EstateSettingsRandomStorage()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
// Letting estate store generate rows to database for us
|
||||
EstateSettings originalSettings = db.LoadEstateSettings(REGION_ID, true);
|
||||
new PropertyScrambler<EstateSettings>()
|
||||
|
@ -230,6 +227,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T020_EstateSettingsManagerList()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
// Letting estate store generate rows to database for us
|
||||
EstateSettings originalSettings = db.LoadEstateSettings(REGION_ID, true);
|
||||
|
||||
|
@ -249,6 +248,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T021_EstateSettingsUserList()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
// Letting estate store generate rows to database for us
|
||||
EstateSettings originalSettings = db.LoadEstateSettings(REGION_ID, true);
|
||||
|
||||
|
@ -268,6 +269,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T022_EstateSettingsGroupList()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
// Letting estate store generate rows to database for us
|
||||
EstateSettings originalSettings = db.LoadEstateSettings(REGION_ID, true);
|
||||
|
||||
|
@ -287,6 +290,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T022_EstateSettingsBanList()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
// Letting estate store generate rows to database for us
|
||||
EstateSettings originalSettings = db.LoadEstateSettings(REGION_ID, true);
|
||||
|
||||
|
@ -520,6 +525,5 @@ namespace OpenSim.Data.Tests
|
|||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -25,14 +25,12 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
// #define NUNIT25
|
||||
|
||||
using System;
|
||||
using log4net.Config;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Tests.Common;
|
||||
using log4net;
|
||||
using System.Reflection;
|
||||
using System.Data.Common;
|
||||
|
@ -49,14 +47,6 @@ using OpenSim.Data.SQLite;
|
|||
|
||||
namespace OpenSim.Data.Tests
|
||||
{
|
||||
#if NUNIT25
|
||||
|
||||
[TestFixture(typeof(SqliteConnection), typeof(SQLiteInventoryStore), Description = "Inventory store tests (SQLite)")]
|
||||
[TestFixture(typeof(MySqlConnection), typeof(MySQLInventoryData), Description = "Inventory store tests (MySQL)")]
|
||||
[TestFixture(typeof(SqlConnection), typeof(MSSQLInventoryData), Description = "Inventory store tests (MS SQL Server)")]
|
||||
|
||||
#else
|
||||
|
||||
[TestFixture(Description = "Inventory store tests (SQLite)")]
|
||||
public class SQLiteInventoryTests : InventoryTests<SqliteConnection, SQLiteInventoryStore>
|
||||
{
|
||||
|
@ -71,7 +61,6 @@ namespace OpenSim.Data.Tests
|
|||
public class MSSQLInventoryTests : InventoryTests<SqlConnection, MSSQLInventoryData>
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
public class InventoryTests<TConn, TInvStore> : BasicDataServiceTest<TConn, TInvStore>
|
||||
where TConn : DbConnection, new()
|
||||
|
@ -125,6 +114,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T001_LoadEmpty()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
Assert.That(db.getInventoryFolder(zero), Is.Null);
|
||||
Assert.That(db.getInventoryFolder(folder1), Is.Null);
|
||||
Assert.That(db.getInventoryFolder(folder2), Is.Null);
|
||||
|
@ -143,6 +134,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T010_FolderNonParent()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
InventoryFolderBase f1 = NewFolder(folder2, folder1, owner1, name2);
|
||||
// the folder will go in
|
||||
db.addInventoryFolder(f1);
|
||||
|
@ -153,6 +146,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T011_FolderCreate()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
InventoryFolderBase f1 = NewFolder(folder1, zero, owner1, name1);
|
||||
// TODO: this is probably wrong behavior, but is what we have
|
||||
// db.updateInventoryFolder(f1);
|
||||
|
@ -165,7 +160,7 @@ namespace OpenSim.Data.Tests
|
|||
db.addInventoryFolder(f1);
|
||||
InventoryFolderBase f1a = db.getUserRootFolder(owner1);
|
||||
Assert.That(folder1, Is.EqualTo(f1a.ID), "Assert.That(folder1, Is.EqualTo(f1a.ID))");
|
||||
Assert.That(name1, Text.Matches(f1a.Name), "Assert.That(name1, Text.Matches(f1a.Name))");
|
||||
Assert.That(name1, Is.StringMatching(f1a.Name), "Assert.That(name1, Text.Matches(f1a.Name))");
|
||||
}
|
||||
|
||||
// we now have the following tree
|
||||
|
@ -176,6 +171,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T012_FolderList()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
InventoryFolderBase f2 = NewFolder(folder3, folder1, owner1, name3);
|
||||
db.addInventoryFolder(f2);
|
||||
|
||||
|
@ -190,6 +187,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T013_FolderHierarchy()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
int n = db.getFolderHierarchy(zero).Count; // (for dbg - easier to see what's returned)
|
||||
Assert.That(n, Is.EqualTo(0), "Assert.That(db.getFolderHierarchy(zero).Count, Is.EqualTo(0))");
|
||||
n = db.getFolderHierarchy(folder1).Count;
|
||||
|
@ -203,6 +202,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T014_MoveFolder()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
InventoryFolderBase f2 = db.getInventoryFolder(folder2);
|
||||
f2.ParentID = folder3;
|
||||
db.moveInventoryFolder(f2);
|
||||
|
@ -217,6 +218,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T015_FolderHierarchy()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
Assert.That(db.getFolderHierarchy(zero).Count, Is.EqualTo(0), "Assert.That(db.getFolderHierarchy(zero).Count, Is.EqualTo(0))");
|
||||
Assert.That(db.getFolderHierarchy(folder1).Count, Is.EqualTo(2), "Assert.That(db.getFolderHierarchy(folder1).Count, Is.EqualTo(2))");
|
||||
Assert.That(db.getFolderHierarchy(folder2).Count, Is.EqualTo(0), "Assert.That(db.getFolderHierarchy(folder2).Count, Is.EqualTo(0))");
|
||||
|
@ -228,6 +231,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T100_NoItems()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
Assert.That(db.getInventoryInFolder(zero).Count, Is.EqualTo(0), "Assert.That(db.getInventoryInFolder(zero).Count, Is.EqualTo(0))");
|
||||
Assert.That(db.getInventoryInFolder(folder1).Count, Is.EqualTo(0), "Assert.That(db.getInventoryInFolder(folder1).Count, Is.EqualTo(0))");
|
||||
Assert.That(db.getInventoryInFolder(folder2).Count, Is.EqualTo(0), "Assert.That(db.getInventoryInFolder(folder2).Count, Is.EqualTo(0))");
|
||||
|
@ -240,6 +245,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T101_CreatItems()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
db.addInventoryItem(NewItem(item1, folder3, owner1, iname1, asset1));
|
||||
db.addInventoryItem(NewItem(item2, folder3, owner1, iname2, asset2));
|
||||
db.addInventoryItem(NewItem(item3, folder3, owner1, iname3, asset3));
|
||||
|
@ -249,6 +256,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T102_CompareItems()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
InventoryItemBase i1 = db.getInventoryItem(item1);
|
||||
InventoryItemBase i2 = db.getInventoryItem(item2);
|
||||
InventoryItemBase i3 = db.getInventoryItem(item3);
|
||||
|
@ -266,6 +275,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T103_UpdateItem()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
// TODO: probably shouldn't have the ability to have an
|
||||
// owner of an item in a folder not owned by the user
|
||||
|
||||
|
@ -284,6 +295,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T104_RandomUpdateItem()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
PropertyScrambler<InventoryFolderBase> folderScrambler =
|
||||
new PropertyScrambler<InventoryFolderBase>()
|
||||
.DontScramble(x => x.Owner)
|
||||
|
@ -341,6 +354,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T999_StillNull()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
// After all tests are run, these should still return no results
|
||||
Assert.That(db.getInventoryFolder(zero), Is.Null);
|
||||
Assert.That(db.getInventoryItem(zero), Is.Null);
|
||||
|
|
|
@ -34,7 +34,6 @@ using System.Linq.Expressions;
|
|||
using System.Reflection;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.Constraints;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
|
|
|
@ -32,13 +32,11 @@ using System.Linq.Expressions;
|
|||
using System.Reflection;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
namespace OpenSim.Data.Tests
|
||||
{
|
||||
|
||||
//This is generic so that the lambda expressions will work right in IDEs.
|
||||
public class PropertyScrambler<T>
|
||||
{
|
||||
|
|
|
@ -31,11 +31,11 @@ using System.Drawing;
|
|||
using System.Text;
|
||||
using log4net.Config;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Tests.Common;
|
||||
using log4net;
|
||||
using System.Reflection;
|
||||
using System.Data.Common;
|
||||
|
@ -52,14 +52,6 @@ using OpenSim.Data.SQLite;
|
|||
|
||||
namespace OpenSim.Data.Tests
|
||||
{
|
||||
#if NUNIT25
|
||||
|
||||
[TestFixture(typeof(SqliteConnection), typeof(SQLiteRegionData), Description = "Region store tests (SQLite)")]
|
||||
[TestFixture(typeof(MySqlConnection), typeof(MySqlRegionData), Description = "Region store tests (MySQL)")]
|
||||
[TestFixture(typeof(SqlConnection), typeof(MSSQLRegionData), Description = "Region store tests (MS SQL Server)")]
|
||||
|
||||
#else
|
||||
|
||||
[TestFixture(Description = "Region store tests (SQLite)")]
|
||||
public class SQLiteRegionTests : RegionTests<SqliteConnection, SQLiteSimulationData>
|
||||
{
|
||||
|
@ -75,8 +67,6 @@ namespace OpenSim.Data.Tests
|
|||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
public class RegionTests<TConn, TRegStore> : BasicDataServiceTest<TConn, TRegStore>
|
||||
where TConn : DbConnection, new()
|
||||
where TRegStore : class, ISimulationDataStore, new()
|
||||
|
@ -131,15 +121,18 @@ namespace OpenSim.Data.Tests
|
|||
string[] reg_tables = new string[] {
|
||||
"prims", "primshapes", "primitems", "terrain", "land", "landaccesslist", "regionban", "regionsettings"
|
||||
};
|
||||
|
||||
if (m_rebuildDB)
|
||||
{
|
||||
DropTables(reg_tables);
|
||||
ResetMigrations("RegionStore");
|
||||
}else
|
||||
}
|
||||
else
|
||||
{
|
||||
ClearTables(reg_tables);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Test Plan
|
||||
// Prims
|
||||
// - empty test - 001
|
||||
|
@ -158,6 +151,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T001_LoadEmpty()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
List<SceneObjectGroup> objs = db.LoadObjects(region1);
|
||||
List<SceneObjectGroup> objs3 = db.LoadObjects(region3);
|
||||
List<LandData> land = db.LoadLandObjects(region1);
|
||||
|
@ -174,6 +169,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T010_StoreSimpleObject()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
SceneObjectGroup sog = NewSOG("object1", prim1, region1);
|
||||
SceneObjectGroup sog2 = NewSOG("object2", prim2, region1);
|
||||
|
||||
|
@ -207,6 +204,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T011_ObjectNames()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
List<SceneObjectGroup> objs = db.LoadObjects(region1);
|
||||
foreach (SceneObjectGroup sog in objs)
|
||||
{
|
||||
|
@ -219,6 +218,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T012_SceneParts()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
UUID tmp0 = UUID.Random();
|
||||
UUID tmp1 = UUID.Random();
|
||||
UUID tmp2 = UUID.Random();
|
||||
|
@ -252,6 +253,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T013_DatabasePersistency()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
// Sets all ScenePart parameters, stores and retrieves them, then check for consistency with initial data
|
||||
// The commented Asserts are the ones that are unchangeable (when storing on the database, their "Set" values are ignored
|
||||
// The ObjectFlags is an exception, if it is entered incorrectly, the object IS REJECTED on the database silently.
|
||||
|
@ -427,6 +430,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T014_UpdateObject()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
string text1 = "object1 text";
|
||||
SceneObjectGroup sog = FindSOG("object1", region1);
|
||||
sog.RootPart.Text = text1;
|
||||
|
@ -528,15 +533,20 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(clickaction,Is.EqualTo(p.ClickAction), "Assert.That(clickaction,Is.EqualTo(p.ClickAction))");
|
||||
Assert.That(scale,Is.EqualTo(p.Scale), "Assert.That(scale,Is.EqualTo(p.Scale))");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Test storage and retrieval of a scene object with a large number of parts.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void T015_LargeSceneObjects()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
UUID id = UUID.Random();
|
||||
Dictionary<UUID, SceneObjectPart> mydic = new Dictionary<UUID, SceneObjectPart>();
|
||||
SceneObjectGroup sog = NewSOG("Test SOG", id, region4);
|
||||
mydic.Add(sog.RootPart.UUID,sog.RootPart);
|
||||
for (int i=0;i<30;i++)
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
UUID tmp = UUID.Random();
|
||||
SceneObjectPart sop = NewSOP(("Test SOP " + i.ToString()),tmp);
|
||||
|
@ -555,13 +565,14 @@ namespace OpenSim.Data.Tests
|
|||
sop.Acceleration = accel;
|
||||
|
||||
mydic.Add(tmp,sop);
|
||||
sog.AddPart(sop);
|
||||
db.StoreObject(sog, region4);
|
||||
sog.AddPart(sop);
|
||||
}
|
||||
|
||||
db.StoreObject(sog, region4);
|
||||
|
||||
SceneObjectGroup retsog = FindSOG("Test SOG", region4);
|
||||
SceneObjectPart[] parts = retsog.Parts;
|
||||
for (int i=0;i<30;i++)
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
SceneObjectPart cursop = mydic[parts[i].UUID];
|
||||
Assert.That(cursop.GroupPosition,Is.EqualTo(parts[i].GroupPosition), "Assert.That(cursop.GroupPosition,Is.EqualTo(parts[i].GroupPosition))");
|
||||
|
@ -576,6 +587,8 @@ namespace OpenSim.Data.Tests
|
|||
//[Test]
|
||||
public void T016_RandomSogWithSceneParts()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
PropertyScrambler<SceneObjectPart> scrambler =
|
||||
new PropertyScrambler<SceneObjectPart>()
|
||||
.DontScramble(x => x.UUID);
|
||||
|
@ -642,15 +655,16 @@ namespace OpenSim.Data.Tests
|
|||
return sog;
|
||||
}
|
||||
|
||||
|
||||
// NOTE: it is a bad practice to rely on some of the previous tests having been run before.
|
||||
// If the tests are run manually, one at a time, each starts with full class init (DB cleared).
|
||||
// Even when all tests are run, NUnit 2.5+ no longer guarantee a specific test order.
|
||||
// We shouldn't expect to find anything in the DB if we haven't put it there *in the same test*!
|
||||
|
||||
|
||||
[Test]
|
||||
public void T020_PrimInventoryEmpty()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
SceneObjectGroup sog = GetMySOG("object1");
|
||||
TaskInventoryItem t = sog.GetInventoryItem(sog.RootPart.LocalId, item1);
|
||||
Assert.That(t, Is.Null);
|
||||
|
@ -670,10 +684,11 @@ namespace OpenSim.Data.Tests
|
|||
db.StorePrimInventory(sog.RootPart.UUID, list);
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void T021_PrimInventoryBasic()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
SceneObjectGroup sog = GetMySOG("object1");
|
||||
InventoryItemBase i = NewItem(item1, zero, zero, itemname1, zero);
|
||||
|
||||
|
@ -701,20 +716,19 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(t2.Name, Is.EqualTo("My New Name"), "Assert.That(t.Name, Is.EqualTo(\"My New Name\"))");
|
||||
|
||||
// Removing inventory
|
||||
|
||||
List<TaskInventoryItem> list = new List<TaskInventoryItem>();
|
||||
db.StorePrimInventory(prim1, list);
|
||||
|
||||
sog = FindSOG("object1", region1);
|
||||
t = sog.GetInventoryItem(sog.RootPart.LocalId, item1);
|
||||
Assert.That(t, Is.Null);
|
||||
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void T025_PrimInventoryPersistency()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
InventoryItemBase i = new InventoryItemBase();
|
||||
UUID id = UUID.Random();
|
||||
i.ID = id;
|
||||
|
@ -786,6 +800,8 @@ namespace OpenSim.Data.Tests
|
|||
[ExpectedException(typeof(ArgumentException))]
|
||||
public void T026_PrimInventoryMany()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
UUID i1,i2,i3,i4;
|
||||
i1 = UUID.Random();
|
||||
i2 = UUID.Random();
|
||||
|
@ -816,15 +832,18 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T052_RemoveObject()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
db.RemoveObject(prim1, region1);
|
||||
SceneObjectGroup sog = FindSOG("object1", region1);
|
||||
Assert.That(sog, Is.Null);
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void T100_DefaultRegionInfo()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
RegionSettings r1 = db.LoadRegionSettings(region1);
|
||||
Assert.That(r1.RegionUUID, Is.EqualTo(region1), "Assert.That(r1.RegionUUID, Is.EqualTo(region1))");
|
||||
|
||||
|
@ -835,6 +854,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T101_UpdateRegionInfo()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
int agentlimit = random.Next();
|
||||
double objectbonus = random.Next();
|
||||
int maturity = random.Next();
|
||||
|
@ -933,13 +954,14 @@ namespace OpenSim.Data.Tests
|
|||
//Assert.That(r1a.TerrainImageID,Is.EqualTo(terimgid), "Assert.That(r1a.TerrainImageID,Is.EqualTo(terimgid))");
|
||||
Assert.That(r1a.FixedSun,Is.True);
|
||||
Assert.That(r1a.SunPosition, Is.EqualTo(sunpos), "Assert.That(r1a.SunPosition, Is.EqualTo(sunpos))");
|
||||
Assert.That(r1a.Covenant, Is.EqualTo(cov), "Assert.That(r1a.Covenant, Is.EqualTo(cov))");
|
||||
|
||||
Assert.That(r1a.Covenant, Is.EqualTo(cov), "Assert.That(r1a.Covenant, Is.EqualTo(cov))");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T300_NoTerrain()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
Assert.That(db.LoadTerrain(zero), Is.Null);
|
||||
Assert.That(db.LoadTerrain(region1), Is.Null);
|
||||
Assert.That(db.LoadTerrain(region2), Is.Null);
|
||||
|
@ -949,6 +971,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T301_CreateTerrain()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
double[,] t1 = GenTerrain(height1);
|
||||
db.StoreTerrain(t1, region1);
|
||||
|
||||
|
@ -961,6 +985,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T302_FetchTerrain()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
double[,] baseterrain1 = GenTerrain(height1);
|
||||
double[,] baseterrain2 = GenTerrain(height2);
|
||||
double[,] t1 = db.LoadTerrain(region1);
|
||||
|
@ -971,6 +997,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T303_UpdateTerrain()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
double[,] baseterrain1 = GenTerrain(height1);
|
||||
double[,] baseterrain2 = GenTerrain(height2);
|
||||
db.StoreTerrain(baseterrain2, region1);
|
||||
|
@ -983,6 +1011,8 @@ namespace OpenSim.Data.Tests
|
|||
[Test]
|
||||
public void T400_EmptyLand()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
Assert.That(db.LoadLandObjects(zero).Count, Is.EqualTo(0), "Assert.That(db.LoadLandObjects(zero).Count, Is.EqualTo(0))");
|
||||
Assert.That(db.LoadLandObjects(region1).Count, Is.EqualTo(0), "Assert.That(db.LoadLandObjects(region1).Count, Is.EqualTo(0))");
|
||||
Assert.That(db.LoadLandObjects(region2).Count, Is.EqualTo(0), "Assert.That(db.LoadLandObjects(region2).Count, Is.EqualTo(0))");
|
||||
|
@ -1018,25 +1048,12 @@ namespace OpenSim.Data.Tests
|
|||
return true;
|
||||
}
|
||||
|
||||
|
||||
private SceneObjectGroup FindSOG(string name, UUID r)
|
||||
{
|
||||
List<SceneObjectGroup> objs = db.LoadObjects(r);
|
||||
foreach (SceneObjectGroup sog in objs)
|
||||
{
|
||||
SceneObjectPart p = sog.RootPart;
|
||||
if (p.Name == name) {
|
||||
RegionInfo regionInfo = new RegionInfo();
|
||||
regionInfo.RegionID = r;
|
||||
regionInfo.RegionLocX = 0;
|
||||
regionInfo.RegionLocY = 0;
|
||||
|
||||
Scene scene = new Scene(regionInfo);
|
||||
sog.SetScene(scene);
|
||||
|
||||
if (sog.Name == name)
|
||||
return sog;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -1143,7 +1143,17 @@ namespace OpenSim.Framework
|
|||
void SendDetailedEstateData(UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags,
|
||||
uint sunPosition, UUID covenant, string abuseEmail, UUID estateOwner);
|
||||
|
||||
void SendLandProperties(int sequence_id, bool snap_selection, int request_result, LandData landData,
|
||||
/// <summary>
|
||||
/// Send land properties to the client.
|
||||
/// </summary>
|
||||
/// <param name="sequence_id"></param>
|
||||
/// <param name="snap_selection"></param>
|
||||
/// <param name="request_result"></param>
|
||||
/// <param name="lo"></param></param>
|
||||
/// <param name="parcelObjectCapacity">/param>
|
||||
/// <param name="simObjectCapacity"></param>
|
||||
/// <param name="regionFlags"></param>
|
||||
void SendLandProperties(int sequence_id, bool snap_selection, int request_result, ILandObject lo,
|
||||
float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity,
|
||||
uint regionFlags);
|
||||
|
||||
|
|
|
@ -77,7 +77,6 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// </param>
|
||||
void Clear(bool setupDefaultParcel);
|
||||
|
||||
bool IsLandPrimCountTainted();
|
||||
bool IsForcefulBansAllowed();
|
||||
void UpdateLandObject(int localID, LandData data);
|
||||
void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient);
|
|
@ -27,10 +27,8 @@
|
|||
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.Framework.Interfaces
|
||||
namespace OpenSim.Framework
|
||||
{
|
||||
public delegate int overrideParcelMaxPrimCountDelegate(ILandObject obj);
|
||||
public delegate int overrideSimulatorMaxPrimCountDelegate(ILandObject obj);
|
||||
|
@ -45,6 +43,11 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
bool[,] LandBitmap { get; set; }
|
||||
UUID RegionUUID { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Prim counts for this land object.
|
||||
/// </summary>
|
||||
IPrimCounts PrimCounts { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The start point for the land object. This is the western-most point as one scans land working from
|
||||
/// north to south.
|
||||
|
@ -79,17 +82,36 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
void ForceUpdateLandInfo();
|
||||
void SetLandBitmap(bool[,] bitmap);
|
||||
|
||||
/// <summary>
|
||||
/// Get a land bitmap that would cover an entire region.
|
||||
/// </summary>
|
||||
/// <returns>The bitmap created.</returns>
|
||||
bool[,] BasicFullRegionLandBitmap();
|
||||
|
||||
/// <summary>
|
||||
/// Create a square land bitmap.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Land co-ordinates are zero indexed. The inputs are treated as points. So if you want to create a bitmap
|
||||
/// that covers an entire 256 x 256m region apart from a strip of land on the east, then you would need to
|
||||
/// specify start_x = 0, start_y = 0, end_x = 252 (or anything up to 255), end_y = 256.
|
||||
///
|
||||
/// At the moment, the smallest parcel of land is 4m x 4m, so if the
|
||||
/// region is 256 x 256m (the SL size), the bitmap returned will start at (0,0) and end at (63,63).
|
||||
/// </remarks>
|
||||
/// <param name="start_x"></param>
|
||||
/// <param name="start_y"></param>
|
||||
/// <param name="end_x"></param>
|
||||
/// <param name="end_y"></param>
|
||||
/// <returns>The bitmap created.</returns>
|
||||
bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y);
|
||||
|
||||
bool[,] ModifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value);
|
||||
bool[,] MergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add);
|
||||
void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client);
|
||||
void SendLandObjectOwners(IClientAPI remote_client);
|
||||
void ReturnObject(SceneObjectGroup obj);
|
||||
void ReturnLandObjects(uint type, UUID[] owners, UUID[] tasks, IClientAPI remote_client);
|
||||
void ResetLandPrimCounts();
|
||||
void AddPrimToCount(SceneObjectGroup obj);
|
||||
void RemovePrimFromCount(SceneObjectGroup obj);
|
||||
void ResetOverMeRecord();
|
||||
void UpdateLandSold(UUID avatarID, UUID groupID, bool groupOwned, uint AuctionID, int claimprice, int area);
|
||||
|
||||
void DeedToGroup(UUID groupID);
|
|
@ -25,50 +25,50 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using Mono.Data.SqliteClient;
|
||||
|
||||
namespace OpenSim.Data.SQLiteLegacy
|
||||
namespace OpenSim.Framework
|
||||
{
|
||||
/// <summary>
|
||||
/// A SQLite Interface for Avatar Data
|
||||
/// </summary>
|
||||
public class SQLiteAvatarData : SQLiteGenericTableHandler<AvatarBaseData>,
|
||||
IAvatarData
|
||||
public interface IPrimCounts
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
/// <summary>
|
||||
/// Parcel owner owned prims
|
||||
/// </summary>
|
||||
int Owner { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Parcel group owned prims
|
||||
/// </summary>
|
||||
int Group { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Prims owned by others (not parcel owner or parcel group).
|
||||
/// </summary>
|
||||
int Others { get; }
|
||||
|
||||
public SQLiteAvatarData(string connectionString, string realm) :
|
||||
base(connectionString, realm, "Avatar")
|
||||
{
|
||||
}
|
||||
|
||||
public bool Delete(UUID principalID, string name)
|
||||
{
|
||||
SqliteCommand cmd = new SqliteCommand();
|
||||
|
||||
cmd.CommandText = String.Format("delete from {0} where `PrincipalID` = :PrincipalID and `Name` = :Name", m_Realm);
|
||||
cmd.Parameters.Add(":PrincipalID", principalID.ToString());
|
||||
cmd.Parameters.Add(":Name", name);
|
||||
|
||||
try
|
||||
{
|
||||
if (ExecuteNonQuery(cmd, m_Connection) > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
CloseCommand(cmd);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Selected prims
|
||||
/// </summary>
|
||||
int Selected { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Total prims on the parcel.
|
||||
/// </summary>
|
||||
int Total { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Prims on the simulator that are owned by the parcel owner, even if they are in other parcels.
|
||||
/// </summary>
|
||||
int Simulator { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Prims per individual users.
|
||||
/// </summary>
|
||||
IUserPrimCounts Users { get; }
|
||||
}
|
||||
}
|
||||
|
||||
public interface IUserPrimCounts
|
||||
{
|
||||
int this[UUID agentID] { get; }
|
||||
}
|
||||
}
|
|
@ -54,12 +54,10 @@ namespace OpenSim.Framework
|
|||
private int _claimPrice = 0; //Unemplemented
|
||||
private UUID _globalID = UUID.Zero;
|
||||
private UUID _groupID = UUID.Zero;
|
||||
private int _groupPrims = 0;
|
||||
private bool _isGroupOwned = false;
|
||||
private byte[] _bitmap = new byte[512];
|
||||
private string _description = String.Empty;
|
||||
|
||||
|
||||
private uint _flags = (uint) ParcelFlags.AllowFly | (uint) ParcelFlags.AllowLandmark |
|
||||
(uint) ParcelFlags.AllowAPrimitiveEntry |
|
||||
(uint) ParcelFlags.AllowDeedToGroup | (uint) ParcelFlags.AllowTerraform |
|
||||
|
@ -72,17 +70,13 @@ namespace OpenSim.Framework
|
|||
private int _localID = 0;
|
||||
private byte _mediaAutoScale = 0;
|
||||
private UUID _mediaID = UUID.Zero;
|
||||
|
||||
private string _mediaURL = String.Empty;
|
||||
private string _musicURL = String.Empty;
|
||||
private int _otherPrims = 0;
|
||||
private UUID _ownerID = UUID.Zero;
|
||||
private int _ownerPrims = 0;
|
||||
private List<ParcelManager.ParcelAccessEntry> _parcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
|
||||
private float _passHours = 0;
|
||||
private int _passPrice = 0;
|
||||
private int _salePrice = 0; //Unemeplemented. Parcels price.
|
||||
private int _selectedPrims = 0;
|
||||
private int _simwideArea = 0;
|
||||
private int _simwidePrims = 0;
|
||||
private UUID _snapshotID = UUID.Zero;
|
||||
|
@ -283,19 +277,6 @@ namespace OpenSim.Framework
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Number of SceneObjectPart that are owned by a Group
|
||||
/// </summary>
|
||||
[XmlIgnore]
|
||||
public int GroupPrims {
|
||||
get {
|
||||
return _groupPrims;
|
||||
}
|
||||
set {
|
||||
_groupPrims = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if the Land Parcel is owned by a group
|
||||
/// </summary>
|
||||
|
@ -453,20 +434,6 @@ namespace OpenSim.Framework
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Number of SceneObjectPart that are owned by users who do not own the parcel
|
||||
/// and don't have the 'group. These are elegable for AutoReturn collection
|
||||
/// </summary>
|
||||
[XmlIgnore]
|
||||
public int OtherPrims {
|
||||
get {
|
||||
return _otherPrims;
|
||||
}
|
||||
set {
|
||||
_otherPrims = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Owner Avatar or Group of the parcel. Naturally, all land masses must be
|
||||
/// owned by someone
|
||||
|
@ -480,19 +447,6 @@ namespace OpenSim.Framework
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Number of SceneObjectPart that are owned by the owner of the parcel
|
||||
/// </summary>
|
||||
[XmlIgnore]
|
||||
public int OwnerPrims {
|
||||
get {
|
||||
return _ownerPrims;
|
||||
}
|
||||
set {
|
||||
_ownerPrims = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List of access data for the parcel. User data, some bitflags, and a time
|
||||
/// </summary>
|
||||
|
@ -541,19 +495,6 @@ namespace OpenSim.Framework
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Number of SceneObjectPart that are currently selected by avatar
|
||||
/// </summary>
|
||||
[XmlIgnore]
|
||||
public int SelectedPrims {
|
||||
get {
|
||||
return _selectedPrims;
|
||||
}
|
||||
set {
|
||||
_selectedPrims = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Number of meters^2 in the Simulator
|
||||
/// </summary>
|
||||
|
@ -619,7 +560,7 @@ namespace OpenSim.Framework
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Number of minutes to return SceneObjectGroup that are owned by someone who doesn't own
|
||||
/// Autoreturn number of minutes to return SceneObjectGroup that are owned by someone who doesn't own
|
||||
/// the parcel and isn't set to the same 'group' as the parcel.
|
||||
/// </summary>
|
||||
public int OtherCleanTime {
|
||||
|
@ -666,10 +607,6 @@ namespace OpenSim.Framework
|
|||
landData._claimPrice = _claimPrice;
|
||||
landData._globalID = _globalID;
|
||||
landData._groupID = _groupID;
|
||||
landData._groupPrims = _groupPrims;
|
||||
landData._otherPrims = _otherPrims;
|
||||
landData._ownerPrims = _ownerPrims;
|
||||
landData._selectedPrims = _selectedPrims;
|
||||
landData._isGroupOwned = _isGroupOwned;
|
||||
landData._localID = _localID;
|
||||
landData._landingType = _landingType;
|
||||
|
@ -731,4 +668,4 @@ namespace OpenSim.Framework
|
|||
return land;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -250,7 +250,7 @@ namespace OpenSim.Framework
|
|||
{
|
||||
get
|
||||
{
|
||||
//m_log.DebugFormat("[SHAPE]: get m_textureEntry length {0}", m_textureEntry.Length);
|
||||
// m_log.DebugFormat("[SHAPE]: get m_textureEntry length {0}", m_textureEntry.Length);
|
||||
try { return new Primitive.TextureEntry(m_textureEntry, 0, m_textureEntry.Length); }
|
||||
catch { }
|
||||
|
||||
|
|
|
@ -347,7 +347,6 @@ namespace OpenSim.Framework
|
|||
|
||||
public bool commFailTF = false;
|
||||
public ConfigurationMember configMember;
|
||||
public string DataStore = String.Empty;
|
||||
public string RegionFile = String.Empty;
|
||||
public bool isSandbox = false;
|
||||
public bool Persistent = true;
|
||||
|
@ -746,10 +745,6 @@ namespace OpenSim.Framework
|
|||
m_regionLocX = Convert.ToUInt32(locationElements[0]);
|
||||
m_regionLocY = Convert.ToUInt32(locationElements[1]);
|
||||
|
||||
|
||||
// Datastore (is this implemented? Omitted from example!)
|
||||
DataStore = config.GetString("Datastore", String.Empty);
|
||||
|
||||
// Internal IP
|
||||
IPAddress address;
|
||||
|
||||
|
@ -846,9 +841,6 @@ namespace OpenSim.Framework
|
|||
string location = String.Format("{0},{1}", m_regionLocX, m_regionLocY);
|
||||
config.Set("Location", location);
|
||||
|
||||
if (DataStore != String.Empty)
|
||||
config.Set("Datastore", DataStore);
|
||||
|
||||
config.Set("InternalAddress", m_internalEndPoint.Address.ToString());
|
||||
config.Set("InternalPort", m_internalEndPoint.Port);
|
||||
|
||||
|
@ -1025,9 +1017,6 @@ namespace OpenSim.Framework
|
|||
case "sim_location_y":
|
||||
m_regionLocY = (uint) configuration_result;
|
||||
break;
|
||||
case "datastore":
|
||||
DataStore = (string) configuration_result;
|
||||
break;
|
||||
case "internal_ip_address":
|
||||
IPAddress address = (IPAddress) configuration_result;
|
||||
m_internalEndPoint = new IPEndPoint(address, 0);
|
||||
|
@ -1175,11 +1164,6 @@ namespace OpenSim.Framework
|
|||
return regionInfo;
|
||||
}
|
||||
|
||||
public int getInternalEndPointPort()
|
||||
{
|
||||
return m_internalEndPoint.Port;
|
||||
}
|
||||
|
||||
public Dictionary<string, object> ToKeyValuePairs()
|
||||
{
|
||||
Dictionary<string, object> kvp = new Dictionary<string, object>();
|
||||
|
@ -1198,4 +1182,4 @@ namespace OpenSim.Framework
|
|||
return kvp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -25,15 +25,19 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using log4net;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using Nini.Config;
|
||||
|
||||
namespace OpenSim.Framework.RegionLoader.Filesystem
|
||||
{
|
||||
public class RegionLoaderFileSystem : IRegionLoader
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private IConfigSource m_configSource;
|
||||
|
||||
public void SetIniConfigSource(IConfigSource configSource)
|
||||
|
@ -63,36 +67,48 @@ namespace OpenSim.Framework.RegionLoader.Filesystem
|
|||
string[] configFiles = Directory.GetFiles(regionConfigPath, "*.xml");
|
||||
string[] iniFiles = Directory.GetFiles(regionConfigPath, "*.ini");
|
||||
|
||||
// Create an empty Regions.ini if there are no existing config files.
|
||||
if (configFiles.Length == 0 && iniFiles.Length == 0)
|
||||
{
|
||||
{
|
||||
new RegionInfo("DEFAULT REGION CONFIG", Path.Combine(regionConfigPath, "Regions.ini"), false, m_configSource);
|
||||
iniFiles = Directory.GetFiles(regionConfigPath, "*.ini");
|
||||
}
|
||||
|
||||
m_log.InfoFormat("[REGION LOADER FILE SYSTEM]: Loading config files from {0}", regionConfigPath);
|
||||
|
||||
List<RegionInfo> regionInfos = new List<RegionInfo>();
|
||||
|
||||
int i = 0;
|
||||
foreach (string file in iniFiles)
|
||||
{
|
||||
m_log.InfoFormat("[REGION LOADER FILE SYSTEM]: Loading config file {0}", file);
|
||||
|
||||
IConfigSource source = new IniConfigSource(file);
|
||||
|
||||
foreach (IConfig config in source.Configs)
|
||||
{
|
||||
//m_log.Info("[REGIONLOADERFILESYSTEM]: Creating RegionInfo for " + config.Name);
|
||||
{
|
||||
RegionInfo regionInfo = new RegionInfo("REGION CONFIG #" + (i + 1), file, false, m_configSource, config.Name);
|
||||
regionInfos.Add(regionInfo);
|
||||
|
||||
m_log.InfoFormat("[REGION LOADER FILE SYSTEM]: Loaded config for region {0}", regionInfo.RegionName);
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (string file in configFiles)
|
||||
{
|
||||
m_log.InfoFormat("[REGION LOADER FILE SYSTEM]: Loading config file {0}", file);
|
||||
|
||||
RegionInfo regionInfo = new RegionInfo("REGION CONFIG #" + (i + 1), file, false, m_configSource);
|
||||
regionInfos.Add(regionInfo);
|
||||
|
||||
m_log.InfoFormat("[REGION LOADER FILE SYSTEM]: Loaded config for region {0}", regionInfo.RegionName);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
return regionInfos.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -66,9 +66,9 @@ namespace OpenSim.Framework.RegionLoader.Web
|
|||
{
|
||||
HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(url);
|
||||
webRequest.Timeout = 30000; //30 Second Timeout
|
||||
m_log.Debug("[WEBLOADER]: Sending Download Request...");
|
||||
m_log.DebugFormat("[WEBLOADER]: Sending download request to {0}", url);
|
||||
HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse();
|
||||
m_log.Debug("[WEBLOADER]: Downloading Region Information From Remote Server...");
|
||||
m_log.Debug("[WEBLOADER]: Downloading region information...");
|
||||
StreamReader reader = new StreamReader(webResponse.GetResponseStream());
|
||||
string xmlSource = String.Empty;
|
||||
string tempStr = reader.ReadLine();
|
||||
|
|
|
@ -66,6 +66,8 @@ namespace OpenSim.Framework.Serialization
|
|||
UserAccount account = userService.GetUserAccount(UUID.Zero, userId);
|
||||
if (account != null)
|
||||
return MakeOspa(account.FirstName, account.LastName);
|
||||
// else
|
||||
// m_log.WarnFormat("[OSP RESOLVER]: No user account for {0}", userId);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
@ -77,6 +79,8 @@ namespace OpenSim.Framework.Serialization
|
|||
/// <returns></returns>
|
||||
public static string MakeOspa(string firstName, string lastName)
|
||||
{
|
||||
// m_log.DebugFormat("[OSP RESOLVER]: Making OSPA for {0} {1}", firstName, lastName);
|
||||
|
||||
return
|
||||
OSPA_PREFIX + OSPA_NAME_KEY + OSPA_PAIR_SEPARATOR + firstName + OSPA_NAME_VALUE_SEPARATOR + lastName;
|
||||
}
|
||||
|
@ -97,7 +101,10 @@ namespace OpenSim.Framework.Serialization
|
|||
public static UUID ResolveOspa(string ospa, IUserAccountService userService)
|
||||
{
|
||||
if (!ospa.StartsWith(OSPA_PREFIX))
|
||||
return UUID.Zero;
|
||||
{
|
||||
// m_log.DebugFormat("[OSP RESOLVER]: ResolveOspa() got unrecognized format [{0}]", ospa);
|
||||
return UUID.Zero;
|
||||
}
|
||||
|
||||
// m_log.DebugFormat("[OSP RESOLVER]: Resolving {0}", ospa);
|
||||
|
||||
|
@ -161,7 +168,17 @@ namespace OpenSim.Framework.Serialization
|
|||
|
||||
UserAccount account = userService.GetUserAccount(UUID.Zero, firstName, lastName);
|
||||
if (account != null)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[OSP RESOLVER]: Found user account with uuid {0} for {1} {2}",
|
||||
// account.PrincipalID, firstName, lastName);
|
||||
|
||||
return account.PrincipalID;
|
||||
}
|
||||
// else
|
||||
// {
|
||||
// m_log.DebugFormat("[OSP RESOLVER]: No resolved OSPA user account for {0}", name);
|
||||
// }
|
||||
|
||||
// XXX: Disable temporary user profile creation for now as implementation is incomplete - justincc
|
||||
/*
|
||||
|
|
|
@ -42,10 +42,7 @@ namespace OpenSim.Framework.Serialization.Tests
|
|||
private LandData landWithParcelAccessList;
|
||||
|
||||
private static string preSerialized = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<LandData>\n <Area>128</Area>\n <AuctionID>0</AuctionID>\n <AuthBuyerID>00000000-0000-0000-0000-000000000000</AuthBuyerID>\n <Category>10</Category>\n <ClaimDate>0</ClaimDate>\n <ClaimPrice>0</ClaimPrice>\n <GlobalID>54ff9641-dd40-4a2c-b1f1-47dd3af24e50</GlobalID>\n <GroupID>d740204e-bbbf-44aa-949d-02c7d739f6a5</GroupID>\n <IsGroupOwned>False</IsGroupOwned>\n <Bitmap>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</Bitmap>\n <Description>land data to test LandDataSerializer</Description>\n <Flags>536870944</Flags>\n <LandingType>2</LandingType>\n <Name>LandDataSerializerTest Land</Name>\n <Status>0</Status>\n <LocalID>0</LocalID>\n <MediaAutoScale>1</MediaAutoScale>\n <MediaID>d4452578-2f25-4b97-a81b-819af559cfd7</MediaID>\n <MediaURL>http://videos.opensimulator.org/bumblebee.mp4</MediaURL>\n <MusicURL />\n <OwnerID>1b8eedf9-6d15-448b-8015-24286f1756bf</OwnerID>\n <ParcelAccessList />\n <PassHours>0</PassHours>\n <PassPrice>0</PassPrice>\n <SalePrice>0</SalePrice>\n <SnapshotID>00000000-0000-0000-0000-000000000000</SnapshotID>\n <UserLocation><0, 0, 0></UserLocation>\n <UserLookAt><0, 0, 0></UserLookAt>\n <Dwell>0</Dwell>\n <OtherCleanTime>0</OtherCleanTime>\n</LandData>";
|
||||
private static string preSerializedWithParcelAccessList = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<LandData>\n <Area>128</Area>\n <AuctionID>0</AuctionID>\n <AuthBuyerID>00000000-0000-0000-0000-000000000000</AuthBuyerID>\n <Category>10</Category>\n <ClaimDate>0</ClaimDate>\n <ClaimPrice>0</ClaimPrice>\n <GlobalID>54ff9641-dd40-4a2c-b1f1-47dd3af24e50</GlobalID>\n <GroupID>d740204e-bbbf-44aa-949d-02c7d739f6a5</GroupID>\n <IsGroupOwned>False</IsGroupOwned>\n <Bitmap>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</Bitmap>\n <Description>land data to test LandDataSerializer</Description>\n <Flags>536870944</Flags>\n <LandingType>2</LandingType>\n <Name>LandDataSerializerTest Land</Name>\n <Status>0</Status>\n <LocalID>0</LocalID>\n <MediaAutoScale>1</MediaAutoScale>\n <MediaID>d4452578-2f25-4b97-a81b-819af559cfd7</MediaID>\n <MediaURL>http://videos.opensimulator.org/bumblebee.mp4</MediaURL>\n <MusicURL />\n <OwnerID>1b8eedf9-6d15-448b-8015-24286f1756bf</OwnerID>\n <ParcelAccessList>\n <ParcelAccessEntry>\n <AgentID>62d65d45-c91a-4f77-862c-46557d978b6c</AgentID>\n <Time>2009-10-01T00:00:00</Time>\n <AccessList>2</AccessList>\n </ParcelAccessEntry>\n <ParcelAccessEntry>\n <AgentID>ec2a8d18-2378-4fe0-8b68-2a31b57c481e</AgentID>\n <Time>2010-10-20T00:00:00</Time>\n <AccessList>1</AccessList>\n </ParcelAccessEntry>\n </ParcelAccessList>\n <PassHours>0</PassHours>\n <PassPrice>0</PassPrice>\n <SalePrice>0</SalePrice>\n <SnapshotID>00000000-0000-0000-0000-000000000000</SnapshotID>\n <UserLocation><0, 0, 0></UserLocation>\n <UserLookAt><0, 0, 0></UserLookAt>\n <Dwell>0</Dwell>\n <OtherCleanTime>0</OtherCleanTime>\n</LandData>";
|
||||
|
||||
|
||||
|
||||
private static string preSerializedWithParcelAccessList = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<LandData>\n <Area>128</Area>\n <AuctionID>0</AuctionID>\n <AuthBuyerID>00000000-0000-0000-0000-000000000000</AuthBuyerID>\n <Category>10</Category>\n <ClaimDate>0</ClaimDate>\n <ClaimPrice>0</ClaimPrice>\n <GlobalID>54ff9641-dd40-4a2c-b1f1-47dd3af24e50</GlobalID>\n <GroupID>d740204e-bbbf-44aa-949d-02c7d739f6a5</GroupID>\n <IsGroupOwned>False</IsGroupOwned>\n <Bitmap>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</Bitmap>\n <Description>land data to test LandDataSerializer</Description>\n <Flags>536870944</Flags>\n <LandingType>2</LandingType>\n <Name>LandDataSerializerTest Land</Name>\n <Status>0</Status>\n <LocalID>0</LocalID>\n <MediaAutoScale>1</MediaAutoScale>\n <MediaID>d4452578-2f25-4b97-a81b-819af559cfd7</MediaID>\n <MediaURL>http://videos.opensimulator.org/bumblebee.mp4</MediaURL>\n <MusicURL />\n <OwnerID>1b8eedf9-6d15-448b-8015-24286f1756bf</OwnerID>\n <ParcelAccessList>\n <ParcelAccessEntry>\n <AgentID>62d65d45-c91a-4f77-862c-46557d978b6c</AgentID>\n <Time>2009-10-01T00:00:00</Time>\n <AccessList>2</AccessList>\n </ParcelAccessEntry>\n <ParcelAccessEntry>\n <AgentID>ec2a8d18-2378-4fe0-8b68-2a31b57c481e</AgentID>\n <Time>2010-10-20T00:00:00</Time>\n <AccessList>1</AccessList>\n </ParcelAccessEntry>\n </ParcelAccessList>\n <PassHours>0</PassHours>\n <PassPrice>0</PassPrice>\n <SalePrice>0</SalePrice>\n <SnapshotID>00000000-0000-0000-0000-000000000000</SnapshotID>\n <UserLocation><0, 0, 0></UserLocation>\n <UserLookAt><0, 0, 0></UserLookAt>\n <Dwell>0</Dwell>\n <OtherCleanTime>0</OtherCleanTime>\n</LandData>";
|
||||
|
||||
[SetUp]
|
||||
public void setup()
|
||||
|
@ -62,7 +59,6 @@ namespace OpenSim.Framework.Serialization.Tests
|
|||
this.land.ClaimPrice = 0;
|
||||
this.land.GlobalID = new UUID("54ff9641-dd40-4a2c-b1f1-47dd3af24e50");
|
||||
this.land.GroupID = new UUID("d740204e-bbbf-44aa-949d-02c7d739f6a5");
|
||||
this.land.GroupPrims = 0;
|
||||
this.land.Description = "land data to test LandDataSerializer";
|
||||
this.land.Flags = (uint)(ParcelFlags.AllowDamage | ParcelFlags.AllowVoiceChat);
|
||||
this.land.LandingType = (byte)LandingType.Direct;
|
||||
|
@ -132,4 +128,4 @@ namespace OpenSim.Framework.Serialization.Tests
|
|||
"Reified LandData.Name != original LandData.Name (pre-serialized with parcel access list)");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -378,6 +378,22 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
/// <param name="response"></param>
|
||||
public virtual void HandleRequest(OSHttpRequest request, OSHttpResponse response)
|
||||
{
|
||||
if (request.HttpMethod == String.Empty) // Can't handle empty requests, not wasting a thread
|
||||
{
|
||||
try
|
||||
{
|
||||
SendHTML500(response);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
string requestMethod = request.HttpMethod;
|
||||
string uriString = request.RawUrl;
|
||||
|
||||
string reqnum = "unknown";
|
||||
int tickstart = Environment.TickCount;
|
||||
|
||||
|
@ -495,7 +511,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
|
||||
request.InputStream.Close();
|
||||
|
||||
// HTTP IN support. The script engine taes it from here
|
||||
// HTTP IN support. The script engine takes it from here
|
||||
// Nothing to worry about for us.
|
||||
//
|
||||
if (buffer == null)
|
||||
|
@ -609,19 +625,19 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
{
|
||||
m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw ", e);
|
||||
}
|
||||
catch (InvalidOperationException e)
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e);
|
||||
m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw " + e.ToString());
|
||||
SendHTML500(response);
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Every month or so this will wrap and give bad numbers, not really a problem
|
||||
// since its just for reporting, 200ms limit can be adjusted
|
||||
// since its just for reporting, tickdiff limit can be adjusted
|
||||
int tickdiff = Environment.TickCount - tickstart;
|
||||
if (tickdiff > 500)
|
||||
if (tickdiff > 3000)
|
||||
m_log.InfoFormat(
|
||||
"[BASE HTTP SERVER]: slow request <{0}> for {1} took {2} ms", reqnum, request.RawUrl, tickdiff);
|
||||
"[BASE HTTP SERVER]: slow {0} request for {1} from {2} took {3} ms", requestMethod, uriString, request.RemoteIPEndPoint.ToString(), tickdiff);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
/// <summary>
|
||||
/// Regular expression used to match against path of the
|
||||
/// incoming HTTP request. If you want to match any string
|
||||
/// either use '.*' or null. To match on the emtpy string use
|
||||
/// either use '.*' or null. To match on the empty string use
|
||||
/// '^$'.
|
||||
/// </summary>
|
||||
public virtual Regex Path
|
||||
|
|
|
@ -34,7 +34,6 @@ using System.Text;
|
|||
using HttpServer;
|
||||
using HttpServer.FormDecoders;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
|
||||
namespace OpenSim.Framework.Servers.Tests
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
using System;
|
||||
using System.Reflection;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using OpenSim.Framework;
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
using System;
|
||||
using System.Reflection;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using OpenSim.Framework;
|
||||
|
@ -38,8 +37,6 @@ namespace OpenSim.Framework.Tests
|
|||
[TestFixture]
|
||||
public class PrimeNumberHelperTests
|
||||
{
|
||||
|
||||
|
||||
[Test]
|
||||
public void TestGetPrime()
|
||||
{
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue