2007-10-15 07:10:21 +00:00
/ *
2008-03-18 05:16:43 +00:00
* 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 .
2009-06-01 06:37:14 +00:00
* * Neither the name of the OpenSimulator Project nor the
2008-03-18 05:16:43 +00:00
* 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 .
* /
2007-10-15 07:10:21 +00:00
2007-08-06 20:36:57 +00:00
using System ;
using System.Collections.Generic ;
using System.Data ;
2009-02-12 09:53:12 +00:00
using System.Drawing ;
2007-10-30 09:05:31 +00:00
using System.IO ;
2008-04-21 07:09:17 +00:00
using System.Reflection ;
using log4net ;
2010-09-23 05:21:08 +00:00
#if CSharpSqlite
using Community.CsharpSqlite.Sqlite ;
# else
2012-02-12 23:58:28 +00:00
using Mono.Data.Sqlite ;
2010-09-23 05:21:08 +00:00
# endif
2009-02-12 09:53:12 +00:00
using OpenMetaverse ;
2010-07-01 21:52:31 +00:00
using OpenMetaverse.StructuredData ;
2007-10-29 21:46:25 +00:00
using OpenSim.Framework ;
2009-02-06 16:55:34 +00:00
using OpenSim.Region.Framework.Interfaces ;
using OpenSim.Region.Framework.Scenes ;
2007-08-06 20:36:57 +00:00
2008-04-02 15:36:01 +00:00
namespace OpenSim.Data.SQLite
2007-08-06 20:36:57 +00:00
{
2008-06-26 20:14:33 +00:00
/// <summary>
/// A RegionData Interface to the SQLite database
/// </summary>
2010-09-12 03:43:06 +00:00
public class SQLiteSimulationData : ISimulationDataStore
2007-08-06 20:36:57 +00:00
{
2008-04-21 07:09:17 +00:00
private static readonly ILog m_log = LogManager . GetLogger ( MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
2015-08-08 21:06:36 +00:00
private static readonly string LogHeader = "[REGION DB SQLITE]" ;
2008-02-05 19:44:27 +00:00
2007-08-07 15:13:27 +00:00
private const string primSelect = "select * from prims" ;
private const string shapeSelect = "select * from primshapes" ;
2007-12-27 00:53:13 +00:00
private const string itemsSelect = "select * from primitems" ;
2007-11-13 15:22:54 +00:00
private const string terrainSelect = "select * from terrain limit 1" ;
2007-12-18 17:42:02 +00:00
private const string landSelect = "select * from land" ;
2008-03-11 00:22:56 +00:00
private const string landAccessListSelect = "select distinct * from landaccesslist" ;
2008-06-21 06:50:38 +00:00
private const string regionbanListSelect = "select * from regionban" ;
2008-09-13 20:37:36 +00:00
private const string regionSettingsSelect = "select * from regionsettings" ;
2012-02-12 23:58:28 +00:00
private const string regionWindlightSelect = "select * from regionwindlight" ;
2012-05-23 19:06:25 +00:00
private const string regionEnvironmentSelect = "select * from regionenvironment" ;
2012-02-17 22:31:20 +00:00
private const string regionSpawnPointsSelect = "select * from spawn_points" ;
2007-08-29 16:35:22 +00:00
2007-08-06 20:36:57 +00:00
private DataSet ds ;
2007-08-07 19:49:43 +00:00
private SqliteDataAdapter primDa ;
private SqliteDataAdapter shapeDa ;
2008-01-05 19:46:00 +00:00
private SqliteDataAdapter itemsDa ;
2007-10-22 21:57:32 +00:00
private SqliteDataAdapter terrainDa ;
2007-12-18 17:42:02 +00:00
private SqliteDataAdapter landDa ;
private SqliteDataAdapter landAccessListDa ;
2008-09-13 20:37:36 +00:00
private SqliteDataAdapter regionSettingsDa ;
2012-02-12 23:58:28 +00:00
private SqliteDataAdapter regionWindlightDa ;
2012-05-23 19:06:25 +00:00
private SqliteDataAdapter regionEnvironmentDa ;
2012-02-17 22:31:20 +00:00
private SqliteDataAdapter regionSpawnPointsDa ;
2007-12-18 17:42:02 +00:00
2007-12-27 05:37:48 +00:00
private SqliteConnection m_conn ;
2007-11-15 19:53:10 +00:00
private String m_connectionString ;
2007-12-27 21:41:48 +00:00
2011-06-30 18:05:02 +00:00
protected virtual Assembly Assembly
{
get { return GetType ( ) . Assembly ; }
}
2010-09-12 21:20:26 +00:00
public SQLiteSimulationData ( )
{
}
public SQLiteSimulationData ( string connectionString )
{
Initialise ( connectionString ) ;
}
2008-01-11 17:00:21 +00:00
// Temporary attribute while this is experimental
2007-08-06 20:36:57 +00:00
2007-08-23 15:16:53 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Public Interface Functions
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2007-10-30 09:05:31 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
/// <list type="bullet">
/// <item>Initialises RegionData Interface</item>
/// <item>Loads and initialises a new SQLite connection and maintains it.</item>
/// </list>
/// </summary>
/// <param name="connectionString">the connection string</param>
2008-07-18 20:50:47 +00:00
public void Initialise ( string connectionString )
2007-08-06 20:36:57 +00:00
{
2010-04-30 16:45:00 +00:00
try
{
2012-02-21 02:52:20 +00:00
if ( Util . IsWindows ( ) )
Util . LoadArchSpecificWindowsDll ( "sqlite3.dll" ) ;
2010-04-30 16:45:00 +00:00
m_connectionString = connectionString ;
2007-08-29 16:35:22 +00:00
2010-04-30 16:45:00 +00:00
ds = new DataSet ( "Region" ) ;
2007-08-10 17:22:54 +00:00
2010-06-04 16:14:12 +00:00
m_log . Info ( "[SQLITE REGION DB]: Sqlite - connecting: " + connectionString ) ;
2010-04-30 16:45:00 +00:00
m_conn = new SqliteConnection ( m_connectionString ) ;
m_conn . Open ( ) ;
2007-08-06 20:36:57 +00:00
2010-04-30 16:45:00 +00:00
SqliteCommand primSelectCmd = new SqliteCommand ( primSelect , m_conn ) ;
primDa = new SqliteDataAdapter ( primSelectCmd ) ;
2008-06-11 21:01:33 +00:00
2010-04-30 16:45:00 +00:00
SqliteCommand shapeSelectCmd = new SqliteCommand ( shapeSelect , m_conn ) ;
shapeDa = new SqliteDataAdapter ( shapeSelectCmd ) ;
// SqliteCommandBuilder shapeCb = new SqliteCommandBuilder(shapeDa);
2008-06-11 21:01:33 +00:00
2010-04-30 16:45:00 +00:00
SqliteCommand itemsSelectCmd = new SqliteCommand ( itemsSelect , m_conn ) ;
itemsDa = new SqliteDataAdapter ( itemsSelectCmd ) ;
2007-08-19 13:35:20 +00:00
2010-04-30 16:45:00 +00:00
SqliteCommand terrainSelectCmd = new SqliteCommand ( terrainSelect , m_conn ) ;
terrainDa = new SqliteDataAdapter ( terrainSelectCmd ) ;
2007-08-06 20:36:57 +00:00
2010-04-30 16:45:00 +00:00
SqliteCommand landSelectCmd = new SqliteCommand ( landSelect , m_conn ) ;
landDa = new SqliteDataAdapter ( landSelectCmd ) ;
2008-05-16 01:22:11 +00:00
2010-04-30 16:45:00 +00:00
SqliteCommand landAccessListSelectCmd = new SqliteCommand ( landAccessListSelect , m_conn ) ;
landAccessListDa = new SqliteDataAdapter ( landAccessListSelectCmd ) ;
2007-08-06 20:36:57 +00:00
2010-04-30 16:45:00 +00:00
SqliteCommand regionSettingsSelectCmd = new SqliteCommand ( regionSettingsSelect , m_conn ) ;
regionSettingsDa = new SqliteDataAdapter ( regionSettingsSelectCmd ) ;
2012-02-12 23:58:28 +00:00
SqliteCommand regionWindlightSelectCmd = new SqliteCommand ( regionWindlightSelect , m_conn ) ;
regionWindlightDa = new SqliteDataAdapter ( regionWindlightSelectCmd ) ;
2012-02-17 22:31:20 +00:00
2012-05-23 19:06:25 +00:00
SqliteCommand regionEnvironmentSelectCmd = new SqliteCommand ( regionEnvironmentSelect , m_conn ) ;
regionEnvironmentDa = new SqliteDataAdapter ( regionEnvironmentSelectCmd ) ;
2012-02-17 22:31:20 +00:00
SqliteCommand regionSpawnPointsSelectCmd = new SqliteCommand ( regionSpawnPointsSelect , m_conn ) ;
regionSpawnPointsDa = new SqliteDataAdapter ( regionSpawnPointsSelectCmd ) ;
2010-04-30 16:45:00 +00:00
// This actually does the roll forward assembly stuff
2011-06-30 18:05:02 +00:00
Migration m = new Migration ( m_conn , Assembly , "RegionStore" ) ;
2010-04-30 16:45:00 +00:00
m . Update ( ) ;
2007-12-18 17:42:02 +00:00
2010-04-30 16:45:00 +00:00
lock ( ds )
{
ds . Tables . Add ( createPrimTable ( ) ) ;
setupPrimCommands ( primDa , m_conn ) ;
2007-12-18 17:42:02 +00:00
2010-04-30 16:45:00 +00:00
ds . Tables . Add ( createShapeTable ( ) ) ;
setupShapeCommands ( shapeDa , m_conn ) ;
2007-08-24 13:35:51 +00:00
2010-04-30 16:45:00 +00:00
ds . Tables . Add ( createItemsTable ( ) ) ;
setupItemsCommands ( itemsDa , m_conn ) ;
2007-10-30 09:05:31 +00:00
2010-04-30 16:45:00 +00:00
ds . Tables . Add ( createTerrainTable ( ) ) ;
setupTerrainCommands ( terrainDa , m_conn ) ;
2008-05-16 01:22:11 +00:00
2010-04-30 16:45:00 +00:00
ds . Tables . Add ( createLandTable ( ) ) ;
setupLandCommands ( landDa , m_conn ) ;
2008-09-10 05:17:28 +00:00
2010-04-30 16:45:00 +00:00
ds . Tables . Add ( createLandAccessListTable ( ) ) ;
setupLandAccessCommands ( landAccessListDa , m_conn ) ;
2007-10-30 09:05:31 +00:00
2010-04-30 16:45:00 +00:00
ds . Tables . Add ( createRegionSettingsTable ( ) ) ;
setupRegionSettingsCommands ( regionSettingsDa , m_conn ) ;
2007-12-18 17:42:02 +00:00
2012-02-12 23:58:28 +00:00
ds . Tables . Add ( createRegionWindlightTable ( ) ) ;
setupRegionWindlightCommands ( regionWindlightDa , m_conn ) ;
2012-05-23 19:06:25 +00:00
ds . Tables . Add ( createRegionEnvironmentTable ( ) ) ;
setupRegionEnvironmentCommands ( regionEnvironmentDa , m_conn ) ;
2012-02-17 22:31:20 +00:00
ds . Tables . Add ( createRegionSpawnPointsTable ( ) ) ;
setupRegionSpawnPointsCommands ( regionSpawnPointsDa , m_conn ) ;
2010-04-30 16:45:00 +00:00
// WORKAROUND: This is a work around for sqlite on
// windows, which gets really unhappy with blob columns
// that have no sample data in them. At some point we
// need to actually find a proper way to handle this.
try
{
primDa . Fill ( ds . Tables [ "prims" ] ) ;
}
2012-02-12 23:58:28 +00:00
catch ( Exception e )
2010-04-30 16:45:00 +00:00
{
2012-02-12 23:58:28 +00:00
m_log . ErrorFormat ( "[SQLITE REGION DB]: Caught fill error on prims table :{0}" , e . Message ) ;
2010-04-30 16:45:00 +00:00
}
2007-12-18 17:42:02 +00:00
2010-04-30 16:45:00 +00:00
try
{
shapeDa . Fill ( ds . Tables [ "primshapes" ] ) ;
}
2012-02-12 23:58:28 +00:00
catch ( Exception e )
2010-04-30 16:45:00 +00:00
{
2012-02-12 23:58:28 +00:00
m_log . ErrorFormat ( "[SQLITE REGION DB]: Caught fill error on primshapes table :{0}" , e . Message ) ;
2010-04-30 16:45:00 +00:00
}
2008-09-13 20:37:36 +00:00
2010-06-04 16:14:12 +00:00
try
{
itemsDa . Fill ( ds . Tables [ "primitems" ] ) ;
}
2012-02-12 23:58:28 +00:00
catch ( Exception e )
2010-06-04 16:14:12 +00:00
{
2012-02-12 23:58:28 +00:00
m_log . ErrorFormat ( "[SQLITE REGION DB]: Caught fill error on primitems table :{0}" , e . Message ) ;
2010-06-04 16:14:12 +00:00
}
2010-09-12 17:43:49 +00:00
2010-04-30 16:45:00 +00:00
try
{
terrainDa . Fill ( ds . Tables [ "terrain" ] ) ;
}
2012-02-12 23:58:28 +00:00
catch ( Exception e )
2010-04-30 16:45:00 +00:00
{
2012-02-12 23:58:28 +00:00
m_log . ErrorFormat ( "[SQLITE REGION DB]: Caught fill error on terrain table :{0}" , e . Message ) ;
2010-04-30 16:45:00 +00:00
}
2007-10-22 22:37:39 +00:00
2010-04-30 16:45:00 +00:00
try
{
landDa . Fill ( ds . Tables [ "land" ] ) ;
}
2012-02-12 23:58:28 +00:00
catch ( Exception e )
2010-04-30 16:45:00 +00:00
{
2012-02-12 23:58:28 +00:00
m_log . ErrorFormat ( "[SQLITE REGION DB]: Caught fill error on land table :{0}" , e . Message ) ;
2010-04-30 16:45:00 +00:00
}
2007-12-18 17:42:02 +00:00
2010-04-30 16:45:00 +00:00
try
{
landAccessListDa . Fill ( ds . Tables [ "landaccesslist" ] ) ;
}
2012-02-12 23:58:28 +00:00
catch ( Exception e )
2010-04-30 16:45:00 +00:00
{
2012-02-12 23:58:28 +00:00
m_log . ErrorFormat ( "[SQLITE REGION DB]: Caught fill error on landaccesslist table :{0}" , e . Message ) ;
2010-04-30 16:45:00 +00:00
}
2007-12-18 17:42:02 +00:00
2010-04-30 16:45:00 +00:00
try
{
regionSettingsDa . Fill ( ds . Tables [ "regionsettings" ] ) ;
}
2012-02-12 23:58:28 +00:00
catch ( Exception e )
{
m_log . ErrorFormat ( "[SQLITE REGION DB]: Caught fill error on regionsettings table :{0}" , e . Message ) ;
}
try
{
regionWindlightDa . Fill ( ds . Tables [ "regionwindlight" ] ) ;
}
catch ( Exception e )
2010-04-30 16:45:00 +00:00
{
2012-02-12 23:58:28 +00:00
m_log . ErrorFormat ( "[SQLITE REGION DB]: Caught fill error on regionwindlight table :{0}" , e . Message ) ;
2010-04-30 16:45:00 +00:00
}
2008-06-21 06:50:38 +00:00
2012-05-23 19:06:25 +00:00
try
{
regionEnvironmentDa . Fill ( ds . Tables [ "regionenvironment" ] ) ;
}
catch ( Exception e )
{
m_log . ErrorFormat ( "[SQLITE REGION DB]: Caught fill error on regionenvironment table :{0}" , e . Message ) ;
}
2012-02-17 22:31:20 +00:00
try
{
regionSpawnPointsDa . Fill ( ds . Tables [ "spawn_points" ] ) ;
}
catch ( Exception e )
{
m_log . ErrorFormat ( "[SQLITE REGION DB]: Caught fill error on spawn_points table :{0}" , e . Message ) ;
}
2010-04-30 16:45:00 +00:00
// We have to create a data set mapping for every table, otherwise the IDataAdaptor.Update() will not populate rows with values!
// Not sure exactly why this is - this kind of thing was not necessary before - justincc 20100409
// Possibly because we manually set up our own DataTables before connecting to the database
CreateDataSetMapping ( primDa , "prims" ) ;
CreateDataSetMapping ( shapeDa , "primshapes" ) ;
CreateDataSetMapping ( itemsDa , "primitems" ) ;
CreateDataSetMapping ( terrainDa , "terrain" ) ;
CreateDataSetMapping ( landDa , "land" ) ;
CreateDataSetMapping ( landAccessListDa , "landaccesslist" ) ;
CreateDataSetMapping ( regionSettingsDa , "regionsettings" ) ;
2012-02-12 23:58:28 +00:00
CreateDataSetMapping ( regionWindlightDa , "regionwindlight" ) ;
2012-05-23 19:06:25 +00:00
CreateDataSetMapping ( regionEnvironmentDa , "regionenvironment" ) ;
2012-02-17 22:31:20 +00:00
CreateDataSetMapping ( regionSpawnPointsDa , "spawn_points" ) ;
2008-09-13 20:37:36 +00:00
}
2007-08-24 13:35:51 +00:00
}
2010-04-30 16:45:00 +00:00
catch ( Exception e )
{
2012-05-23 19:06:25 +00:00
m_log . ErrorFormat ( "[SQLITE REGION DB]: {0} - {1}" , e . Message , e . StackTrace ) ;
2012-02-12 23:58:28 +00:00
Environment . Exit ( 23 ) ;
2010-04-30 16:45:00 +00:00
}
return ;
2007-08-06 20:36:57 +00:00
}
2008-09-18 20:10:09 +00:00
public void Dispose ( )
{
2008-09-19 21:32:41 +00:00
if ( m_conn ! = null )
{
2008-09-18 20:10:09 +00:00
m_conn . Close ( ) ;
m_conn = null ;
}
2008-09-19 21:32:41 +00:00
if ( ds ! = null )
{
2008-09-18 20:10:09 +00:00
ds . Dispose ( ) ;
ds = null ;
}
2008-09-19 21:32:41 +00:00
if ( primDa ! = null )
{
2008-09-18 20:10:09 +00:00
primDa . Dispose ( ) ;
primDa = null ;
}
2008-09-19 21:32:41 +00:00
if ( shapeDa ! = null )
{
2008-09-18 20:10:09 +00:00
shapeDa . Dispose ( ) ;
shapeDa = null ;
}
2008-09-19 21:32:41 +00:00
if ( itemsDa ! = null )
{
2008-09-18 20:10:09 +00:00
itemsDa . Dispose ( ) ;
itemsDa = null ;
}
2008-09-19 21:32:41 +00:00
if ( terrainDa ! = null )
{
2008-09-18 20:10:09 +00:00
terrainDa . Dispose ( ) ;
terrainDa = null ;
}
2008-09-19 21:32:41 +00:00
if ( landDa ! = null )
{
2008-09-18 20:10:09 +00:00
landDa . Dispose ( ) ;
landDa = null ;
}
2008-09-19 21:32:41 +00:00
if ( landAccessListDa ! = null )
{
2008-09-18 20:10:09 +00:00
landAccessListDa . Dispose ( ) ;
landAccessListDa = null ;
}
2008-09-19 21:32:41 +00:00
if ( regionSettingsDa ! = null )
{
2008-09-18 20:10:09 +00:00
regionSettingsDa . Dispose ( ) ;
regionSettingsDa = null ;
}
2012-02-12 23:58:28 +00:00
if ( regionWindlightDa ! = null )
{
regionWindlightDa . Dispose ( ) ;
regionWindlightDa = null ;
}
2012-05-23 19:06:25 +00:00
if ( regionEnvironmentDa ! = null )
{
regionEnvironmentDa . Dispose ( ) ;
regionEnvironmentDa = null ;
}
2012-02-17 22:31:20 +00:00
if ( regionSpawnPointsDa ! = null )
{
regionSpawnPointsDa . Dispose ( ) ;
regionWindlightDa = null ;
}
2008-09-18 20:10:09 +00:00
}
2008-09-19 21:32:41 +00:00
2008-06-29 11:48:58 +00:00
public void StoreRegionSettings ( RegionSettings rs )
{
2008-09-13 22:07:07 +00:00
lock ( ds )
2008-09-13 20:37:36 +00:00
{
DataTable regionsettings = ds . Tables [ "regionsettings" ] ;
2008-09-29 21:55:59 +00:00
DataRow settingsRow = regionsettings . Rows . Find ( rs . RegionUUID . ToString ( ) ) ;
2008-09-13 20:37:36 +00:00
if ( settingsRow = = null )
{
settingsRow = regionsettings . NewRow ( ) ;
fillRegionSettingsRow ( settingsRow , rs ) ;
regionsettings . Rows . Add ( settingsRow ) ;
}
else
{
fillRegionSettingsRow ( settingsRow , rs ) ;
}
2012-02-17 22:31:20 +00:00
StoreSpawnPoints ( rs ) ;
2008-09-13 20:37:36 +00:00
Commit ( ) ;
}
2012-02-17 22:31:20 +00:00
}
public void StoreSpawnPoints ( RegionSettings rs )
{
lock ( ds )
{
// DataTable spawnpoints = ds.Tables["spawn_points"];
// remove region's spawnpoints
using (
SqliteCommand cmd =
new SqliteCommand ( "delete from spawn_points where RegionID=:RegionID" ,
m_conn ) )
{
cmd . Parameters . Add ( new SqliteParameter ( ":RegionID" , rs . RegionUUID . ToString ( ) ) ) ;
cmd . ExecuteNonQuery ( ) ;
}
}
foreach ( SpawnPoint sp in rs . SpawnPoints ( ) )
{
using ( SqliteCommand cmd = new SqliteCommand ( "insert into spawn_points(RegionID, Yaw, Pitch, Distance)" +
"values ( :RegionID, :Yaw, :Pitch, :Distance)" , m_conn ) )
{
cmd . Parameters . Add ( new SqliteParameter ( ":RegionID" , rs . RegionUUID . ToString ( ) ) ) ;
cmd . Parameters . Add ( new SqliteParameter ( ":Yaw" , sp . Yaw ) ) ;
cmd . Parameters . Add ( new SqliteParameter ( ":Pitch" , sp . Pitch ) ) ;
cmd . Parameters . Add ( new SqliteParameter ( ":Distance" , sp . Distance ) ) ;
cmd . ExecuteNonQuery ( ) ;
}
}
2008-06-29 11:48:58 +00:00
}
2012-02-12 23:58:28 +00:00
/// <summary>
/// Load windlight settings from region storage
/// </summary>
/// <param name="regionUUID">RegionID</param>
2010-03-31 03:20:20 +00:00
public RegionLightShareData LoadRegionWindlightSettings ( UUID regionUUID )
{
2012-02-12 23:58:28 +00:00
RegionLightShareData wl = null ;
lock ( ds )
{
DataTable windlightTable = ds . Tables [ "regionwindlight" ] ;
DataRow windlightRow = windlightTable . Rows . Find ( regionUUID . ToString ( ) ) ;
if ( windlightRow = = null )
{
wl = new RegionLightShareData ( ) ;
wl . regionID = regionUUID ;
StoreRegionWindlightSettings ( wl ) ;
return wl ;
}
wl = buildRegionWindlight ( windlightRow ) ;
return wl ;
}
2010-03-31 03:20:20 +00:00
}
2012-02-12 23:58:28 +00:00
/// <summary>
/// Remove windlight settings from region storage
/// </summary>
/// <param name="regionID">RegionID</param>
2010-11-03 02:31:43 +00:00
public void RemoveRegionWindlightSettings ( UUID regionID )
{
2012-02-12 23:58:28 +00:00
lock ( ds )
{
DataTable windlightTable = ds . Tables [ "regionwindlight" ] ;
DataRow windlightRow = windlightTable . Rows . Find ( regionID . ToString ( ) ) ;
if ( windlightRow ! = null )
{
windlightRow . Delete ( ) ;
}
}
Commit ( ) ;
2010-11-03 02:31:43 +00:00
}
2012-02-12 23:58:28 +00:00
/// <summary>
/// Adds an windlight into region storage
/// </summary>
/// <param name="wl">RegionLightShareData</param>
2010-03-31 03:20:20 +00:00
public void StoreRegionWindlightSettings ( RegionLightShareData wl )
{
2012-02-12 23:58:28 +00:00
lock ( ds )
{
DataTable windlightTable = ds . Tables [ "regionwindlight" ] ;
DataRow windlightRow = windlightTable . Rows . Find ( wl . regionID . ToString ( ) ) ;
if ( windlightRow = = null )
{
windlightRow = windlightTable . NewRow ( ) ;
fillRegionWindlightRow ( windlightRow , wl ) ;
windlightTable . Rows . Add ( windlightRow ) ;
}
else
{
fillRegionWindlightRow ( windlightRow , wl ) ;
}
Commit ( ) ;
}
2010-03-31 03:20:20 +00:00
}
2012-02-12 23:58:28 +00:00
2012-05-23 19:06:25 +00:00
#region Region Environment Settings
public string LoadRegionEnvironmentSettings ( UUID regionUUID )
{
lock ( ds )
{
DataTable environmentTable = ds . Tables [ "regionenvironment" ] ;
DataRow row = environmentTable . Rows . Find ( regionUUID . ToString ( ) ) ;
if ( row = = null )
{
return String . Empty ;
}
return ( String ) row [ "llsd_settings" ] ;
}
}
public void StoreRegionEnvironmentSettings ( UUID regionUUID , string settings )
{
lock ( ds )
{
DataTable environmentTable = ds . Tables [ "regionenvironment" ] ;
DataRow row = environmentTable . Rows . Find ( regionUUID . ToString ( ) ) ;
if ( row = = null )
{
row = environmentTable . NewRow ( ) ;
row [ "region_id" ] = regionUUID . ToString ( ) ;
row [ "llsd_settings" ] = settings ;
environmentTable . Rows . Add ( row ) ;
}
else
{
row [ "llsd_settings" ] = settings ;
}
regionEnvironmentDa . Update ( ds , "regionenvironment" ) ;
}
}
public void RemoveRegionEnvironmentSettings ( UUID regionUUID )
{
lock ( ds )
{
DataTable environmentTable = ds . Tables [ "regionenvironment" ] ;
DataRow row = environmentTable . Rows . Find ( regionUUID . ToString ( ) ) ;
if ( row ! = null )
{
row . Delete ( ) ;
}
regionEnvironmentDa . Update ( ds , "regionenvironment" ) ;
}
}
# endregion
2008-09-06 07:52:41 +00:00
public RegionSettings LoadRegionSettings ( UUID regionUUID )
2008-06-29 11:48:58 +00:00
{
2008-09-13 20:37:36 +00:00
lock ( ds )
{
DataTable regionsettings = ds . Tables [ "regionsettings" ] ;
string searchExp = "regionUUID = '" + regionUUID . ToString ( ) + "'" ;
DataRow [ ] rawsettings = regionsettings . Select ( searchExp ) ;
if ( rawsettings . Length = = 0 )
{
RegionSettings rs = new RegionSettings ( ) ;
rs . RegionUUID = regionUUID ;
rs . OnSave + = StoreRegionSettings ;
StoreRegionSettings ( rs ) ;
return rs ;
}
DataRow row = rawsettings [ 0 ] ;
RegionSettings newSettings = buildRegionSettings ( row ) ;
newSettings . OnSave + = StoreRegionSettings ;
2012-02-17 22:31:20 +00:00
LoadSpawnPoints ( newSettings ) ;
2008-09-13 20:37:36 +00:00
return newSettings ;
}
2008-06-29 11:48:58 +00:00
}
2012-02-17 22:31:20 +00:00
private void LoadSpawnPoints ( RegionSettings rs )
{
rs . ClearSpawnPoints ( ) ;
DataTable spawnpoints = ds . Tables [ "spawn_points" ] ;
string byRegion = "RegionID = '" + rs . RegionUUID + "'" ;
DataRow [ ] spForRegion = spawnpoints . Select ( byRegion ) ;
foreach ( DataRow spRow in spForRegion )
{
SpawnPoint sp = new SpawnPoint ( ) ;
sp . Pitch = ( float ) spRow [ "Pitch" ] ;
sp . Yaw = ( float ) spRow [ "Yaw" ] ;
sp . Distance = ( float ) spRow [ "Distance" ] ;
rs . AddSpawnPoint ( sp ) ;
}
}
2008-06-26 20:14:33 +00:00
/// <summary>
/// Adds an object into region storage
/// </summary>
/// <param name="obj">the object</param>
/// <param name="regionUUID">the region UUID</param>
2008-09-06 07:52:41 +00:00
public void StoreObject ( SceneObjectGroup obj , UUID regionUUID )
2007-08-07 19:49:43 +00:00
{
2009-08-15 11:08:36 +00:00
uint flags = obj . RootPart . GetEffectiveObjectFlags ( ) ;
// Eligibility check
/ /
if ( ( flags & ( uint ) PrimFlags . Temporary ) ! = 0 )
return ;
if ( ( flags & ( uint ) PrimFlags . TemporaryOnRez ) ! = 0 )
return ;
2007-10-30 09:05:31 +00:00
lock ( ds )
{
2010-09-17 00:30:46 +00:00
foreach ( SceneObjectPart prim in obj . Parts )
2007-09-13 13:10:21 +00:00
{
2010-08-25 23:17:26 +00:00
// m_log.Info("[REGION DB]: Adding obj: " + obj.UUID + " to region: " + regionUUID);
addPrim ( prim , obj . UUID , regionUUID ) ;
2007-09-13 13:10:21 +00:00
}
2007-08-23 15:16:53 +00:00
}
2007-08-29 16:35:22 +00:00
2007-09-13 13:10:21 +00:00
Commit ( ) ;
2012-02-12 23:58:28 +00:00
// m_log.Info("[Dump of prims]: " + ds.GetXml());
2007-08-08 17:59:16 +00:00
}
2007-08-29 16:35:22 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
/// Removes an object from region storage
/// </summary>
/// <param name="obj">the object</param>
/// <param name="regionUUID">the region UUID</param>
2008-09-06 07:52:41 +00:00
public void RemoveObject ( UUID obj , UUID regionUUID )
2007-08-22 21:09:38 +00:00
{
2012-02-12 23:58:28 +00:00
// m_log.InfoFormat("[REGION DB]: Removing obj: {0} from region: {1}", obj.Guid, regionUUID);
2008-05-16 01:22:11 +00:00
2007-08-23 15:16:53 +00:00
DataTable prims = ds . Tables [ "prims" ] ;
DataTable shapes = ds . Tables [ "primshapes" ] ;
2009-05-07 13:20:29 +00:00
string selectExp = "SceneGroupID = '" + obj + "' and RegionUUID = '" + regionUUID + "'" ;
2007-10-30 09:05:31 +00:00
lock ( ds )
{
2007-09-13 13:10:21 +00:00
DataRow [ ] primRows = prims . Select ( selectExp ) ;
foreach ( DataRow row in primRows )
2007-08-23 15:16:53 +00:00
{
2008-01-11 17:00:21 +00:00
// Remove shape rows
2012-02-12 23:58:28 +00:00
UUID uuid = new UUID ( ( string ) row [ "UUID" ] ) ;
2009-05-07 13:20:29 +00:00
DataRow shapeRow = shapes . Rows . Find ( uuid . ToString ( ) ) ;
2007-09-13 13:10:21 +00:00
if ( shapeRow ! = null )
{
shapeRow . Delete ( ) ;
}
2008-01-11 17:00:21 +00:00
2008-07-25 15:18:24 +00:00
RemoveItems ( uuid ) ;
2008-01-11 17:00:21 +00:00
// Remove prim row
2008-05-16 01:22:11 +00:00
row . Delete ( ) ;
2007-08-23 15:16:53 +00:00
}
2007-08-22 21:09:38 +00:00
}
2007-10-30 09:05:31 +00:00
2007-09-13 13:10:21 +00:00
Commit ( ) ;
2007-08-22 21:09:38 +00:00
}
2007-08-09 03:56:11 +00:00
2008-01-21 16:42:53 +00:00
/// <summary>
/// Remove all persisted items of the given prim.
/// The caller must acquire the necessrary synchronization locks and commit or rollback changes.
/// </summary>
2008-06-26 20:14:33 +00:00
/// <param name="uuid">The item UUID</param>
2008-09-06 07:52:41 +00:00
private void RemoveItems ( UUID uuid )
2008-01-21 16:42:53 +00:00
{
2008-05-16 01:22:11 +00:00
DataTable items = ds . Tables [ "primitems" ] ;
2008-01-21 16:42:53 +00:00
2008-05-16 01:22:11 +00:00
String sql = String . Format ( "primID = '{0}'" , uuid ) ;
2008-01-21 16:42:53 +00:00
DataRow [ ] itemRows = items . Select ( sql ) ;
2008-05-16 01:22:11 +00:00
2008-01-21 16:42:53 +00:00
foreach ( DataRow itemRow in itemRows )
{
itemRow . Delete ( ) ;
}
}
2008-01-05 21:17:51 +00:00
/// <summary>
/// Load persisted objects from region storage.
/// </summary>
2008-06-26 20:14:33 +00:00
/// <param name="regionUUID">The region UUID</param>
2008-01-07 02:12:06 +00:00
/// <returns>List of loaded groups</returns>
2008-09-06 07:52:41 +00:00
public List < SceneObjectGroup > LoadObjects ( UUID regionUUID )
2007-08-09 01:54:01 +00:00
{
2008-09-06 07:52:41 +00:00
Dictionary < UUID , SceneObjectGroup > createdObjects = new Dictionary < UUID , SceneObjectGroup > ( ) ;
2007-08-29 16:35:22 +00:00
2007-08-23 15:16:53 +00:00
List < SceneObjectGroup > retvals = new List < SceneObjectGroup > ( ) ;
2007-08-19 13:35:20 +00:00
2007-08-23 15:16:53 +00:00
DataTable prims = ds . Tables [ "prims" ] ;
DataTable shapes = ds . Tables [ "primshapes" ] ;
2007-08-19 13:35:20 +00:00
2009-05-07 13:20:29 +00:00
string byRegion = "RegionUUID = '" + regionUUID + "'" ;
2007-08-29 16:35:22 +00:00
2007-10-30 09:05:31 +00:00
lock ( ds )
{
2009-01-19 15:16:17 +00:00
DataRow [ ] primsForRegion = prims . Select ( byRegion ) ;
2010-06-04 16:14:12 +00:00
// m_log.Info("[SQLITE REGION DB]: Loaded " + primsForRegion.Length + " prims for region: " + regionUUID);
2012-02-12 23:58:28 +00:00
2017-01-05 19:07:37 +00:00
// First, create all groups
2007-09-13 13:10:21 +00:00
foreach ( DataRow primRow in primsForRegion )
2007-08-29 16:35:22 +00:00
{
2007-09-13 13:10:21 +00:00
try
2007-08-23 15:16:53 +00:00
{
2008-01-05 22:48:36 +00:00
SceneObjectPart prim = null ;
2008-05-16 01:22:11 +00:00
2012-02-12 23:58:28 +00:00
string uuid = ( string ) primRow [ "UUID" ] ;
string objID = ( string ) primRow [ "SceneGroupID" ] ;
2007-09-13 13:10:21 +00:00
if ( uuid = = objID ) //is new SceneObjectGroup ?
2007-08-28 15:33:22 +00:00
{
2008-01-05 22:48:36 +00:00
prim = buildPrim ( primRow ) ;
2009-05-07 13:20:29 +00:00
DataRow shapeRow = shapes . Rows . Find ( prim . UUID . ToString ( ) ) ;
2007-09-13 13:10:21 +00:00
if ( shapeRow ! = null )
{
prim . Shape = buildShape ( shapeRow ) ;
}
else
2007-09-25 11:48:43 +00:00
{
2010-06-04 16:14:12 +00:00
m_log . Warn (
"[SQLITE REGION DB]: No shape found for prim in storage, so setting default box shape" ) ;
2007-12-28 08:34:38 +00:00
prim . Shape = PrimitiveBaseShape . Default ;
2007-10-30 09:05:31 +00:00
}
2012-02-12 23:58:28 +00:00
2009-09-16 22:06:08 +00:00
SceneObjectGroup group = new SceneObjectGroup ( prim ) ;
2017-01-05 19:07:37 +00:00
2008-09-26 17:25:22 +00:00
createdObjects . Add ( group . UUID , group ) ;
2007-09-13 13:10:21 +00:00
retvals . Add ( group ) ;
2008-10-30 12:56:10 +00:00
LoadItems ( prim ) ;
2013-06-12 23:13:00 +00:00
2017-01-05 19:07:37 +00:00
2007-08-28 15:33:22 +00:00
}
2008-10-30 12:56:04 +00:00
}
catch ( Exception e )
{
2010-06-04 16:14:12 +00:00
m_log . Error ( "[SQLITE REGION DB]: Failed create prim object in new group, exception and data follows" ) ;
m_log . Error ( "[SQLITE REGION DB]: " , e ) ;
2008-10-30 12:56:04 +00:00
foreach ( DataColumn col in prims . Columns )
{
2010-06-04 16:14:12 +00:00
m_log . Error ( "[SQLITE REGION DB]: Col: " + col . ColumnName + " => " + primRow [ col ] ) ;
2008-10-30 12:56:04 +00:00
}
}
}
2012-02-12 23:58:28 +00:00
2008-10-30 12:56:04 +00:00
// Now fill the groups with part data
foreach ( DataRow primRow in primsForRegion )
{
try
{
SceneObjectPart prim = null ;
2012-02-12 23:58:28 +00:00
string uuid = ( string ) primRow [ "UUID" ] ;
string objID = ( string ) primRow [ "SceneGroupID" ] ;
2008-10-30 12:56:04 +00:00
if ( uuid ! = objID ) //is new SceneObjectGroup ?
2007-08-28 15:33:22 +00:00
{
2008-01-05 22:48:36 +00:00
prim = buildPrim ( primRow ) ;
2009-05-07 13:20:29 +00:00
DataRow shapeRow = shapes . Rows . Find ( prim . UUID . ToString ( ) ) ;
2007-09-13 13:10:21 +00:00
if ( shapeRow ! = null )
{
prim . Shape = buildShape ( shapeRow ) ;
}
else
{
2009-01-29 20:08:04 +00:00
m_log . Warn (
2010-06-04 16:14:12 +00:00
"[SQLITE REGION DB]: No shape found for prim in storage, so setting default box shape" ) ;
2007-12-28 08:34:38 +00:00
prim . Shape = PrimitiveBaseShape . Default ;
2007-09-13 13:10:21 +00:00
}
2010-09-12 17:43:49 +00:00
2008-09-06 07:52:41 +00:00
createdObjects [ new UUID ( objID ) ] . AddPart ( prim ) ;
2008-10-30 12:56:10 +00:00
LoadItems ( prim ) ;
2007-08-28 15:33:22 +00:00
}
2008-09-09 18:44:54 +00:00
}
2007-09-13 13:10:21 +00:00
catch ( Exception e )
2007-08-23 15:16:53 +00:00
{
2010-06-04 16:14:12 +00:00
m_log . Error ( "[SQLITE REGION DB]: Failed create prim object in group, exception and data follows" ) ;
m_log . Error ( "[SQLITE REGION DB]: " , e ) ;
2007-09-13 13:10:21 +00:00
foreach ( DataColumn col in prims . Columns )
2007-08-28 15:33:22 +00:00
{
2010-06-04 16:14:12 +00:00
m_log . Error ( "[SQLITE REGION DB]: Col: " + col . ColumnName + " => " + primRow [ col ] ) ;
2007-08-28 15:33:22 +00:00
}
2007-08-23 15:16:53 +00:00
}
2007-08-28 15:27:27 +00:00
}
2007-08-09 02:26:34 +00:00
}
2007-08-31 11:48:29 +00:00
return retvals ;
2007-08-09 02:26:34 +00:00
}
2008-01-05 21:17:51 +00:00
/// <summary>
/// Load in a prim's persisted inventory.
/// </summary>
2008-06-26 20:14:33 +00:00
/// <param name="prim">the prim</param>
2008-01-05 22:48:36 +00:00
private void LoadItems ( SceneObjectPart prim )
2010-09-12 17:43:49 +00:00
{
// m_log.DebugFormat("[SQLITE REGION DB]: Loading inventory for {0} {1}", prim.Name, prim.UUID);
2009-09-30 16:00:09 +00:00
DataTable dbItems = ds . Tables [ "primitems" ] ;
2010-09-12 17:43:49 +00:00
String sql = String . Format ( "primID = '{0}'" , prim . UUID . ToString ( ) ) ;
2008-01-05 21:17:51 +00:00
DataRow [ ] dbItemRows = dbItems . Select ( sql ) ;
2008-01-06 01:56:29 +00:00
IList < TaskInventoryItem > inventory = new List < TaskInventoryItem > ( ) ;
2008-05-16 01:22:11 +00:00
2012-02-12 23:58:28 +00:00
// m_log.DebugFormat("[SQLITE REGION DB]: Found {0} items for {1} {2}", dbItemRows.Length, prim.Name, prim.UUID);
2010-09-12 17:43:49 +00:00
2008-01-05 22:48:36 +00:00
foreach ( DataRow row in dbItemRows )
{
2008-01-06 01:56:29 +00:00
TaskInventoryItem item = buildItem ( row ) ;
2008-01-06 01:16:06 +00:00
inventory . Add ( item ) ;
2008-05-16 01:22:11 +00:00
2010-06-04 16:14:12 +00:00
// m_log.DebugFormat("[SQLITE REGION DB]: Restored item {0} {1}", item.Name, item.ItemID);
2008-01-05 22:48:36 +00:00
}
2008-05-16 01:22:11 +00:00
2008-11-21 21:16:42 +00:00
prim . Inventory . RestoreInventoryItems ( inventory ) ;
2008-01-05 21:17:51 +00:00
}
2007-09-10 06:45:54 +00:00
2013-10-02 23:59:37 +00:00
// Legacy entry point for when terrain was always a 256x256 hieghtmap
public void StoreTerrain ( double [ , ] ter , UUID regionID )
{
2019-01-21 06:14:41 +00:00
StoreTerrain ( new TerrainData ( ter ) , regionID ) ;
2013-10-02 23:59:37 +00:00
}
2008-06-26 20:14:33 +00:00
/// <summary>
2016-09-17 14:45:11 +00:00
/// Store a terrain in region storage
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="ter">terrain heightfield</param>
/// <param name="regionID">region UUID</param>
2013-10-02 23:59:37 +00:00
public void StoreTerrain ( TerrainData terrData , UUID regionID )
2007-08-09 02:26:34 +00:00
{
2007-12-27 21:41:48 +00:00
lock ( ds )
{
2019-01-21 06:14:41 +00:00
using ( SqliteCommand cmd = new SqliteCommand ( "delete from terrain where RegionUUID=:RegionUUID" , m_conn ) )
2007-11-19 22:59:28 +00:00
{
2009-05-07 13:20:29 +00:00
cmd . Parameters . Add ( new SqliteParameter ( ":RegionUUID" , regionID . ToString ( ) ) ) ;
2007-11-19 22:59:28 +00:00
cmd . ExecuteNonQuery ( ) ;
}
2008-09-16 19:51:14 +00:00
// the following is an work around for .NET. The perf
// issues associated with it aren't as bad as you think.
String sql = "insert into terrain(RegionUUID, Revision, Heightfield)" +
" values(:RegionUUID, :Revision, :Heightfield)" ;
2013-10-02 23:59:37 +00:00
int terrainDBRevision ;
Array terrainDBblob ;
terrData . GetDatabaseBlob ( out terrainDBRevision , out terrainDBblob ) ;
2016-09-17 14:45:11 +00:00
m_log . DebugFormat ( "{0} Storing terrain format {1}" , LogHeader , terrainDBRevision ) ;
using ( SqliteCommand cmd = new SqliteCommand ( sql , m_conn ) )
{
cmd . Parameters . Add ( new SqliteParameter ( ":RegionUUID" , regionID . ToString ( ) ) ) ;
cmd . Parameters . Add ( new SqliteParameter ( ":Revision" , terrainDBRevision ) ) ;
cmd . Parameters . Add ( new SqliteParameter ( ":Heightfield" , terrainDBblob ) ) ;
cmd . ExecuteNonQuery ( ) ;
}
}
}
/// <summary>
/// Store baked terrain in region storage
/// </summary>
/// <param name="ter">terrain heightfield</param>
/// <param name="regionID">region UUID</param>
public void StoreBakedTerrain ( TerrainData terrData , UUID regionID )
{
lock ( ds )
{
using (
SqliteCommand cmd = new SqliteCommand ( "delete from bakedterrain where RegionUUID=:RegionUUID" , m_conn ) )
{
cmd . Parameters . Add ( new SqliteParameter ( ":RegionUUID" , regionID . ToString ( ) ) ) ;
cmd . ExecuteNonQuery ( ) ;
}
// the following is an work around for .NET. The perf
// issues associated with it aren't as bad as you think.
String sql = "insert into bakedterrain(RegionUUID, Revision, Heightfield)" +
" values(:RegionUUID, :Revision, :Heightfield)" ;
int terrainDBRevision ;
Array terrainDBblob ;
terrData . GetDatabaseBlob ( out terrainDBRevision , out terrainDBblob ) ;
m_log . DebugFormat ( "{0} Storing bakedterrain format {1}" , LogHeader , terrainDBRevision ) ;
2013-10-02 23:59:37 +00:00
2008-09-16 19:51:14 +00:00
using ( SqliteCommand cmd = new SqliteCommand ( sql , m_conn ) )
{
2009-05-07 13:20:29 +00:00
cmd . Parameters . Add ( new SqliteParameter ( ":RegionUUID" , regionID . ToString ( ) ) ) ;
2013-10-02 23:59:37 +00:00
cmd . Parameters . Add ( new SqliteParameter ( ":Revision" , terrainDBRevision ) ) ;
cmd . Parameters . Add ( new SqliteParameter ( ":Heightfield" , terrainDBblob ) ) ;
2008-09-16 19:51:14 +00:00
cmd . ExecuteNonQuery ( ) ;
}
2007-10-23 14:31:35 +00:00
}
2007-08-23 15:16:53 +00:00
}
2008-06-26 20:14:33 +00:00
/// <summary>
/// Load the latest terrain revision from region storage
/// </summary>
/// <param name="regionID">the region UUID</param>
/// <returns>Heightfield data</returns>
2008-09-06 07:52:41 +00:00
public double [ , ] LoadTerrain ( UUID regionID )
2007-08-23 15:16:53 +00:00
{
2014-01-28 23:29:06 +00:00
double [ , ] ret = null ;
2013-11-01 18:35:31 +00:00
TerrainData terrData = LoadTerrain ( regionID , ( int ) Constants . RegionSize , ( int ) Constants . RegionSize , ( int ) Constants . RegionHeight ) ;
2014-01-28 23:29:06 +00:00
if ( terrData ! = null )
ret = terrData . GetDoubles ( ) ;
return ret ;
2013-11-01 18:35:31 +00:00
}
2014-01-28 23:29:06 +00:00
// Returns 'null' if region not found
2013-11-01 18:35:31 +00:00
public TerrainData LoadTerrain ( UUID regionID , int pSizeX , int pSizeY , int pSizeZ )
{
TerrainData terrData = null ;
2007-12-27 21:41:48 +00:00
lock ( ds )
{
String sql = "select RegionUUID, Revision, Heightfield from terrain" +
" where RegionUUID=:RegionUUID order by Revision desc" ;
2008-01-14 19:47:59 +00:00
using ( SqliteCommand cmd = new SqliteCommand ( sql , m_conn ) )
2007-10-22 21:57:32 +00:00
{
2009-05-07 13:20:29 +00:00
cmd . Parameters . Add ( new SqliteParameter ( ":RegionUUID" , regionID . ToString ( ) ) ) ;
2007-12-27 21:41:48 +00:00
2007-11-19 15:07:04 +00:00
using ( IDataReader row = cmd . ExecuteReader ( ) )
2007-10-22 21:57:32 +00:00
{
2007-11-19 15:07:04 +00:00
int rev = 0 ;
if ( row . Read ( ) )
2007-10-23 14:31:35 +00:00
{
2010-04-30 16:45:00 +00:00
rev = Convert . ToInt32 ( row [ "Revision" ] ) ;
2013-11-01 18:35:31 +00:00
byte [ ] blob = ( byte [ ] ) row [ "Heightfield" ] ;
terrData = TerrainData . CreateFromDatabaseBlobFactory ( pSizeX , pSizeY , pSizeZ , rev , blob ) ;
2007-10-23 14:31:35 +00:00
}
2007-11-19 15:07:04 +00:00
else
{
2010-06-04 16:14:12 +00:00
m_log . Warn ( "[SQLITE REGION DB]: No terrain found for region" ) ;
2007-11-19 15:07:04 +00:00
return null ;
}
2007-12-27 21:41:48 +00:00
2010-06-04 16:14:12 +00:00
m_log . Debug ( "[SQLITE REGION DB]: Loaded terrain revision r" + rev . ToString ( ) ) ;
2007-11-14 14:11:45 +00:00
}
2007-10-22 21:57:32 +00:00
}
}
2013-11-01 18:35:31 +00:00
return terrData ;
2007-08-23 15:16:53 +00:00
}
2016-09-17 15:42:40 +00:00
public TerrainData LoadBakedTerrain ( UUID regionID , int pSizeX , int pSizeY , int pSizeZ )
{
TerrainData terrData = null ;
lock ( ds )
{
2016-09-18 19:00:47 +00:00
String sql = "select RegionUUID, Revision, Heightfield from bakedterrain" +
2016-09-17 15:42:40 +00:00
" where RegionUUID=:RegionUUID" ;
using ( SqliteCommand cmd = new SqliteCommand ( sql , m_conn ) )
{
cmd . Parameters . Add ( new SqliteParameter ( ":RegionUUID" , regionID . ToString ( ) ) ) ;
using ( IDataReader row = cmd . ExecuteReader ( ) )
{
int rev = 0 ;
if ( row . Read ( ) )
{
rev = Convert . ToInt32 ( row [ "Revision" ] ) ;
byte [ ] blob = ( byte [ ] ) row [ "Heightfield" ] ;
terrData = TerrainData . CreateFromDatabaseBlobFactory ( pSizeX , pSizeY , pSizeZ , rev , blob ) ;
}
}
}
}
return terrData ;
}
2008-09-06 07:52:41 +00:00
public void RemoveLandObject ( UUID globalID )
2007-08-23 15:16:53 +00:00
{
2007-12-18 17:42:02 +00:00
lock ( ds )
{
2010-02-13 10:09:15 +00:00
// Can't use blanket SQL statements when using SqlAdapters unless you re-read the data into the adapter
// after you're done.
// replaced below code with the SqliteAdapter version.
//using (SqliteCommand cmd = new SqliteCommand("delete from land where UUID=:UUID", m_conn))
//{
// cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString()));
// cmd.ExecuteNonQuery();
//}
//using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:UUID", m_conn))
//{
// cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString()));
// cmd.ExecuteNonQuery();
//}
DataTable land = ds . Tables [ "land" ] ;
DataTable landaccesslist = ds . Tables [ "landaccesslist" ] ;
DataRow landRow = land . Rows . Find ( globalID . ToString ( ) ) ;
if ( landRow ! = null )
2007-12-18 17:42:02 +00:00
{
2010-11-23 09:40:31 +00:00
landRow . Delete ( ) ;
2007-12-18 17:42:02 +00:00
}
2010-02-13 10:09:15 +00:00
List < DataRow > rowsToDelete = new List < DataRow > ( ) ;
foreach ( DataRow rowToCheck in landaccesslist . Rows )
2007-12-18 17:42:02 +00:00
{
2010-02-13 10:09:15 +00:00
if ( rowToCheck [ "LandUUID" ] . ToString ( ) = = globalID . ToString ( ) )
rowsToDelete . Add ( rowToCheck ) ;
}
for ( int iter = 0 ; iter < rowsToDelete . Count ; iter + + )
{
2010-11-23 09:40:31 +00:00
rowsToDelete [ iter ] . Delete ( ) ;
2007-12-18 17:42:02 +00:00
}
}
2010-02-13 10:09:15 +00:00
Commit ( ) ;
2007-08-23 15:16:53 +00:00
}
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="parcel"></param>
2008-03-22 23:10:22 +00:00
public void StoreLandObject ( ILandObject parcel )
2007-08-23 15:16:53 +00:00
{
2007-12-18 17:42:02 +00:00
lock ( ds )
{
DataTable land = ds . Tables [ "land" ] ;
DataTable landaccesslist = ds . Tables [ "landaccesslist" ] ;
2009-10-02 09:10:52 +00:00
DataRow landRow = land . Rows . Find ( parcel . LandData . GlobalID . ToString ( ) ) ;
2007-12-18 17:42:02 +00:00
if ( landRow = = null )
{
landRow = land . NewRow ( ) ;
2009-10-02 09:10:52 +00:00
fillLandRow ( landRow , parcel . LandData , parcel . RegionUUID ) ;
2007-12-18 17:42:02 +00:00
land . Rows . Add ( landRow ) ;
}
else
{
2009-10-02 09:10:52 +00:00
fillLandRow ( landRow , parcel . LandData , parcel . RegionUUID ) ;
2007-12-18 17:42:02 +00:00
}
2008-03-11 00:22:56 +00:00
// I know this caused someone issues before, but OpenSim is unusable if we leave this stuff around
2010-02-13 10:09:15 +00:00
//using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:LandUUID", m_conn))
//{
// cmd.Parameters.Add(new SqliteParameter(":LandUUID", parcel.LandData.GlobalID.ToString()));
// cmd.ExecuteNonQuery();
2012-02-12 23:58:28 +00:00
// }
2010-02-13 10:09:15 +00:00
// This is the slower.. but more appropriate thing to do
// We can't modify the table with direct queries before calling Commit() and re-filling them.
List < DataRow > rowsToDelete = new List < DataRow > ( ) ;
foreach ( DataRow rowToCheck in landaccesslist . Rows )
2008-03-11 00:22:56 +00:00
{
2010-02-13 10:09:15 +00:00
if ( rowToCheck [ "LandUUID" ] . ToString ( ) = = parcel . LandData . GlobalID . ToString ( ) )
rowsToDelete . Add ( rowToCheck ) ;
2008-03-11 00:22:56 +00:00
}
2010-02-13 10:09:15 +00:00
for ( int iter = 0 ; iter < rowsToDelete . Count ; iter + + )
{
2010-11-23 09:40:31 +00:00
rowsToDelete [ iter ] . Delete ( ) ;
2010-02-13 10:09:15 +00:00
landaccesslist . Rows . Remove ( rowsToDelete [ iter ] ) ;
}
rowsToDelete . Clear ( ) ;
2012-02-02 23:40:56 +00:00
foreach ( LandAccessEntry entry in parcel . LandData . ParcelAccessList )
2007-12-18 17:42:02 +00:00
{
DataRow newAccessRow = landaccesslist . NewRow ( ) ;
2009-10-02 09:10:52 +00:00
fillLandAccessRow ( newAccessRow , entry , parcel . LandData . GlobalID ) ;
2007-12-18 17:42:02 +00:00
landaccesslist . Rows . Add ( newAccessRow ) ;
}
}
Commit ( ) ;
2007-08-23 15:16:53 +00:00
}
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="regionUUID"></param>
/// <returns></returns>
2008-09-06 07:52:41 +00:00
public List < LandData > LoadLandObjects ( UUID regionUUID )
2007-08-23 15:16:53 +00:00
{
2007-12-18 17:42:02 +00:00
List < LandData > landDataForRegion = new List < LandData > ( ) ;
2007-12-27 21:41:48 +00:00
lock ( ds )
2007-12-18 17:42:02 +00:00
{
DataTable land = ds . Tables [ "land" ] ;
DataTable landaccesslist = ds . Tables [ "landaccesslist" ] ;
2009-05-07 13:20:29 +00:00
string searchExp = "RegionUUID = '" + regionUUID + "'" ;
2007-12-18 17:42:02 +00:00
DataRow [ ] rawDataForRegion = land . Select ( searchExp ) ;
foreach ( DataRow rawDataLand in rawDataForRegion )
{
LandData newLand = buildLandData ( rawDataLand ) ;
2009-05-07 13:20:29 +00:00
string accessListSearchExp = "LandUUID = '" + newLand . GlobalID + "'" ;
2007-12-18 17:42:02 +00:00
DataRow [ ] rawDataForLandAccessList = landaccesslist . Select ( accessListSearchExp ) ;
foreach ( DataRow rawDataLandAccess in rawDataForLandAccessList )
{
2008-07-23 15:50:32 +00:00
newLand . ParcelAccessList . Add ( buildLandAccessData ( rawDataLandAccess ) ) ;
2007-12-18 17:42:02 +00:00
}
landDataForRegion . Add ( newLand ) ;
}
}
return landDataForRegion ;
2007-08-23 15:16:53 +00:00
}
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
2007-09-13 13:10:21 +00:00
public void Commit ( )
2007-08-23 15:16:53 +00:00
{
2012-02-12 23:58:28 +00:00
// m_log.Debug("[SQLITE]: Starting commit");
2007-10-30 09:05:31 +00:00
lock ( ds )
{
2007-09-13 13:10:21 +00:00
primDa . Update ( ds , "prims" ) ;
shapeDa . Update ( ds , "primshapes" ) ;
2008-05-16 01:22:11 +00:00
2008-09-09 20:23:10 +00:00
itemsDa . Update ( ds , "primitems" ) ;
2008-05-16 01:22:11 +00:00
2007-10-22 21:57:32 +00:00
terrainDa . Update ( ds , "terrain" ) ;
2007-12-18 17:42:02 +00:00
landDa . Update ( ds , "land" ) ;
landAccessListDa . Update ( ds , "landaccesslist" ) ;
2009-07-10 21:47:54 +00:00
try
{
regionSettingsDa . Update ( ds , "regionsettings" ) ;
2012-02-12 23:58:28 +00:00
regionWindlightDa . Update ( ds , "regionwindlight" ) ;
2010-09-12 17:43:49 +00:00
}
2010-04-30 16:45:00 +00:00
catch ( SqliteException SqlEx )
2009-07-10 21:47:54 +00:00
{
2010-04-30 16:45:00 +00:00
throw new Exception (
"There was a SQL error or connection string configuration error when saving the region settings. This could be a bug, it could also happen if ConnectionString is defined in the [DatabaseService] section of StandaloneCommon.ini in the config_include folder. This could also happen if the config_include folder doesn't exist or if the OpenSim.ini [Architecture] section isn't set. If this is your first time running OpenSimulator, please restart the simulator and bug a developer to fix this!" ,
SqlEx ) ;
2009-07-10 21:47:54 +00:00
}
2007-09-13 13:10:21 +00:00
ds . AcceptChanges ( ) ;
}
2007-08-23 15:16:53 +00:00
}
2008-06-26 20:14:33 +00:00
/// <summary>
/// See <see cref="Commit"/>
/// </summary>
2007-09-13 13:10:21 +00:00
public void Shutdown ( )
{
Commit ( ) ;
}
2007-08-09 01:54:01 +00:00
2007-08-23 15:16:53 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Database Definition Functions
2008-05-16 01:22:11 +00:00
*
2007-08-23 15:16:53 +00:00
* This should be db agnostic as we define them in ADO . NET terms
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2007-08-29 16:35:22 +00:00
2010-04-30 16:45:00 +00:00
protected void CreateDataSetMapping ( IDataAdapter da , string tableName )
{
ITableMapping dbMapping = da . TableMappings . Add ( tableName , tableName ) ;
foreach ( DataColumn col in ds . Tables [ tableName ] . Columns )
{
dbMapping . ColumnMappings . Add ( col . ColumnName , col . ColumnName ) ;
}
}
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="dt"></param>
/// <param name="name"></param>
/// <param name="type"></param>
2008-05-01 16:03:53 +00:00
private static void createCol ( DataTable dt , string name , Type type )
2007-08-08 17:59:16 +00:00
{
2007-08-23 15:16:53 +00:00
DataColumn col = new DataColumn ( name , type ) ;
dt . Columns . Add ( col ) ;
}
2007-08-07 19:49:43 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
/// Creates the "terrain" table
/// </summary>
/// <returns>terrain table DataTable</returns>
2008-05-01 16:03:53 +00:00
private static DataTable createTerrainTable ( )
2007-10-22 21:57:32 +00:00
{
DataTable terrain = new DataTable ( "terrain" ) ;
2012-02-12 23:58:28 +00:00
createCol ( terrain , "RegionUUID" , typeof ( String ) ) ;
createCol ( terrain , "Revision" , typeof ( Int32 ) ) ;
createCol ( terrain , "Heightfield" , typeof ( Byte [ ] ) ) ;
2007-10-22 21:57:32 +00:00
return terrain ;
}
2008-06-26 20:14:33 +00:00
/// <summary>
/// Creates the "prims" table
/// </summary>
/// <returns>prim table DataTable</returns>
2008-05-01 16:03:53 +00:00
private static DataTable createPrimTable ( )
2007-08-23 15:16:53 +00:00
{
DataTable prims = new DataTable ( "prims" ) ;
2007-08-19 13:35:20 +00:00
2012-02-12 23:58:28 +00:00
createCol ( prims , "UUID" , typeof ( String ) ) ;
createCol ( prims , "RegionUUID" , typeof ( String ) ) ;
createCol ( prims , "CreationDate" , typeof ( Int32 ) ) ;
createCol ( prims , "Name" , typeof ( String ) ) ;
createCol ( prims , "SceneGroupID" , typeof ( String ) ) ;
2007-08-23 15:16:53 +00:00
// various text fields
2012-02-12 23:58:28 +00:00
createCol ( prims , "Text" , typeof ( String ) ) ;
createCol ( prims , "ColorR" , typeof ( Int32 ) ) ;
createCol ( prims , "ColorG" , typeof ( Int32 ) ) ;
createCol ( prims , "ColorB" , typeof ( Int32 ) ) ;
createCol ( prims , "ColorA" , typeof ( Int32 ) ) ;
createCol ( prims , "Description" , typeof ( String ) ) ;
createCol ( prims , "SitName" , typeof ( String ) ) ;
createCol ( prims , "TouchName" , typeof ( String ) ) ;
2007-08-23 15:16:53 +00:00
// permissions
2012-02-12 23:58:28 +00:00
createCol ( prims , "ObjectFlags" , typeof ( Int32 ) ) ;
createCol ( prims , "CreatorID" , typeof ( String ) ) ;
createCol ( prims , "OwnerID" , typeof ( String ) ) ;
createCol ( prims , "GroupID" , typeof ( String ) ) ;
createCol ( prims , "LastOwnerID" , typeof ( String ) ) ;
2016-12-04 06:10:13 +00:00
createCol ( prims , "RezzerID" , typeof ( String ) ) ;
2012-02-12 23:58:28 +00:00
createCol ( prims , "OwnerMask" , typeof ( Int32 ) ) ;
createCol ( prims , "NextOwnerMask" , typeof ( Int32 ) ) ;
createCol ( prims , "GroupMask" , typeof ( Int32 ) ) ;
createCol ( prims , "EveryoneMask" , typeof ( Int32 ) ) ;
createCol ( prims , "BaseMask" , typeof ( Int32 ) ) ;
2007-08-23 15:16:53 +00:00
// vectors
2012-02-12 23:58:28 +00:00
createCol ( prims , "PositionX" , typeof ( Double ) ) ;
createCol ( prims , "PositionY" , typeof ( Double ) ) ;
createCol ( prims , "PositionZ" , typeof ( Double ) ) ;
createCol ( prims , "GroupPositionX" , typeof ( Double ) ) ;
createCol ( prims , "GroupPositionY" , typeof ( Double ) ) ;
createCol ( prims , "GroupPositionZ" , typeof ( Double ) ) ;
createCol ( prims , "VelocityX" , typeof ( Double ) ) ;
createCol ( prims , "VelocityY" , typeof ( Double ) ) ;
createCol ( prims , "VelocityZ" , typeof ( Double ) ) ;
createCol ( prims , "AngularVelocityX" , typeof ( Double ) ) ;
createCol ( prims , "AngularVelocityY" , typeof ( Double ) ) ;
createCol ( prims , "AngularVelocityZ" , typeof ( Double ) ) ;
createCol ( prims , "AccelerationX" , typeof ( Double ) ) ;
createCol ( prims , "AccelerationY" , typeof ( Double ) ) ;
createCol ( prims , "AccelerationZ" , typeof ( Double ) ) ;
2007-08-23 15:16:53 +00:00
// quaternions
2012-02-12 23:58:28 +00:00
createCol ( prims , "RotationX" , typeof ( Double ) ) ;
createCol ( prims , "RotationY" , typeof ( Double ) ) ;
createCol ( prims , "RotationZ" , typeof ( Double ) ) ;
createCol ( prims , "RotationW" , typeof ( Double ) ) ;
2007-08-29 16:35:22 +00:00
2007-12-27 05:37:48 +00:00
// sit target
2012-02-12 23:58:28 +00:00
createCol ( prims , "SitTargetOffsetX" , typeof ( Double ) ) ;
createCol ( prims , "SitTargetOffsetY" , typeof ( Double ) ) ;
createCol ( prims , "SitTargetOffsetZ" , typeof ( Double ) ) ;
2007-12-27 05:37:48 +00:00
2012-02-12 23:58:28 +00:00
createCol ( prims , "SitTargetOrientW" , typeof ( Double ) ) ;
createCol ( prims , "SitTargetOrientX" , typeof ( Double ) ) ;
createCol ( prims , "SitTargetOrientY" , typeof ( Double ) ) ;
createCol ( prims , "SitTargetOrientZ" , typeof ( Double ) ) ;
2007-12-27 05:37:48 +00:00
2008-09-18 17:47:29 +00:00
createCol ( prims , "PayPrice" , typeof ( Int32 ) ) ;
createCol ( prims , "PayButton1" , typeof ( Int32 ) ) ;
createCol ( prims , "PayButton2" , typeof ( Int32 ) ) ;
createCol ( prims , "PayButton3" , typeof ( Int32 ) ) ;
createCol ( prims , "PayButton4" , typeof ( Int32 ) ) ;
createCol ( prims , "LoopedSound" , typeof ( String ) ) ;
createCol ( prims , "LoopedSoundGain" , typeof ( Double ) ) ;
createCol ( prims , "TextureAnimation" , typeof ( String ) ) ;
createCol ( prims , "ParticleSystem" , typeof ( String ) ) ;
createCol ( prims , "OmegaX" , typeof ( Double ) ) ;
createCol ( prims , "OmegaY" , typeof ( Double ) ) ;
createCol ( prims , "OmegaZ" , typeof ( Double ) ) ;
createCol ( prims , "CameraEyeOffsetX" , typeof ( Double ) ) ;
createCol ( prims , "CameraEyeOffsetY" , typeof ( Double ) ) ;
createCol ( prims , "CameraEyeOffsetZ" , typeof ( Double ) ) ;
createCol ( prims , "CameraAtOffsetX" , typeof ( Double ) ) ;
createCol ( prims , "CameraAtOffsetY" , typeof ( Double ) ) ;
createCol ( prims , "CameraAtOffsetZ" , typeof ( Double ) ) ;
createCol ( prims , "ForceMouselook" , typeof ( Int16 ) ) ;
createCol ( prims , "ScriptAccessPin" , typeof ( Int32 ) ) ;
createCol ( prims , "AllowedDrop" , typeof ( Int16 ) ) ;
createCol ( prims , "DieAtEdge" , typeof ( Int16 ) ) ;
createCol ( prims , "SalePrice" , typeof ( Int32 ) ) ;
createCol ( prims , "SaleType" , typeof ( Int16 ) ) ;
2008-09-12 20:37:07 +00:00
// click action
2012-02-12 23:58:28 +00:00
createCol ( prims , "ClickAction" , typeof ( Byte ) ) ;
2008-09-12 20:37:07 +00:00
2008-10-03 12:36:54 +00:00
createCol ( prims , "Material" , typeof ( Byte ) ) ;
2008-10-03 12:11:38 +00:00
2008-11-19 18:30:16 +00:00
createCol ( prims , "CollisionSound" , typeof ( String ) ) ;
createCol ( prims , "CollisionSoundVolume" , typeof ( Double ) ) ;
2008-12-22 09:29:59 +00:00
createCol ( prims , "VolumeDetect" , typeof ( Int16 ) ) ;
2010-09-12 17:43:49 +00:00
2010-07-01 21:52:31 +00:00
createCol ( prims , "MediaURL" , typeof ( String ) ) ;
2017-01-05 19:07:37 +00:00
2013-08-04 17:19:11 +00:00
createCol ( prims , "AttachedPosX" , typeof ( Double ) ) ;
createCol ( prims , "AttachedPosY" , typeof ( Double ) ) ;
createCol ( prims , "AttachedPosZ" , typeof ( Double ) ) ;
2010-08-16 19:38:20 +00:00
createCol ( prims , "DynAttrs" , typeof ( String ) ) ;
2008-12-22 09:29:59 +00:00
2013-02-07 06:23:57 +00:00
createCol ( prims , "PhysicsShapeType" , typeof ( Byte ) ) ;
createCol ( prims , "Density" , typeof ( Double ) ) ;
createCol ( prims , "GravityModifier" , typeof ( Double ) ) ;
createCol ( prims , "Friction" , typeof ( Double ) ) ;
createCol ( prims , "Restitution" , typeof ( Double ) ) ;
2013-06-11 13:56:20 +00:00
createCol ( prims , "KeyframeMotion" , typeof ( Byte [ ] ) ) ;
2015-09-21 11:07:17 +00:00
2007-08-23 15:16:53 +00:00
// Add in contraints
2012-02-12 23:58:28 +00:00
prims . PrimaryKey = new DataColumn [ ] { prims . Columns [ "UUID" ] } ;
2007-08-23 15:16:53 +00:00
return prims ;
2007-08-07 19:49:43 +00:00
}
2008-06-26 20:14:33 +00:00
/// <summary>
/// Creates "primshapes" table
/// </summary>
/// <returns>shape table DataTable</returns>
2008-05-01 16:03:53 +00:00
private static DataTable createShapeTable ( )
2007-08-07 14:39:00 +00:00
{
2007-08-23 15:16:53 +00:00
DataTable shapes = new DataTable ( "primshapes" ) ;
2012-02-12 23:58:28 +00:00
createCol ( shapes , "UUID" , typeof ( String ) ) ;
2007-08-23 15:16:53 +00:00
// shape is an enum
2012-02-12 23:58:28 +00:00
createCol ( shapes , "Shape" , typeof ( Int32 ) ) ;
2007-08-23 15:16:53 +00:00
// vectors
2012-02-12 23:58:28 +00:00
createCol ( shapes , "ScaleX" , typeof ( Double ) ) ;
createCol ( shapes , "ScaleY" , typeof ( Double ) ) ;
createCol ( shapes , "ScaleZ" , typeof ( Double ) ) ;
2007-08-23 15:16:53 +00:00
// paths
2012-02-12 23:58:28 +00:00
createCol ( shapes , "PCode" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathBegin" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathEnd" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathScaleX" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathScaleY" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathShearX" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathShearY" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathSkew" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathCurve" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathRadiusOffset" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathRevolutions" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathTaperX" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathTaperY" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathTwist" , typeof ( Int32 ) ) ;
createCol ( shapes , "PathTwistBegin" , typeof ( Int32 ) ) ;
2007-08-23 15:16:53 +00:00
// profile
2012-02-12 23:58:28 +00:00
createCol ( shapes , "ProfileBegin" , typeof ( Int32 ) ) ;
createCol ( shapes , "ProfileEnd" , typeof ( Int32 ) ) ;
createCol ( shapes , "ProfileCurve" , typeof ( Int32 ) ) ;
createCol ( shapes , "ProfileHollow" , typeof ( Int32 ) ) ;
2008-03-08 22:52:17 +00:00
createCol ( shapes , "State" , typeof ( Int32 ) ) ;
2007-08-23 15:16:53 +00:00
// text TODO: this isn't right, but I'm not sure the right
// way to specify this as a blob atm
2012-02-12 23:58:28 +00:00
createCol ( shapes , "Texture" , typeof ( Byte [ ] ) ) ;
createCol ( shapes , "ExtraParams" , typeof ( Byte [ ] ) ) ;
2010-07-01 21:52:31 +00:00
createCol ( shapes , "Media" , typeof ( String ) ) ;
2007-08-07 14:39:00 +00:00
2012-02-12 23:58:28 +00:00
shapes . PrimaryKey = new DataColumn [ ] { shapes . Columns [ "UUID" ] } ;
2007-08-19 13:35:20 +00:00
2007-08-23 15:16:53 +00:00
return shapes ;
2007-08-07 14:39:00 +00:00
}
2007-12-27 21:41:48 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
/// creates "primitems" table
/// </summary>
/// <returns>item table DataTable</returns>
2008-05-01 16:03:53 +00:00
private static DataTable createItemsTable ( )
2007-12-27 00:53:13 +00:00
{
DataTable items = new DataTable ( "primitems" ) ;
2012-02-12 23:58:28 +00:00
createCol ( items , "itemID" , typeof ( String ) ) ;
createCol ( items , "primID" , typeof ( String ) ) ;
createCol ( items , "assetID" , typeof ( String ) ) ;
createCol ( items , "parentFolderID" , typeof ( String ) ) ;
2008-05-16 01:22:11 +00:00
2012-02-12 23:58:28 +00:00
createCol ( items , "invType" , typeof ( Int32 ) ) ;
createCol ( items , "assetType" , typeof ( Int32 ) ) ;
2007-12-27 21:41:48 +00:00
2012-02-12 23:58:28 +00:00
createCol ( items , "name" , typeof ( String ) ) ;
createCol ( items , "description" , typeof ( String ) ) ;
2007-12-27 21:41:48 +00:00
2012-02-12 23:58:28 +00:00
createCol ( items , "creationDate" , typeof ( Int64 ) ) ;
createCol ( items , "creatorID" , typeof ( String ) ) ;
createCol ( items , "ownerID" , typeof ( String ) ) ;
createCol ( items , "lastOwnerID" , typeof ( String ) ) ;
createCol ( items , "groupID" , typeof ( String ) ) ;
2007-12-27 00:53:13 +00:00
2012-02-12 23:58:28 +00:00
createCol ( items , "nextPermissions" , typeof ( UInt32 ) ) ;
createCol ( items , "currentPermissions" , typeof ( UInt32 ) ) ;
createCol ( items , "basePermissions" , typeof ( UInt32 ) ) ;
createCol ( items , "everyonePermissions" , typeof ( UInt32 ) ) ;
createCol ( items , "groupPermissions" , typeof ( UInt32 ) ) ;
createCol ( items , "flags" , typeof ( UInt32 ) ) ;
2007-12-27 00:53:13 +00:00
2008-04-30 16:08:24 +00:00
items . PrimaryKey = new DataColumn [ ] { items . Columns [ "itemID" ] } ;
2007-12-27 21:41:48 +00:00
2007-12-27 00:53:13 +00:00
return items ;
2007-12-27 21:41:48 +00:00
}
2007-08-29 16:35:22 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
/// Creates "land" table
/// </summary>
/// <returns>land table DataTable</returns>
2008-05-01 16:03:53 +00:00
private static DataTable createLandTable ( )
2007-12-18 17:42:02 +00:00
{
DataTable land = new DataTable ( "land" ) ;
2012-02-12 23:58:28 +00:00
createCol ( land , "UUID" , typeof ( String ) ) ;
createCol ( land , "RegionUUID" , typeof ( String ) ) ;
createCol ( land , "LocalLandID" , typeof ( UInt32 ) ) ;
2007-12-18 17:42:02 +00:00
// Bitmap is a byte[512]
2012-02-12 23:58:28 +00:00
createCol ( land , "Bitmap" , typeof ( Byte [ ] ) ) ;
createCol ( land , "Name" , typeof ( String ) ) ;
createCol ( land , "Desc" , typeof ( String ) ) ;
createCol ( land , "OwnerUUID" , typeof ( String ) ) ;
2016-09-17 18:46:40 +00:00
createCol ( land , "IsGroupOwned" , typeof ( string ) ) ;
2012-02-12 23:58:28 +00:00
createCol ( land , "Area" , typeof ( Int32 ) ) ;
createCol ( land , "AuctionID" , typeof ( Int32 ) ) ; //Unemplemented
createCol ( land , "Category" , typeof ( Int32 ) ) ; //Enum OpenMetaverse.Parcel.ParcelCategory
createCol ( land , "ClaimDate" , typeof ( Int32 ) ) ;
createCol ( land , "ClaimPrice" , typeof ( Int32 ) ) ;
createCol ( land , "GroupUUID" , typeof ( string ) ) ;
createCol ( land , "SalePrice" , typeof ( Int32 ) ) ;
createCol ( land , "LandStatus" , typeof ( Int32 ) ) ; //Enum. OpenMetaverse.Parcel.ParcelStatus
createCol ( land , "LandFlags" , typeof ( UInt32 ) ) ;
createCol ( land , "LandingType" , typeof ( Byte ) ) ;
createCol ( land , "MediaAutoScale" , typeof ( Byte ) ) ;
createCol ( land , "MediaTextureUUID" , typeof ( String ) ) ;
createCol ( land , "MediaURL" , typeof ( String ) ) ;
createCol ( land , "MusicURL" , typeof ( String ) ) ;
createCol ( land , "PassHours" , typeof ( Double ) ) ;
createCol ( land , "PassPrice" , typeof ( UInt32 ) ) ;
createCol ( land , "SnapshotUUID" , typeof ( String ) ) ;
createCol ( land , "UserLocationX" , typeof ( Double ) ) ;
createCol ( land , "UserLocationY" , typeof ( Double ) ) ;
createCol ( land , "UserLocationZ" , typeof ( Double ) ) ;
createCol ( land , "UserLookAtX" , typeof ( Double ) ) ;
createCol ( land , "UserLookAtY" , typeof ( Double ) ) ;
createCol ( land , "UserLookAtZ" , typeof ( Double ) ) ;
2008-04-30 21:15:48 +00:00
createCol ( land , "AuthbuyerID" , typeof ( String ) ) ;
2008-10-18 05:51:36 +00:00
createCol ( land , "OtherCleanTime" , typeof ( Int32 ) ) ;
2012-10-21 12:59:22 +00:00
createCol ( land , "Dwell" , typeof ( Int32 ) ) ;
createCol ( land , "MediaType" , typeof ( String ) ) ;
createCol ( land , "MediaDescription" , typeof ( String ) ) ;
createCol ( land , "MediaSize" , typeof ( String ) ) ;
createCol ( land , "MediaLoop" , typeof ( Boolean ) ) ;
createCol ( land , "ObscureMedia" , typeof ( Boolean ) ) ;
createCol ( land , "ObscureMusic" , typeof ( Boolean ) ) ;
2016-09-17 18:46:40 +00:00
createCol ( land , "SeeAVs" , typeof ( Boolean ) ) ;
createCol ( land , "AnyAVSounds" , typeof ( Boolean ) ) ;
createCol ( land , "GroupAVSounds" , typeof ( Boolean ) ) ;
2007-12-27 21:41:48 +00:00
2012-02-12 23:58:28 +00:00
land . PrimaryKey = new DataColumn [ ] { land . Columns [ "UUID" ] } ;
2007-12-18 17:42:02 +00:00
return land ;
}
2008-06-26 20:14:33 +00:00
/// <summary>
/// create "landaccesslist" table
/// </summary>
/// <returns>Landacceslist DataTable</returns>
2008-05-01 16:03:53 +00:00
private static DataTable createLandAccessListTable ( )
2007-12-18 17:42:02 +00:00
{
DataTable landaccess = new DataTable ( "landaccesslist" ) ;
2012-02-12 23:58:28 +00:00
createCol ( landaccess , "LandUUID" , typeof ( String ) ) ;
createCol ( landaccess , "AccessUUID" , typeof ( String ) ) ;
createCol ( landaccess , "Flags" , typeof ( UInt32 ) ) ;
2007-12-18 17:42:02 +00:00
return landaccess ;
}
2008-09-13 20:37:36 +00:00
private static DataTable createRegionSettingsTable ( )
{
DataTable regionsettings = new DataTable ( "regionsettings" ) ;
createCol ( regionsettings , "regionUUID" , typeof ( String ) ) ;
2012-02-12 23:58:28 +00:00
createCol ( regionsettings , "block_terraform" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "block_fly" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "allow_damage" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "restrict_pushing" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "allow_land_resell" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "allow_land_join_divide" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "block_show_in_search" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "agent_limit" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "object_bonus" , typeof ( Double ) ) ;
createCol ( regionsettings , "maturity" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "disable_scripts" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "disable_collisions" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "disable_physics" , typeof ( Int32 ) ) ;
2008-09-13 20:37:36 +00:00
createCol ( regionsettings , "terrain_texture_1" , typeof ( String ) ) ;
createCol ( regionsettings , "terrain_texture_2" , typeof ( String ) ) ;
createCol ( regionsettings , "terrain_texture_3" , typeof ( String ) ) ;
createCol ( regionsettings , "terrain_texture_4" , typeof ( String ) ) ;
2012-02-12 23:58:28 +00:00
createCol ( regionsettings , "elevation_1_nw" , typeof ( Double ) ) ;
createCol ( regionsettings , "elevation_2_nw" , typeof ( Double ) ) ;
createCol ( regionsettings , "elevation_1_ne" , typeof ( Double ) ) ;
createCol ( regionsettings , "elevation_2_ne" , typeof ( Double ) ) ;
createCol ( regionsettings , "elevation_1_se" , typeof ( Double ) ) ;
createCol ( regionsettings , "elevation_2_se" , typeof ( Double ) ) ;
createCol ( regionsettings , "elevation_1_sw" , typeof ( Double ) ) ;
createCol ( regionsettings , "elevation_2_sw" , typeof ( Double ) ) ;
createCol ( regionsettings , "water_height" , typeof ( Double ) ) ;
createCol ( regionsettings , "terrain_raise_limit" , typeof ( Double ) ) ;
createCol ( regionsettings , "terrain_lower_limit" , typeof ( Double ) ) ;
createCol ( regionsettings , "use_estate_sun" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "sandbox" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "sunvectorx" , typeof ( Double ) ) ;
createCol ( regionsettings , "sunvectory" , typeof ( Double ) ) ;
createCol ( regionsettings , "sunvectorz" , typeof ( Double ) ) ;
createCol ( regionsettings , "fixed_sun" , typeof ( Int32 ) ) ;
createCol ( regionsettings , "sun_position" , typeof ( Double ) ) ;
2008-09-13 20:37:36 +00:00
createCol ( regionsettings , "covenant" , typeof ( String ) ) ;
2012-02-03 21:02:36 +00:00
createCol ( regionsettings , "covenant_datetime" , typeof ( Int32 ) ) ;
2010-05-09 20:39:56 +00:00
createCol ( regionsettings , "map_tile_ID" , typeof ( String ) ) ;
2012-02-17 22:31:20 +00:00
createCol ( regionsettings , "TelehubObject" , typeof ( String ) ) ;
2012-02-18 01:04:38 +00:00
createCol ( regionsettings , "parcel_tile_ID" , typeof ( String ) ) ;
2008-09-13 21:01:21 +00:00
regionsettings . PrimaryKey = new DataColumn [ ] { regionsettings . Columns [ "regionUUID" ] } ;
2008-09-13 20:37:36 +00:00
return regionsettings ;
}
2012-02-12 23:58:28 +00:00
/// <summary>
/// create "regionwindlight" table
/// </summary>
/// <returns>RegionWindlight DataTable</returns>
private static DataTable createRegionWindlightTable ( )
{
DataTable regionwindlight = new DataTable ( "regionwindlight" ) ;
createCol ( regionwindlight , "region_id" , typeof ( String ) ) ;
createCol ( regionwindlight , "water_color_r" , typeof ( Double ) ) ;
createCol ( regionwindlight , "water_color_g" , typeof ( Double ) ) ;
createCol ( regionwindlight , "water_color_b" , typeof ( Double ) ) ;
createCol ( regionwindlight , "water_color_i" , typeof ( Double ) ) ;
createCol ( regionwindlight , "water_fog_density_exponent" , typeof ( Double ) ) ;
createCol ( regionwindlight , "underwater_fog_modifier" , typeof ( Double ) ) ;
createCol ( regionwindlight , "reflection_wavelet_scale_1" , typeof ( Double ) ) ;
createCol ( regionwindlight , "reflection_wavelet_scale_2" , typeof ( Double ) ) ;
createCol ( regionwindlight , "reflection_wavelet_scale_3" , typeof ( Double ) ) ;
createCol ( regionwindlight , "fresnel_scale" , typeof ( Double ) ) ;
createCol ( regionwindlight , "fresnel_offset" , typeof ( Double ) ) ;
createCol ( regionwindlight , "refract_scale_above" , typeof ( Double ) ) ;
createCol ( regionwindlight , "refract_scale_below" , typeof ( Double ) ) ;
createCol ( regionwindlight , "blur_multiplier" , typeof ( Double ) ) ;
createCol ( regionwindlight , "big_wave_direction_x" , typeof ( Double ) ) ;
createCol ( regionwindlight , "big_wave_direction_y" , typeof ( Double ) ) ;
createCol ( regionwindlight , "little_wave_direction_x" , typeof ( Double ) ) ;
createCol ( regionwindlight , "little_wave_direction_y" , typeof ( Double ) ) ;
createCol ( regionwindlight , "normal_map_texture" , typeof ( String ) ) ;
createCol ( regionwindlight , "horizon_r" , typeof ( Double ) ) ;
createCol ( regionwindlight , "horizon_g" , typeof ( Double ) ) ;
createCol ( regionwindlight , "horizon_b" , typeof ( Double ) ) ;
createCol ( regionwindlight , "horizon_i" , typeof ( Double ) ) ;
createCol ( regionwindlight , "haze_horizon" , typeof ( Double ) ) ;
createCol ( regionwindlight , "blue_density_r" , typeof ( Double ) ) ;
createCol ( regionwindlight , "blue_density_g" , typeof ( Double ) ) ;
createCol ( regionwindlight , "blue_density_b" , typeof ( Double ) ) ;
createCol ( regionwindlight , "blue_density_i" , typeof ( Double ) ) ;
createCol ( regionwindlight , "haze_density" , typeof ( Double ) ) ;
createCol ( regionwindlight , "density_multiplier" , typeof ( Double ) ) ;
createCol ( regionwindlight , "distance_multiplier" , typeof ( Double ) ) ;
createCol ( regionwindlight , "max_altitude" , typeof ( Int32 ) ) ;
createCol ( regionwindlight , "sun_moon_color_r" , typeof ( Double ) ) ;
createCol ( regionwindlight , "sun_moon_color_g" , typeof ( Double ) ) ;
createCol ( regionwindlight , "sun_moon_color_b" , typeof ( Double ) ) ;
createCol ( regionwindlight , "sun_moon_color_i" , typeof ( Double ) ) ;
createCol ( regionwindlight , "sun_moon_position" , typeof ( Double ) ) ;
createCol ( regionwindlight , "ambient_r" , typeof ( Double ) ) ;
createCol ( regionwindlight , "ambient_g" , typeof ( Double ) ) ;
createCol ( regionwindlight , "ambient_b" , typeof ( Double ) ) ;
createCol ( regionwindlight , "ambient_i" , typeof ( Double ) ) ;
createCol ( regionwindlight , "east_angle" , typeof ( Double ) ) ;
createCol ( regionwindlight , "sun_glow_focus" , typeof ( Double ) ) ;
createCol ( regionwindlight , "sun_glow_size" , typeof ( Double ) ) ;
createCol ( regionwindlight , "scene_gamma" , typeof ( Double ) ) ;
createCol ( regionwindlight , "star_brightness" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_color_r" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_color_g" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_color_b" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_color_i" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_x" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_y" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_density" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_coverage" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_scale" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_detail_x" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_detail_y" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_detail_density" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_scroll_x" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_scroll_x_lock" , typeof ( Int32 ) ) ;
createCol ( regionwindlight , "cloud_scroll_y" , typeof ( Double ) ) ;
createCol ( regionwindlight , "cloud_scroll_y_lock" , typeof ( Int32 ) ) ;
createCol ( regionwindlight , "draw_classic_clouds" , typeof ( Int32 ) ) ;
regionwindlight . PrimaryKey = new DataColumn [ ] { regionwindlight . Columns [ "region_id" ] } ;
return regionwindlight ;
}
2012-05-23 19:06:25 +00:00
private static DataTable createRegionEnvironmentTable ( )
{
DataTable regionEnvironment = new DataTable ( "regionenvironment" ) ;
createCol ( regionEnvironment , "region_id" , typeof ( String ) ) ;
createCol ( regionEnvironment , "llsd_settings" , typeof ( String ) ) ;
regionEnvironment . PrimaryKey = new DataColumn [ ] { regionEnvironment . Columns [ "region_id" ] } ;
return regionEnvironment ;
}
2012-02-17 22:31:20 +00:00
private static DataTable createRegionSpawnPointsTable ( )
{
DataTable spawn_points = new DataTable ( "spawn_points" ) ;
createCol ( spawn_points , "regionID" , typeof ( String ) ) ;
createCol ( spawn_points , "Yaw" , typeof ( float ) ) ;
createCol ( spawn_points , "Pitch" , typeof ( float ) ) ;
createCol ( spawn_points , "Distance" , typeof ( float ) ) ;
return spawn_points ;
}
2007-08-23 15:16:53 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2008-05-16 01:22:11 +00:00
*
2007-08-23 15:16:53 +00:00
* Convert between ADO . NET < = > OpenSim Objects
*
* These should be database independant
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2007-08-09 18:06:26 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
2007-08-09 20:31:10 +00:00
private SceneObjectPart buildPrim ( DataRow row )
{
2008-09-18 17:47:29 +00:00
// Code commented. Uncomment to test the unit test inline.
2010-09-12 17:43:49 +00:00
// The unit test mentions this commented code for the purposes
2008-09-18 17:47:29 +00:00
// of debugging a unit test failure
2010-09-12 17:43:49 +00:00
2008-09-18 17:47:29 +00:00
// SceneObjectGroup sog = new SceneObjectGroup();
// SceneObjectPart sop = new SceneObjectPart();
// sop.LocalId = 1;
// sop.Name = "object1";
// sop.Description = "object1";
// sop.Text = "";
// sop.SitName = "";
// sop.TouchName = "";
// sop.UUID = UUID.Random();
// sop.Shape = PrimitiveBaseShape.Default;
2008-11-10 20:04:55 +00:00
// sog.SetRootPart(sop);
2008-09-18 17:47:29 +00:00
// Add breakpoint in above line. Check sop fields.
2007-08-09 21:26:39 +00:00
// 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.
2010-09-12 17:43:49 +00:00
2007-08-09 20:31:10 +00:00
SceneObjectPart prim = new SceneObjectPart ( ) ;
2012-02-12 23:58:28 +00:00
prim . UUID = new UUID ( ( String ) row [ "UUID" ] ) ;
2007-08-09 23:51:26 +00:00
// explicit conversion of integers is required, which sort
// of sucks. No idea if there is a shortcut here or not.
prim . CreationDate = Convert . ToInt32 ( row [ "CreationDate" ] ) ;
2009-08-15 11:08:36 +00:00
prim . Name = row [ "Name" ] = = DBNull . Value ? string . Empty : ( string ) row [ "Name" ] ;
2007-08-09 20:59:37 +00:00
// various text fields
2012-02-12 23:58:28 +00:00
prim . Text = ( String ) row [ "Text" ] ;
2008-09-08 02:40:20 +00:00
prim . Color = Color . FromArgb ( Convert . ToInt32 ( row [ "ColorA" ] ) ,
Convert . ToInt32 ( row [ "ColorR" ] ) ,
Convert . ToInt32 ( row [ "ColorG" ] ) ,
Convert . ToInt32 ( row [ "ColorB" ] ) ) ;
2012-02-12 23:58:28 +00:00
prim . Description = ( String ) row [ "Description" ] ;
prim . SitName = ( String ) row [ "SitName" ] ;
prim . TouchName = ( String ) row [ "TouchName" ] ;
2007-08-09 20:59:37 +00:00
// permissions
2014-04-22 17:04:12 +00:00
prim . Flags = ( PrimFlags ) Convert . ToUInt32 ( row [ "ObjectFlags" ] ) ;
2012-02-12 23:58:28 +00:00
prim . CreatorIdentification = ( String ) row [ "CreatorID" ] ;
prim . OwnerID = new UUID ( ( String ) row [ "OwnerID" ] ) ;
prim . GroupID = new UUID ( ( String ) row [ "GroupID" ] ) ;
prim . LastOwnerID = new UUID ( ( String ) row [ "LastOwnerID" ] ) ;
2016-12-04 06:10:13 +00:00
prim . RezzerID = row [ "RezzerID" ] = = DBNull . Value ? UUID . Zero : new UUID ( ( String ) row [ "RezzerID" ] ) ;
2007-08-09 23:51:26 +00:00
prim . OwnerMask = Convert . ToUInt32 ( row [ "OwnerMask" ] ) ;
prim . NextOwnerMask = Convert . ToUInt32 ( row [ "NextOwnerMask" ] ) ;
prim . GroupMask = Convert . ToUInt32 ( row [ "GroupMask" ] ) ;
prim . EveryoneMask = Convert . ToUInt32 ( row [ "EveryoneMask" ] ) ;
prim . BaseMask = Convert . ToUInt32 ( row [ "BaseMask" ] ) ;
2007-08-09 20:59:37 +00:00
// vectors
2008-09-06 07:52:41 +00:00
prim . OffsetPosition = new Vector3 (
2007-09-13 05:25:26 +00:00
Convert . ToSingle ( row [ "PositionX" ] ) ,
Convert . ToSingle ( row [ "PositionY" ] ) ,
Convert . ToSingle ( row [ "PositionZ" ] )
) ;
2008-09-06 07:52:41 +00:00
prim . GroupPosition = new Vector3 (
2007-09-13 05:25:26 +00:00
Convert . ToSingle ( row [ "GroupPositionX" ] ) ,
Convert . ToSingle ( row [ "GroupPositionY" ] ) ,
Convert . ToSingle ( row [ "GroupPositionZ" ] )
) ;
2008-09-06 07:52:41 +00:00
prim . Velocity = new Vector3 (
2007-09-13 05:25:26 +00:00
Convert . ToSingle ( row [ "VelocityX" ] ) ,
Convert . ToSingle ( row [ "VelocityY" ] ) ,
Convert . ToSingle ( row [ "VelocityZ" ] )
) ;
2008-09-06 07:52:41 +00:00
prim . AngularVelocity = new Vector3 (
2007-09-13 05:25:26 +00:00
Convert . ToSingle ( row [ "AngularVelocityX" ] ) ,
Convert . ToSingle ( row [ "AngularVelocityY" ] ) ,
Convert . ToSingle ( row [ "AngularVelocityZ" ] )
) ;
2008-09-06 07:52:41 +00:00
prim . Acceleration = new Vector3 (
2007-09-13 05:25:26 +00:00
Convert . ToSingle ( row [ "AccelerationX" ] ) ,
Convert . ToSingle ( row [ "AccelerationY" ] ) ,
Convert . ToSingle ( row [ "AccelerationZ" ] )
) ;
2007-08-09 20:59:37 +00:00
// quaternions
2008-09-06 07:52:41 +00:00
prim . RotationOffset = new Quaternion (
2007-09-13 05:25:26 +00:00
Convert . ToSingle ( row [ "RotationX" ] ) ,
Convert . ToSingle ( row [ "RotationY" ] ) ,
Convert . ToSingle ( row [ "RotationZ" ] ) ,
Convert . ToSingle ( row [ "RotationW" ] )
) ;
2007-08-10 17:22:54 +00:00
2008-09-24 20:43:27 +00:00
prim . SitTargetPositionLL = new Vector3 (
Convert . ToSingle ( row [ "SitTargetOffsetX" ] ) ,
Convert . ToSingle ( row [ "SitTargetOffsetY" ] ) ,
Convert . ToSingle ( row [ "SitTargetOffsetZ" ] ) ) ;
prim . SitTargetOrientationLL = new Quaternion (
Convert . ToSingle (
row [ "SitTargetOrientX" ] ) ,
Convert . ToSingle (
row [ "SitTargetOrientY" ] ) ,
Convert . ToSingle (
row [ "SitTargetOrientZ" ] ) ,
Convert . ToSingle (
row [ "SitTargetOrientW" ] ) ) ;
2008-09-12 20:37:07 +00:00
prim . ClickAction = Convert . ToByte ( row [ "ClickAction" ] ) ;
2008-09-18 17:47:29 +00:00
prim . PayPrice [ 0 ] = Convert . ToInt32 ( row [ "PayPrice" ] ) ;
prim . PayPrice [ 1 ] = Convert . ToInt32 ( row [ "PayButton1" ] ) ;
prim . PayPrice [ 2 ] = Convert . ToInt32 ( row [ "PayButton2" ] ) ;
prim . PayPrice [ 3 ] = Convert . ToInt32 ( row [ "PayButton3" ] ) ;
prim . PayPrice [ 4 ] = Convert . ToInt32 ( row [ "PayButton4" ] ) ;
prim . Sound = new UUID ( row [ "LoopedSound" ] . ToString ( ) ) ;
prim . SoundGain = Convert . ToSingle ( row [ "LoopedSoundGain" ] ) ;
2019-03-07 04:53:41 +00:00
if ( prim . Sound ! = UUID . Zero )
prim . SoundFlags = 1 ; // If it's persisted at all, it's looped
else
prim . SoundFlags = 0 ;
2008-09-18 17:47:29 +00:00
if ( ! row . IsNull ( "TextureAnimation" ) )
prim . TextureAnimation = Convert . FromBase64String ( row [ "TextureAnimation" ] . ToString ( ) ) ;
if ( ! row . IsNull ( "ParticleSystem" ) )
prim . ParticleSystem = Convert . FromBase64String ( row [ "ParticleSystem" ] . ToString ( ) ) ;
2009-11-02 19:28:35 +00:00
prim . AngularVelocity = new Vector3 (
2008-09-18 17:47:29 +00:00
Convert . ToSingle ( row [ "OmegaX" ] ) ,
Convert . ToSingle ( row [ "OmegaY" ] ) ,
Convert . ToSingle ( row [ "OmegaZ" ] )
) ;
prim . SetCameraEyeOffset ( new Vector3 (
Convert . ToSingle ( row [ "CameraEyeOffsetX" ] ) ,
Convert . ToSingle ( row [ "CameraEyeOffsetY" ] ) ,
Convert . ToSingle ( row [ "CameraEyeOffsetZ" ] )
) ) ;
prim . SetCameraAtOffset ( new Vector3 (
Convert . ToSingle ( row [ "CameraAtOffsetX" ] ) ,
Convert . ToSingle ( row [ "CameraAtOffsetY" ] ) ,
Convert . ToSingle ( row [ "CameraAtOffsetZ" ] )
) ) ;
if ( Convert . ToInt16 ( row [ "ForceMouselook" ] ) ! = 0 )
prim . SetForceMouselook ( true ) ;
prim . ScriptAccessPin = Convert . ToInt32 ( row [ "ScriptAccessPin" ] ) ;
if ( Convert . ToInt16 ( row [ "AllowedDrop" ] ) ! = 0 )
prim . AllowedDrop = true ;
if ( Convert . ToInt16 ( row [ "DieAtEdge" ] ) ! = 0 )
prim . DIE_AT_EDGE = true ;
prim . SalePrice = Convert . ToInt32 ( row [ "SalePrice" ] ) ;
prim . ObjectSaleType = Convert . ToByte ( row [ "SaleType" ] ) ;
2008-10-03 12:11:38 +00:00
prim . Material = Convert . ToByte ( row [ "Material" ] ) ;
2008-11-19 18:30:16 +00:00
prim . CollisionSound = new UUID ( row [ "CollisionSound" ] . ToString ( ) ) ;
prim . CollisionSoundVolume = Convert . ToSingle ( row [ "CollisionSoundVolume" ] ) ;
2008-12-22 09:29:59 +00:00
if ( Convert . ToInt16 ( row [ "VolumeDetect" ] ) ! = 0 )
prim . VolumeDetectActive = true ;
2010-09-12 17:43:49 +00:00
2010-07-01 21:52:31 +00:00
if ( ! ( row [ "MediaURL" ] is System . DBNull ) )
{
2012-02-12 23:58:28 +00:00
// m_log.DebugFormat("[SQLITE]: MediaUrl type [{0}]", row["MediaURL"].GetType());
2010-07-01 21:52:31 +00:00
prim . MediaUrl = ( string ) row [ "MediaURL" ] ;
}
2017-01-05 19:07:37 +00:00
2013-08-04 17:19:11 +00:00
prim . AttachedPos = new Vector3 (
Convert . ToSingle ( row [ "AttachedPosX" ] ) ,
Convert . ToSingle ( row [ "AttachedPosY" ] ) ,
Convert . ToSingle ( row [ "AttachedPosZ" ] )
) ;
2010-08-16 19:38:20 +00:00
if ( ! ( row [ "DynAttrs" ] is System . DBNull ) )
{
//m_log.DebugFormat("[SQLITE]: DynAttrs type [{0}]", row["DynAttrs"].GetType());
2010-08-16 21:21:46 +00:00
prim . DynAttrs = DAMap . FromXml ( ( string ) row [ "DynAttrs" ] ) ;
2017-01-05 19:07:37 +00:00
}
2010-08-16 19:38:20 +00:00
else
{
2019-01-21 06:14:41 +00:00
prim . DynAttrs = null ;
2010-08-16 19:38:20 +00:00
}
2008-12-22 09:29:59 +00:00
2013-02-07 06:23:57 +00:00
prim . PhysicsShapeType = Convert . ToByte ( row [ "PhysicsShapeType" ] ) ;
prim . Density = Convert . ToSingle ( row [ "Density" ] ) ;
prim . GravityModifier = Convert . ToSingle ( row [ "GravityModifier" ] ) ;
prim . Friction = Convert . ToSingle ( row [ "Friction" ] ) ;
prim . Restitution = Convert . ToSingle ( row [ "Restitution" ] ) ;
2017-01-05 19:07:37 +00:00
2013-06-11 13:56:20 +00:00
if ( ! ( row [ "KeyframeMotion" ] is DBNull ) )
{
Byte [ ] data = ( byte [ ] ) row [ "KeyframeMotion" ] ;
if ( data . Length > 0 )
prim . KeyframeMotion = KeyframeMotion . FromData ( null , data ) ;
else
prim . KeyframeMotion = null ;
}
else
{
prim . KeyframeMotion = null ;
}
2015-09-21 11:07:17 +00:00
prim . PassCollisions = Convert . ToBoolean ( row [ "PassCollisions" ] ) ;
prim . PassTouches = Convert . ToBoolean ( row [ "PassTouches" ] ) ;
2015-10-20 17:08:04 +00:00
prim . RotationAxisLocks = Convert . ToByte ( row [ "RotationAxisLocks" ] ) ;
2015-09-21 11:07:17 +00:00
SOPVehicle vehicle = null ;
if ( ! ( row [ "Vehicle" ] is DBNull ) & & row [ "Vehicle" ] . ToString ( ) ! = String . Empty )
{
vehicle = SOPVehicle . FromXml2 ( row [ "Vehicle" ] . ToString ( ) ) ;
if ( vehicle ! = null )
prim . VehicleParams = vehicle ;
}
2017-04-01 17:15:47 +00:00
PhysicsInertiaData pdata = null ;
if ( ! ( row [ "PhysInertia" ] is DBNull ) & & row [ "PhysInertia" ] . ToString ( ) ! = String . Empty )
pdata = PhysicsInertiaData . FromXml2 ( row [ "PhysInertia" ] . ToString ( ) ) ;
prim . PhysicsInertia = pdata ;
2007-08-09 20:31:10 +00:00
return prim ;
}
2008-05-16 01:22:11 +00:00
2008-01-05 22:48:36 +00:00
/// <summary>
/// Build a prim inventory item from the persisted data.
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
2008-05-01 16:03:53 +00:00
private static TaskInventoryItem buildItem ( DataRow row )
2008-01-05 22:48:36 +00:00
{
2008-01-06 01:56:29 +00:00
TaskInventoryItem taskItem = new TaskInventoryItem ( ) ;
2008-05-16 01:22:11 +00:00
2012-02-12 23:58:28 +00:00
taskItem . ItemID = new UUID ( ( String ) row [ "itemID" ] ) ;
taskItem . ParentPartID = new UUID ( ( String ) row [ "primID" ] ) ;
taskItem . AssetID = new UUID ( ( String ) row [ "assetID" ] ) ;
taskItem . ParentID = new UUID ( ( String ) row [ "parentFolderID" ] ) ;
2008-05-16 01:22:11 +00:00
2012-02-12 23:58:28 +00:00
taskItem . InvType = Convert . ToInt32 ( row [ "invType" ] ) ;
taskItem . Type = Convert . ToInt32 ( row [ "assetType" ] ) ;
2008-05-16 01:22:11 +00:00
2012-02-12 23:58:28 +00:00
taskItem . Name = ( String ) row [ "name" ] ;
taskItem . Description = ( String ) row [ "description" ] ;
taskItem . CreationDate = Convert . ToUInt32 ( row [ "creationDate" ] ) ;
2010-11-22 01:19:24 +00:00
taskItem . CreatorIdentification = ( String ) row [ "creatorID" ] ;
2012-02-12 23:58:28 +00:00
taskItem . OwnerID = new UUID ( ( String ) row [ "ownerID" ] ) ;
taskItem . LastOwnerID = new UUID ( ( String ) row [ "lastOwnerID" ] ) ;
taskItem . GroupID = new UUID ( ( String ) row [ "groupID" ] ) ;
2008-05-16 01:22:11 +00:00
2008-07-23 22:14:29 +00:00
taskItem . NextPermissions = Convert . ToUInt32 ( row [ "nextPermissions" ] ) ;
2012-02-12 23:58:28 +00:00
taskItem . CurrentPermissions = Convert . ToUInt32 ( row [ "currentPermissions" ] ) ;
taskItem . BasePermissions = Convert . ToUInt32 ( row [ "basePermissions" ] ) ;
taskItem . EveryonePermissions = Convert . ToUInt32 ( row [ "everyonePermissions" ] ) ;
taskItem . GroupPermissions = Convert . ToUInt32 ( row [ "groupPermissions" ] ) ;
taskItem . Flags = Convert . ToUInt32 ( row [ "flags" ] ) ;
2008-05-16 01:22:11 +00:00
2008-01-05 22:48:36 +00:00
return taskItem ;
}
2007-08-09 20:31:10 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
/// Build a Land Data from the persisted data.
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
2007-12-18 17:42:02 +00:00
private LandData buildLandData ( DataRow row )
{
LandData newData = new LandData ( ) ;
2012-02-12 23:58:28 +00:00
newData . GlobalID = new UUID ( ( String ) row [ "UUID" ] ) ;
2008-07-23 15:50:32 +00:00
newData . LocalID = Convert . ToInt32 ( row [ "LocalLandID" ] ) ;
2007-12-18 17:42:02 +00:00
// Bitmap is a byte[512]
2012-02-12 23:58:28 +00:00
newData . Bitmap = ( Byte [ ] ) row [ "Bitmap" ] ;
2008-07-23 15:50:32 +00:00
2012-02-12 23:58:28 +00:00
newData . Name = ( String ) row [ "Name" ] ;
newData . Description = ( String ) row [ "Desc" ] ;
newData . OwnerID = ( UUID ) ( String ) row [ "OwnerUUID" ] ;
2016-09-17 18:46:40 +00:00
newData . IsGroupOwned = Convert . ToBoolean ( row [ "IsGroupOwned" ] ) ;
2008-07-23 15:50:32 +00:00
newData . Area = Convert . ToInt32 ( row [ "Area" ] ) ;
newData . AuctionID = Convert . ToUInt32 ( row [ "AuctionID" ] ) ; //Unemplemented
2012-02-12 23:58:28 +00:00
newData . Category = ( ParcelCategory ) Convert . ToInt32 ( row [ "Category" ] ) ;
//Enum OpenMetaverse.Parcel.ParcelCategory
2008-07-23 15:50:32 +00:00
newData . ClaimDate = Convert . ToInt32 ( row [ "ClaimDate" ] ) ;
newData . ClaimPrice = Convert . ToInt32 ( row [ "ClaimPrice" ] ) ;
2012-02-12 23:58:28 +00:00
newData . GroupID = new UUID ( ( String ) row [ "GroupUUID" ] ) ;
2008-07-23 15:50:32 +00:00
newData . SalePrice = Convert . ToInt32 ( row [ "SalePrice" ] ) ;
2012-02-12 23:58:28 +00:00
newData . Status = ( ParcelStatus ) Convert . ToInt32 ( row [ "LandStatus" ] ) ;
//Enum. OpenMetaverse.Parcel.ParcelStatus
2008-07-23 15:50:32 +00:00
newData . Flags = Convert . ToUInt32 ( row [ "LandFlags" ] ) ;
2012-02-12 23:58:28 +00:00
newData . LandingType = ( Byte ) row [ "LandingType" ] ;
newData . MediaAutoScale = ( Byte ) row [ "MediaAutoScale" ] ;
newData . MediaID = new UUID ( ( String ) row [ "MediaTextureUUID" ] ) ;
newData . MediaURL = ( String ) row [ "MediaURL" ] ;
newData . MusicURL = ( String ) row [ "MusicURL" ] ;
2008-07-23 15:50:32 +00:00
newData . PassHours = Convert . ToSingle ( row [ "PassHours" ] ) ;
newData . PassPrice = Convert . ToInt32 ( row [ "PassPrice" ] ) ;
2012-02-12 23:58:28 +00:00
newData . SnapshotID = ( UUID ) ( String ) row [ "SnapshotUUID" ] ;
2012-10-21 12:59:22 +00:00
newData . Dwell = Convert . ToInt32 ( row [ "Dwell" ] ) ;
newData . MediaType = ( String ) row [ "MediaType" ] ;
newData . MediaDescription = ( String ) row [ "MediaDescription" ] ;
newData . MediaWidth = Convert . ToInt32 ( ( ( ( string ) row [ "MediaSize" ] ) . Split ( ',' ) ) [ 0 ] ) ;
newData . MediaHeight = Convert . ToInt32 ( ( ( ( string ) row [ "MediaSize" ] ) . Split ( ',' ) ) [ 1 ] ) ;
newData . MediaLoop = Convert . ToBoolean ( row [ "MediaLoop" ] ) ;
newData . ObscureMedia = Convert . ToBoolean ( row [ "ObscureMedia" ] ) ;
newData . ObscureMusic = Convert . ToBoolean ( row [ "ObscureMusic" ] ) ;
2015-09-21 11:07:17 +00:00
newData . SeeAVs = Convert . ToBoolean ( row [ "SeeAVs" ] ) ;
newData . AnyAVSounds = Convert . ToBoolean ( row [ "AnyAVSounds" ] ) ;
newData . GroupAVSounds = Convert . ToBoolean ( row [ "GroupAVSounds" ] ) ;
2008-06-20 17:07:01 +00:00
try
{
2008-07-23 15:50:32 +00:00
newData . UserLocation =
2008-09-06 07:52:41 +00:00
new Vector3 ( Convert . ToSingle ( row [ "UserLocationX" ] ) , Convert . ToSingle ( row [ "UserLocationY" ] ) ,
2008-06-20 17:07:01 +00:00
Convert . ToSingle ( row [ "UserLocationZ" ] ) ) ;
2008-07-23 15:50:32 +00:00
newData . UserLookAt =
2008-09-06 07:52:41 +00:00
new Vector3 ( Convert . ToSingle ( row [ "UserLookAtX" ] ) , Convert . ToSingle ( row [ "UserLookAtY" ] ) ,
2008-06-20 17:07:01 +00:00
Convert . ToSingle ( row [ "UserLookAtZ" ] ) ) ;
2008-08-18 00:39:10 +00:00
2008-06-20 17:07:01 +00:00
}
catch ( InvalidCastException )
{
2010-06-04 16:14:12 +00:00
m_log . ErrorFormat ( "[SQLITE REGION DB]: unable to get parcel telehub settings for {1}" , newData . Name ) ;
2008-09-06 07:52:41 +00:00
newData . UserLocation = Vector3 . Zero ;
newData . UserLookAt = Vector3 . Zero ;
2008-06-20 17:07:01 +00:00
}
2012-02-02 23:40:56 +00:00
newData . ParcelAccessList = new List < LandAccessEntry > ( ) ;
2008-09-06 07:52:41 +00:00
UUID authBuyerID = UUID . Zero ;
2007-12-18 17:42:02 +00:00
2008-09-24 20:43:27 +00:00
UUID . TryParse ( ( string ) row [ "AuthbuyerID" ] , out authBuyerID ) ;
2008-05-16 01:22:11 +00:00
2008-10-18 05:51:36 +00:00
newData . OtherCleanTime = Convert . ToInt32 ( row [ "OtherCleanTime" ] ) ;
2007-12-18 17:42:02 +00:00
return newData ;
}
2008-09-13 20:37:36 +00:00
private RegionSettings buildRegionSettings ( DataRow row )
{
RegionSettings newSettings = new RegionSettings ( ) ;
2012-02-12 23:58:28 +00:00
newSettings . RegionUUID = new UUID ( ( string ) row [ "regionUUID" ] ) ;
2008-09-13 20:37:36 +00:00
newSettings . BlockTerraform = Convert . ToBoolean ( row [ "block_terraform" ] ) ;
newSettings . AllowDamage = Convert . ToBoolean ( row [ "allow_damage" ] ) ;
newSettings . BlockFly = Convert . ToBoolean ( row [ "block_fly" ] ) ;
newSettings . RestrictPushing = Convert . ToBoolean ( row [ "restrict_pushing" ] ) ;
newSettings . AllowLandResell = Convert . ToBoolean ( row [ "allow_land_resell" ] ) ;
newSettings . AllowLandJoinDivide = Convert . ToBoolean ( row [ "allow_land_join_divide" ] ) ;
newSettings . BlockShowInSearch = Convert . ToBoolean ( row [ "block_show_in_search" ] ) ;
newSettings . AgentLimit = Convert . ToInt32 ( row [ "agent_limit" ] ) ;
newSettings . ObjectBonus = Convert . ToDouble ( row [ "object_bonus" ] ) ;
newSettings . Maturity = Convert . ToInt32 ( row [ "maturity" ] ) ;
newSettings . DisableScripts = Convert . ToBoolean ( row [ "disable_scripts" ] ) ;
newSettings . DisableCollisions = Convert . ToBoolean ( row [ "disable_collisions" ] ) ;
newSettings . DisablePhysics = Convert . ToBoolean ( row [ "disable_physics" ] ) ;
2012-02-12 23:58:28 +00:00
newSettings . TerrainTexture1 = new UUID ( ( String ) row [ "terrain_texture_1" ] ) ;
newSettings . TerrainTexture2 = new UUID ( ( String ) row [ "terrain_texture_2" ] ) ;
newSettings . TerrainTexture3 = new UUID ( ( String ) row [ "terrain_texture_3" ] ) ;
newSettings . TerrainTexture4 = new UUID ( ( String ) row [ "terrain_texture_4" ] ) ;
2008-09-13 20:37:36 +00:00
newSettings . Elevation1NW = Convert . ToDouble ( row [ "elevation_1_nw" ] ) ;
newSettings . Elevation2NW = Convert . ToDouble ( row [ "elevation_2_nw" ] ) ;
newSettings . Elevation1NE = Convert . ToDouble ( row [ "elevation_1_ne" ] ) ;
newSettings . Elevation2NE = Convert . ToDouble ( row [ "elevation_2_ne" ] ) ;
newSettings . Elevation1SE = Convert . ToDouble ( row [ "elevation_1_se" ] ) ;
newSettings . Elevation2SE = Convert . ToDouble ( row [ "elevation_2_se" ] ) ;
newSettings . Elevation1SW = Convert . ToDouble ( row [ "elevation_1_sw" ] ) ;
newSettings . Elevation2SW = Convert . ToDouble ( row [ "elevation_2_sw" ] ) ;
newSettings . WaterHeight = Convert . ToDouble ( row [ "water_height" ] ) ;
newSettings . TerrainRaiseLimit = Convert . ToDouble ( row [ "terrain_raise_limit" ] ) ;
newSettings . TerrainLowerLimit = Convert . ToDouble ( row [ "terrain_lower_limit" ] ) ;
newSettings . UseEstateSun = Convert . ToBoolean ( row [ "use_estate_sun" ] ) ;
newSettings . Sandbox = Convert . ToBoolean ( row [ "sandbox" ] ) ;
2012-02-12 23:58:28 +00:00
newSettings . SunVector = new Vector3 (
2008-11-18 12:48:36 +00:00
Convert . ToSingle ( row [ "sunvectorx" ] ) ,
Convert . ToSingle ( row [ "sunvectory" ] ) ,
Convert . ToSingle ( row [ "sunvectorz" ] )
) ;
2008-09-13 20:37:36 +00:00
newSettings . FixedSun = Convert . ToBoolean ( row [ "fixed_sun" ] ) ;
newSettings . SunPosition = Convert . ToDouble ( row [ "sun_position" ] ) ;
2012-02-12 23:58:28 +00:00
newSettings . Covenant = new UUID ( ( String ) row [ "covenant" ] ) ;
2012-02-03 21:02:36 +00:00
newSettings . CovenantChangedDateTime = Convert . ToInt32 ( row [ "covenant_datetime" ] ) ;
2010-05-09 20:39:56 +00:00
newSettings . TerrainImageID = new UUID ( ( String ) row [ "map_tile_ID" ] ) ;
2012-02-17 22:31:20 +00:00
newSettings . TelehubObject = new UUID ( ( String ) row [ "TelehubObject" ] ) ;
2012-02-18 01:04:38 +00:00
newSettings . ParcelImageID = new UUID ( ( String ) row [ "parcel_tile_ID" ] ) ;
2015-09-21 11:07:17 +00:00
newSettings . GodBlockSearch = Convert . ToBoolean ( row [ "block_search" ] ) ;
newSettings . Casino = Convert . ToBoolean ( row [ "casino" ] ) ;
2008-09-13 20:37:36 +00:00
return newSettings ;
}
2012-02-12 23:58:28 +00:00
/// <summary>
/// Build a windlight entry from the persisted data.
/// </summary>
/// <param name="row"></param>
/// <returns>RegionLightShareData</returns>
private RegionLightShareData buildRegionWindlight ( DataRow row )
{
RegionLightShareData windlight = new RegionLightShareData ( ) ;
windlight . regionID = new UUID ( ( string ) row [ "region_id" ] ) ;
windlight . waterColor . X = Convert . ToSingle ( row [ "water_color_r" ] ) ;
windlight . waterColor . Y = Convert . ToSingle ( row [ "water_color_g" ] ) ;
windlight . waterColor . Z = Convert . ToSingle ( row [ "water_color_b" ] ) ;
//windlight.waterColor.W = Convert.ToSingle(row["water_color_i"]); //not implemented
windlight . waterFogDensityExponent = Convert . ToSingle ( row [ "water_fog_density_exponent" ] ) ;
windlight . underwaterFogModifier = Convert . ToSingle ( row [ "underwater_fog_modifier" ] ) ;
windlight . reflectionWaveletScale . X = Convert . ToSingle ( row [ "reflection_wavelet_scale_1" ] ) ;
windlight . reflectionWaveletScale . Y = Convert . ToSingle ( row [ "reflection_wavelet_scale_2" ] ) ;
windlight . reflectionWaveletScale . Z = Convert . ToSingle ( row [ "reflection_wavelet_scale_3" ] ) ;
windlight . fresnelScale = Convert . ToSingle ( row [ "fresnel_scale" ] ) ;
windlight . fresnelOffset = Convert . ToSingle ( row [ "fresnel_offset" ] ) ;
windlight . refractScaleAbove = Convert . ToSingle ( row [ "refract_scale_above" ] ) ;
windlight . refractScaleBelow = Convert . ToSingle ( row [ "refract_scale_below" ] ) ;
windlight . blurMultiplier = Convert . ToSingle ( row [ "blur_multiplier" ] ) ;
windlight . bigWaveDirection . X = Convert . ToSingle ( row [ "big_wave_direction_x" ] ) ;
windlight . bigWaveDirection . Y = Convert . ToSingle ( row [ "big_wave_direction_y" ] ) ;
windlight . littleWaveDirection . X = Convert . ToSingle ( row [ "little_wave_direction_x" ] ) ;
windlight . littleWaveDirection . Y = Convert . ToSingle ( row [ "little_wave_direction_y" ] ) ;
windlight . normalMapTexture = new UUID ( ( string ) row [ "normal_map_texture" ] ) ;
windlight . horizon . X = Convert . ToSingle ( row [ "horizon_r" ] ) ;
windlight . horizon . Y = Convert . ToSingle ( row [ "horizon_g" ] ) ;
windlight . horizon . Z = Convert . ToSingle ( row [ "horizon_b" ] ) ;
windlight . horizon . W = Convert . ToSingle ( row [ "horizon_i" ] ) ;
windlight . hazeHorizon = Convert . ToSingle ( row [ "haze_horizon" ] ) ;
windlight . blueDensity . X = Convert . ToSingle ( row [ "blue_density_r" ] ) ;
windlight . blueDensity . Y = Convert . ToSingle ( row [ "blue_density_g" ] ) ;
windlight . blueDensity . Z = Convert . ToSingle ( row [ "blue_density_b" ] ) ;
windlight . blueDensity . W = Convert . ToSingle ( row [ "blue_density_i" ] ) ;
windlight . hazeDensity = Convert . ToSingle ( row [ "haze_density" ] ) ;
windlight . densityMultiplier = Convert . ToSingle ( row [ "density_multiplier" ] ) ;
windlight . distanceMultiplier = Convert . ToSingle ( row [ "distance_multiplier" ] ) ;
windlight . maxAltitude = Convert . ToUInt16 ( row [ "max_altitude" ] ) ;
windlight . sunMoonColor . X = Convert . ToSingle ( row [ "sun_moon_color_r" ] ) ;
windlight . sunMoonColor . Y = Convert . ToSingle ( row [ "sun_moon_color_g" ] ) ;
windlight . sunMoonColor . Z = Convert . ToSingle ( row [ "sun_moon_color_b" ] ) ;
windlight . sunMoonColor . W = Convert . ToSingle ( row [ "sun_moon_color_i" ] ) ;
windlight . sunMoonPosition = Convert . ToSingle ( row [ "sun_moon_position" ] ) ;
windlight . ambient . X = Convert . ToSingle ( row [ "ambient_r" ] ) ;
windlight . ambient . Y = Convert . ToSingle ( row [ "ambient_g" ] ) ;
windlight . ambient . Z = Convert . ToSingle ( row [ "ambient_b" ] ) ;
windlight . ambient . W = Convert . ToSingle ( row [ "ambient_i" ] ) ;
windlight . eastAngle = Convert . ToSingle ( row [ "east_angle" ] ) ;
windlight . sunGlowFocus = Convert . ToSingle ( row [ "sun_glow_focus" ] ) ;
windlight . sunGlowSize = Convert . ToSingle ( row [ "sun_glow_size" ] ) ;
windlight . sceneGamma = Convert . ToSingle ( row [ "scene_gamma" ] ) ;
windlight . starBrightness = Convert . ToSingle ( row [ "star_brightness" ] ) ;
windlight . cloudColor . X = Convert . ToSingle ( row [ "cloud_color_r" ] ) ;
windlight . cloudColor . Y = Convert . ToSingle ( row [ "cloud_color_g" ] ) ;
windlight . cloudColor . Z = Convert . ToSingle ( row [ "cloud_color_b" ] ) ;
windlight . cloudColor . W = Convert . ToSingle ( row [ "cloud_color_i" ] ) ;
windlight . cloudXYDensity . X = Convert . ToSingle ( row [ "cloud_x" ] ) ;
windlight . cloudXYDensity . Y = Convert . ToSingle ( row [ "cloud_y" ] ) ;
windlight . cloudXYDensity . Z = Convert . ToSingle ( row [ "cloud_density" ] ) ;
windlight . cloudCoverage = Convert . ToSingle ( row [ "cloud_coverage" ] ) ;
windlight . cloudScale = Convert . ToSingle ( row [ "cloud_scale" ] ) ;
windlight . cloudDetailXYDensity . X = Convert . ToSingle ( row [ "cloud_detail_x" ] ) ;
windlight . cloudDetailXYDensity . Y = Convert . ToSingle ( row [ "cloud_detail_y" ] ) ;
windlight . cloudDetailXYDensity . Z = Convert . ToSingle ( row [ "cloud_detail_density" ] ) ;
windlight . cloudScrollX = Convert . ToSingle ( row [ "cloud_scroll_x" ] ) ;
windlight . cloudScrollXLock = Convert . ToBoolean ( row [ "cloud_scroll_x_lock" ] ) ;
windlight . cloudScrollY = Convert . ToSingle ( row [ "cloud_scroll_y" ] ) ;
windlight . cloudScrollYLock = Convert . ToBoolean ( row [ "cloud_scroll_y_lock" ] ) ;
windlight . drawClassicClouds = Convert . ToBoolean ( row [ "draw_classic_clouds" ] ) ;
return windlight ;
}
2008-06-26 20:14:33 +00:00
/// <summary>
/// Build a land access entry from the persisted data.
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
2012-02-02 23:40:56 +00:00
private static LandAccessEntry buildLandAccessData ( DataRow row )
2007-12-18 17:42:02 +00:00
{
2012-02-02 23:40:56 +00:00
LandAccessEntry entry = new LandAccessEntry ( ) ;
2012-02-12 23:58:28 +00:00
entry . AgentID = new UUID ( ( string ) row [ "AccessUUID" ] ) ;
entry . Flags = ( AccessList ) row [ "Flags" ] ;
2012-02-02 23:40:56 +00:00
entry . Expires = 0 ;
2007-12-18 17:42:02 +00:00
return entry ;
}
2015-09-21 11:07:17 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="row"></param>
/// <param name="prim"></param>
/// <param name="sceneGroupID"></param>
/// <param name="regionUUID"></param>
2008-09-06 07:52:41 +00:00
private static void fillPrimRow ( DataRow row , SceneObjectPart prim , UUID sceneGroupID , UUID regionUUID )
2007-08-07 15:45:16 +00:00
{
2009-05-07 13:20:29 +00:00
row [ "UUID" ] = prim . UUID . ToString ( ) ;
row [ "RegionUUID" ] = regionUUID . ToString ( ) ;
2007-08-07 15:45:16 +00:00
row [ "CreationDate" ] = prim . CreationDate ;
2007-08-16 17:08:03 +00:00
row [ "Name" ] = prim . Name ;
2009-05-07 13:20:29 +00:00
row [ "SceneGroupID" ] = sceneGroupID . ToString ( ) ;
2008-09-09 20:23:10 +00:00
// the UUID of the root part for this SceneObjectGroup
2007-08-09 18:37:55 +00:00
// various text fields
row [ "Text" ] = prim . Text ;
row [ "Description" ] = prim . Description ;
row [ "SitName" ] = prim . SitName ;
row [ "TouchName" ] = prim . TouchName ;
// permissions
2014-04-22 17:04:12 +00:00
row [ "ObjectFlags" ] = ( uint ) prim . Flags ;
2010-11-21 21:27:03 +00:00
row [ "CreatorID" ] = prim . CreatorIdentification . ToString ( ) ;
2009-05-07 13:20:29 +00:00
row [ "OwnerID" ] = prim . OwnerID . ToString ( ) ;
row [ "GroupID" ] = prim . GroupID . ToString ( ) ;
row [ "LastOwnerID" ] = prim . LastOwnerID . ToString ( ) ;
2016-12-04 06:10:13 +00:00
row [ "RezzerID" ] = prim . RezzerID . ToString ( ) ;
2007-08-09 18:37:55 +00:00
row [ "OwnerMask" ] = prim . OwnerMask ;
row [ "NextOwnerMask" ] = prim . NextOwnerMask ;
row [ "GroupMask" ] = prim . GroupMask ;
row [ "EveryoneMask" ] = prim . EveryoneMask ;
row [ "BaseMask" ] = prim . BaseMask ;
// vectors
2007-08-09 18:06:26 +00:00
row [ "PositionX" ] = prim . OffsetPosition . X ;
row [ "PositionY" ] = prim . OffsetPosition . Y ;
row [ "PositionZ" ] = prim . OffsetPosition . Z ;
2007-08-09 20:31:10 +00:00
row [ "GroupPositionX" ] = prim . GroupPosition . X ;
row [ "GroupPositionY" ] = prim . GroupPosition . Y ;
row [ "GroupPositionZ" ] = prim . GroupPosition . Z ;
2007-08-09 18:37:55 +00:00
row [ "VelocityX" ] = prim . Velocity . X ;
row [ "VelocityY" ] = prim . Velocity . Y ;
row [ "VelocityZ" ] = prim . Velocity . Z ;
row [ "AngularVelocityX" ] = prim . AngularVelocity . X ;
row [ "AngularVelocityY" ] = prim . AngularVelocity . Y ;
row [ "AngularVelocityZ" ] = prim . AngularVelocity . Z ;
row [ "AccelerationX" ] = prim . Acceleration . X ;
row [ "AccelerationY" ] = prim . Acceleration . Y ;
row [ "AccelerationZ" ] = prim . Acceleration . Z ;
// quaternions
row [ "RotationX" ] = prim . RotationOffset . X ;
row [ "RotationY" ] = prim . RotationOffset . Y ;
row [ "RotationZ" ] = prim . RotationOffset . Z ;
row [ "RotationW" ] = prim . RotationOffset . W ;
2007-12-27 05:37:48 +00:00
// Sit target
2008-09-06 07:52:41 +00:00
Vector3 sitTargetPos = prim . SitTargetPositionLL ;
2007-12-27 05:37:48 +00:00
row [ "SitTargetOffsetX" ] = sitTargetPos . X ;
row [ "SitTargetOffsetY" ] = sitTargetPos . Y ;
row [ "SitTargetOffsetZ" ] = sitTargetPos . Z ;
2008-09-06 07:52:41 +00:00
Quaternion sitTargetOrient = prim . SitTargetOrientationLL ;
2007-12-27 05:37:48 +00:00
row [ "SitTargetOrientW" ] = sitTargetOrient . W ;
row [ "SitTargetOrientX" ] = sitTargetOrient . X ;
row [ "SitTargetOrientY" ] = sitTargetOrient . Y ;
row [ "SitTargetOrientZ" ] = sitTargetOrient . Z ;
2008-09-09 23:42:44 +00:00
row [ "ColorR" ] = Convert . ToInt32 ( prim . Color . R ) ;
row [ "ColorG" ] = Convert . ToInt32 ( prim . Color . G ) ;
row [ "ColorB" ] = Convert . ToInt32 ( prim . Color . B ) ;
row [ "ColorA" ] = Convert . ToInt32 ( prim . Color . A ) ;
2008-09-18 17:47:29 +00:00
row [ "PayPrice" ] = prim . PayPrice [ 0 ] ;
row [ "PayButton1" ] = prim . PayPrice [ 1 ] ;
row [ "PayButton2" ] = prim . PayPrice [ 2 ] ;
row [ "PayButton3" ] = prim . PayPrice [ 3 ] ;
row [ "PayButton4" ] = prim . PayPrice [ 4 ] ;
row [ "TextureAnimation" ] = Convert . ToBase64String ( prim . TextureAnimation ) ;
row [ "ParticleSystem" ] = Convert . ToBase64String ( prim . ParticleSystem ) ;
2009-11-02 19:28:35 +00:00
row [ "OmegaX" ] = prim . AngularVelocity . X ;
row [ "OmegaY" ] = prim . AngularVelocity . Y ;
row [ "OmegaZ" ] = prim . AngularVelocity . Z ;
2008-09-18 17:47:29 +00:00
row [ "CameraEyeOffsetX" ] = prim . GetCameraEyeOffset ( ) . X ;
row [ "CameraEyeOffsetY" ] = prim . GetCameraEyeOffset ( ) . Y ;
row [ "CameraEyeOffsetZ" ] = prim . GetCameraEyeOffset ( ) . Z ;
row [ "CameraAtOffsetX" ] = prim . GetCameraAtOffset ( ) . X ;
row [ "CameraAtOffsetY" ] = prim . GetCameraAtOffset ( ) . Y ;
row [ "CameraAtOffsetZ" ] = prim . GetCameraAtOffset ( ) . Z ;
if ( ( prim . SoundFlags & 1 ) ! = 0 ) // Looped
{
row [ "LoopedSound" ] = prim . Sound . ToString ( ) ;
row [ "LoopedSoundGain" ] = prim . SoundGain ;
}
else
{
row [ "LoopedSound" ] = UUID . Zero . ToString ( ) ;
row [ "LoopedSoundGain" ] = 0.0f ;
}
if ( prim . GetForceMouselook ( ) )
row [ "ForceMouselook" ] = 1 ;
else
row [ "ForceMouselook" ] = 0 ;
row [ "ScriptAccessPin" ] = prim . ScriptAccessPin ;
if ( prim . AllowedDrop )
row [ "AllowedDrop" ] = 1 ;
else
row [ "AllowedDrop" ] = 0 ;
if ( prim . DIE_AT_EDGE )
row [ "DieAtEdge" ] = 1 ;
else
row [ "DieAtEdge" ] = 0 ;
row [ "SalePrice" ] = prim . SalePrice ;
row [ "SaleType" ] = Convert . ToInt16 ( prim . ObjectSaleType ) ;
2008-09-12 20:37:07 +00:00
// click action
row [ "ClickAction" ] = prim . ClickAction ;
2008-10-03 12:11:38 +00:00
2008-10-03 12:36:54 +00:00
row [ "Material" ] = prim . Material ;
2008-11-19 18:30:16 +00:00
row [ "CollisionSound" ] = prim . CollisionSound . ToString ( ) ;
row [ "CollisionSoundVolume" ] = prim . CollisionSoundVolume ;
2008-12-22 09:29:59 +00:00
if ( prim . VolumeDetectActive )
row [ "VolumeDetect" ] = 1 ;
else
row [ "VolumeDetect" ] = 0 ;
2010-09-12 17:43:49 +00:00
2010-07-01 21:52:31 +00:00
row [ "MediaURL" ] = prim . MediaUrl ;
2013-01-22 06:55:15 +00:00
2013-08-04 17:19:11 +00:00
row [ "AttachedPosX" ] = prim . AttachedPos . X ;
row [ "AttachedPosY" ] = prim . AttachedPos . Y ;
row [ "AttachedPosZ" ] = prim . AttachedPos . Z ;
2019-01-21 06:14:41 +00:00
if ( prim . DynAttrs ! = null & & prim . DynAttrs . CountNamespaces > 0 )
2013-01-22 06:55:15 +00:00
row [ "DynAttrs" ] = prim . DynAttrs . ToXml ( ) ;
else
row [ "DynAttrs" ] = null ;
2013-02-07 06:23:57 +00:00
row [ "PhysicsShapeType" ] = prim . PhysicsShapeType ;
row [ "Density" ] = ( double ) prim . Density ;
row [ "GravityModifier" ] = ( double ) prim . GravityModifier ;
row [ "Friction" ] = ( double ) prim . Friction ;
row [ "Restitution" ] = ( double ) prim . Restitution ;
2013-06-11 13:56:20 +00:00
if ( prim . KeyframeMotion ! = null )
row [ "KeyframeMotion" ] = prim . KeyframeMotion . Serialize ( ) ;
else
row [ "KeyframeMotion" ] = new Byte [ 0 ] ;
2015-09-21 11:07:17 +00:00
row [ "PassTouches" ] = prim . PassTouches ;
row [ "PassCollisions" ] = prim . PassCollisions ;
2015-10-20 17:08:04 +00:00
row [ "RotationAxisLocks" ] = prim . RotationAxisLocks ;
2015-09-21 11:07:17 +00:00
if ( prim . VehicleParams ! = null )
row [ "Vehicle" ] = prim . VehicleParams . ToXml2 ( ) ;
else
row [ "Vehicle" ] = String . Empty ;
2017-04-01 17:15:47 +00:00
if ( prim . PhysicsInertia ! = null )
row [ "PhysInertia" ] = prim . PhysicsInertia . ToXml2 ( ) ;
else
row [ "PhysInertia" ] = String . Empty ;
2007-08-09 18:37:55 +00:00
}
2008-05-16 01:22:11 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="row"></param>
/// <param name="taskItem"></param>
2008-05-01 16:03:53 +00:00
private static void fillItemRow ( DataRow row , TaskInventoryItem taskItem )
2008-01-05 19:46:00 +00:00
{
2009-06-19 00:01:50 +00:00
row [ "itemID" ] = taskItem . ItemID . ToString ( ) ;
row [ "primID" ] = taskItem . ParentPartID . ToString ( ) ;
row [ "assetID" ] = taskItem . AssetID . ToString ( ) ;
row [ "parentFolderID" ] = taskItem . ParentID . ToString ( ) ;
2008-05-16 01:22:11 +00:00
2008-01-16 18:35:34 +00:00
row [ "invType" ] = taskItem . InvType ;
row [ "assetType" ] = taskItem . Type ;
2008-05-16 01:22:11 +00:00
2008-01-16 18:35:34 +00:00
row [ "name" ] = taskItem . Name ;
row [ "description" ] = taskItem . Description ;
row [ "creationDate" ] = taskItem . CreationDate ;
2010-11-22 01:19:24 +00:00
row [ "creatorID" ] = taskItem . CreatorIdentification . ToString ( ) ;
2009-06-19 00:01:50 +00:00
row [ "ownerID" ] = taskItem . OwnerID . ToString ( ) ;
row [ "lastOwnerID" ] = taskItem . LastOwnerID . ToString ( ) ;
row [ "groupID" ] = taskItem . GroupID . ToString ( ) ;
2008-07-23 22:14:29 +00:00
row [ "nextPermissions" ] = taskItem . NextPermissions ;
row [ "currentPermissions" ] = taskItem . CurrentPermissions ;
row [ "basePermissions" ] = taskItem . BasePermissions ;
row [ "everyonePermissions" ] = taskItem . EveryonePermissions ;
row [ "groupPermissions" ] = taskItem . GroupPermissions ;
2008-06-26 02:51:59 +00:00
row [ "flags" ] = taskItem . Flags ;
2008-01-05 19:46:00 +00:00
}
2007-08-09 18:37:55 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="row"></param>
/// <param name="land"></param>
/// <param name="regionUUID"></param>
2008-09-06 07:52:41 +00:00
private static void fillLandRow ( DataRow row , LandData land , UUID regionUUID )
2007-12-18 17:42:02 +00:00
{
2009-05-07 13:20:29 +00:00
row [ "UUID" ] = land . GlobalID . ToString ( ) ;
row [ "RegionUUID" ] = regionUUID . ToString ( ) ;
2008-07-23 15:50:32 +00:00
row [ "LocalLandID" ] = land . LocalID ;
2007-12-18 17:42:02 +00:00
// Bitmap is a byte[512]
2008-07-23 15:50:32 +00:00
row [ "Bitmap" ] = land . Bitmap ;
row [ "Name" ] = land . Name ;
row [ "Desc" ] = land . Description ;
2009-05-07 13:20:29 +00:00
row [ "OwnerUUID" ] = land . OwnerID . ToString ( ) ;
2016-09-17 18:46:40 +00:00
row [ "IsGroupOwned" ] = land . IsGroupOwned . ToString ( ) ;
2008-07-23 15:50:32 +00:00
row [ "Area" ] = land . Area ;
row [ "AuctionID" ] = land . AuctionID ; //Unemplemented
2008-09-06 07:52:41 +00:00
row [ "Category" ] = land . Category ; //Enum OpenMetaverse.Parcel.ParcelCategory
2008-07-23 15:50:32 +00:00
row [ "ClaimDate" ] = land . ClaimDate ;
row [ "ClaimPrice" ] = land . ClaimPrice ;
2009-05-07 13:20:29 +00:00
row [ "GroupUUID" ] = land . GroupID . ToString ( ) ;
2008-07-23 15:50:32 +00:00
row [ "SalePrice" ] = land . SalePrice ;
2008-09-06 07:52:41 +00:00
row [ "LandStatus" ] = land . Status ; //Enum. OpenMetaverse.Parcel.ParcelStatus
2008-07-23 15:50:32 +00:00
row [ "LandFlags" ] = land . Flags ;
row [ "LandingType" ] = land . LandingType ;
row [ "MediaAutoScale" ] = land . MediaAutoScale ;
2009-05-07 13:20:29 +00:00
row [ "MediaTextureUUID" ] = land . MediaID . ToString ( ) ;
2008-07-23 15:50:32 +00:00
row [ "MediaURL" ] = land . MediaURL ;
row [ "MusicURL" ] = land . MusicURL ;
row [ "PassHours" ] = land . PassHours ;
row [ "PassPrice" ] = land . PassPrice ;
2009-05-07 13:20:29 +00:00
row [ "SnapshotUUID" ] = land . SnapshotID . ToString ( ) ;
2008-07-23 15:50:32 +00:00
row [ "UserLocationX" ] = land . UserLocation . X ;
row [ "UserLocationY" ] = land . UserLocation . Y ;
row [ "UserLocationZ" ] = land . UserLocation . Z ;
row [ "UserLookAtX" ] = land . UserLookAt . X ;
row [ "UserLookAtY" ] = land . UserLookAt . Y ;
row [ "UserLookAtZ" ] = land . UserLookAt . Z ;
2009-05-07 13:20:29 +00:00
row [ "AuthbuyerID" ] = land . AuthBuyerID . ToString ( ) ;
2008-10-18 05:51:36 +00:00
row [ "OtherCleanTime" ] = land . OtherCleanTime ;
2012-10-21 12:59:22 +00:00
row [ "Dwell" ] = land . Dwell ;
2010-09-12 17:43:49 +00:00
row [ "MediaType" ] = land . MediaType ;
row [ "MediaDescription" ] = land . MediaDescription ;
2012-10-21 12:59:22 +00:00
row [ "MediaSize" ] = String . Format ( "{0},{1}" , land . MediaWidth , land . MediaHeight ) ;
row [ "MediaLoop" ] = land . MediaLoop ;
row [ "ObscureMusic" ] = land . ObscureMusic ;
row [ "ObscureMedia" ] = land . ObscureMedia ;
2015-09-21 11:07:17 +00:00
row [ "SeeAVs" ] = land . SeeAVs ;
row [ "AnyAVSounds" ] = land . AnyAVSounds ;
row [ "GroupAVSounds" ] = land . GroupAVSounds ;
2007-12-18 17:42:02 +00:00
}
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="row"></param>
/// <param name="entry"></param>
/// <param name="parcelID"></param>
2012-02-02 23:40:56 +00:00
private static void fillLandAccessRow ( DataRow row , LandAccessEntry entry , UUID parcelID )
2007-12-18 17:42:02 +00:00
{
2009-05-07 13:20:29 +00:00
row [ "LandUUID" ] = parcelID . ToString ( ) ;
row [ "AccessUUID" ] = entry . AgentID . ToString ( ) ;
2007-12-18 17:42:02 +00:00
row [ "Flags" ] = entry . Flags ;
}
2008-09-13 20:37:36 +00:00
private static void fillRegionSettingsRow ( DataRow row , RegionSettings settings )
{
row [ "regionUUID" ] = settings . RegionUUID . ToString ( ) ;
row [ "block_terraform" ] = settings . BlockTerraform ;
row [ "block_fly" ] = settings . BlockFly ;
row [ "allow_damage" ] = settings . AllowDamage ;
row [ "restrict_pushing" ] = settings . RestrictPushing ;
row [ "allow_land_resell" ] = settings . AllowLandResell ;
row [ "allow_land_join_divide" ] = settings . AllowLandJoinDivide ;
row [ "block_show_in_search" ] = settings . BlockShowInSearch ;
row [ "agent_limit" ] = settings . AgentLimit ;
row [ "object_bonus" ] = settings . ObjectBonus ;
row [ "maturity" ] = settings . Maturity ;
row [ "disable_scripts" ] = settings . DisableScripts ;
row [ "disable_collisions" ] = settings . DisableCollisions ;
row [ "disable_physics" ] = settings . DisablePhysics ;
row [ "terrain_texture_1" ] = settings . TerrainTexture1 . ToString ( ) ;
row [ "terrain_texture_2" ] = settings . TerrainTexture2 . ToString ( ) ;
row [ "terrain_texture_3" ] = settings . TerrainTexture3 . ToString ( ) ;
row [ "terrain_texture_4" ] = settings . TerrainTexture4 . ToString ( ) ;
row [ "elevation_1_nw" ] = settings . Elevation1NW ;
row [ "elevation_2_nw" ] = settings . Elevation2NW ;
row [ "elevation_1_ne" ] = settings . Elevation1NE ;
row [ "elevation_2_ne" ] = settings . Elevation2NE ;
row [ "elevation_1_se" ] = settings . Elevation1SE ;
row [ "elevation_2_se" ] = settings . Elevation2SE ;
row [ "elevation_1_sw" ] = settings . Elevation1SW ;
row [ "elevation_2_sw" ] = settings . Elevation2SW ;
row [ "water_height" ] = settings . WaterHeight ;
row [ "terrain_raise_limit" ] = settings . TerrainRaiseLimit ;
row [ "terrain_lower_limit" ] = settings . TerrainLowerLimit ;
row [ "use_estate_sun" ] = settings . UseEstateSun ;
2012-02-29 00:33:17 +00:00
row [ "sandbox" ] = settings . Sandbox ; // unlike other database modules, sqlite uses a lower case s for sandbox!
2008-11-18 12:48:36 +00:00
row [ "sunvectorx" ] = settings . SunVector . X ;
row [ "sunvectory" ] = settings . SunVector . Y ;
row [ "sunvectorz" ] = settings . SunVector . Z ;
2008-09-13 20:37:36 +00:00
row [ "fixed_sun" ] = settings . FixedSun ;
row [ "sun_position" ] = settings . SunPosition ;
row [ "covenant" ] = settings . Covenant . ToString ( ) ;
2012-02-03 21:02:36 +00:00
row [ "covenant_datetime" ] = settings . CovenantChangedDateTime ;
2010-05-09 20:39:56 +00:00
row [ "map_tile_ID" ] = settings . TerrainImageID . ToString ( ) ;
2012-02-17 22:31:20 +00:00
row [ "TelehubObject" ] = settings . TelehubObject . ToString ( ) ;
2012-02-18 01:04:38 +00:00
row [ "parcel_tile_ID" ] = settings . ParcelImageID . ToString ( ) ;
2015-09-21 11:07:17 +00:00
row [ "block_search" ] = settings . GodBlockSearch ;
row [ "casino" ] = settings . Casino ;
2008-09-13 20:37:36 +00:00
}
2012-02-12 23:58:28 +00:00
/// <summary>
///
/// </summary>
/// <param name="row"></param>
/// <param name="windlight"></param>
private static void fillRegionWindlightRow ( DataRow row , RegionLightShareData windlight )
{
row [ "region_id" ] = windlight . regionID . ToString ( ) ;
row [ "water_color_r" ] = windlight . waterColor . X ;
row [ "water_color_g" ] = windlight . waterColor . Y ;
row [ "water_color_b" ] = windlight . waterColor . Z ;
row [ "water_color_i" ] = 1 ; //windlight.waterColor.W; //not implemented
row [ "water_fog_density_exponent" ] = windlight . waterFogDensityExponent ;
row [ "underwater_fog_modifier" ] = windlight . underwaterFogModifier ;
row [ "reflection_wavelet_scale_1" ] = windlight . reflectionWaveletScale . X ;
row [ "reflection_wavelet_scale_2" ] = windlight . reflectionWaveletScale . Y ;
row [ "reflection_wavelet_scale_3" ] = windlight . reflectionWaveletScale . Z ;
row [ "fresnel_scale" ] = windlight . fresnelScale ;
row [ "fresnel_offset" ] = windlight . fresnelOffset ;
row [ "refract_scale_above" ] = windlight . refractScaleAbove ;
row [ "refract_scale_below" ] = windlight . refractScaleBelow ;
row [ "blur_multiplier" ] = windlight . blurMultiplier ;
row [ "big_wave_direction_x" ] = windlight . bigWaveDirection . X ;
row [ "big_wave_direction_y" ] = windlight . bigWaveDirection . Y ;
row [ "little_wave_direction_x" ] = windlight . littleWaveDirection . X ;
row [ "little_wave_direction_y" ] = windlight . littleWaveDirection . Y ;
row [ "normal_map_texture" ] = windlight . normalMapTexture . ToString ( ) ;
row [ "horizon_r" ] = windlight . horizon . X ;
row [ "horizon_g" ] = windlight . horizon . Y ;
row [ "horizon_b" ] = windlight . horizon . Z ;
row [ "horizon_i" ] = windlight . horizon . W ;
row [ "haze_horizon" ] = windlight . hazeHorizon ;
row [ "blue_density_r" ] = windlight . blueDensity . X ;
row [ "blue_density_g" ] = windlight . blueDensity . Y ;
row [ "blue_density_b" ] = windlight . blueDensity . Z ;
row [ "blue_density_i" ] = windlight . blueDensity . W ;
row [ "haze_density" ] = windlight . hazeDensity ;
row [ "density_multiplier" ] = windlight . densityMultiplier ;
row [ "distance_multiplier" ] = windlight . distanceMultiplier ;
row [ "max_altitude" ] = windlight . maxAltitude ;
row [ "sun_moon_color_r" ] = windlight . sunMoonColor . X ;
row [ "sun_moon_color_g" ] = windlight . sunMoonColor . Y ;
row [ "sun_moon_color_b" ] = windlight . sunMoonColor . Z ;
row [ "sun_moon_color_i" ] = windlight . sunMoonColor . W ;
row [ "sun_moon_position" ] = windlight . sunMoonPosition ;
row [ "ambient_r" ] = windlight . ambient . X ;
row [ "ambient_g" ] = windlight . ambient . Y ;
row [ "ambient_b" ] = windlight . ambient . Z ;
row [ "ambient_i" ] = windlight . ambient . W ;
row [ "east_angle" ] = windlight . eastAngle ;
row [ "sun_glow_focus" ] = windlight . sunGlowFocus ;
row [ "sun_glow_size" ] = windlight . sunGlowSize ;
row [ "scene_gamma" ] = windlight . sceneGamma ;
row [ "star_brightness" ] = windlight . starBrightness ;
row [ "cloud_color_r" ] = windlight . cloudColor . X ;
row [ "cloud_color_g" ] = windlight . cloudColor . Y ;
row [ "cloud_color_b" ] = windlight . cloudColor . Z ;
row [ "cloud_color_i" ] = windlight . cloudColor . W ;
row [ "cloud_x" ] = windlight . cloudXYDensity . X ;
row [ "cloud_y" ] = windlight . cloudXYDensity . Y ;
row [ "cloud_density" ] = windlight . cloudXYDensity . Z ;
row [ "cloud_coverage" ] = windlight . cloudCoverage ;
row [ "cloud_scale" ] = windlight . cloudScale ;
row [ "cloud_detail_x" ] = windlight . cloudDetailXYDensity . X ;
row [ "cloud_detail_y" ] = windlight . cloudDetailXYDensity . Y ;
row [ "cloud_detail_density" ] = windlight . cloudDetailXYDensity . Z ;
row [ "cloud_scroll_x" ] = windlight . cloudScrollX ;
row [ "cloud_scroll_x_lock" ] = windlight . cloudScrollXLock ;
row [ "cloud_scroll_y" ] = windlight . cloudScrollY ;
row [ "cloud_scroll_y_lock" ] = windlight . cloudScrollYLock ;
row [ "draw_classic_clouds" ] = windlight . drawClassicClouds ;
}
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
2007-08-09 20:59:37 +00:00
private PrimitiveBaseShape buildShape ( DataRow row )
{
PrimitiveBaseShape s = new PrimitiveBaseShape ( ) ;
2008-09-06 07:52:41 +00:00
s . Scale = new Vector3 (
2007-09-13 05:25:26 +00:00
Convert . ToSingle ( row [ "ScaleX" ] ) ,
Convert . ToSingle ( row [ "ScaleY" ] ) ,
Convert . ToSingle ( row [ "ScaleZ" ] )
) ;
2007-08-09 20:59:37 +00:00
// paths
2007-08-09 23:51:26 +00:00
s . PCode = Convert . ToByte ( row [ "PCode" ] ) ;
s . PathBegin = Convert . ToUInt16 ( row [ "PathBegin" ] ) ;
s . PathEnd = Convert . ToUInt16 ( row [ "PathEnd" ] ) ;
s . PathScaleX = Convert . ToByte ( row [ "PathScaleX" ] ) ;
s . PathScaleY = Convert . ToByte ( row [ "PathScaleY" ] ) ;
s . PathShearX = Convert . ToByte ( row [ "PathShearX" ] ) ;
s . PathShearY = Convert . ToByte ( row [ "PathShearY" ] ) ;
s . PathSkew = Convert . ToSByte ( row [ "PathSkew" ] ) ;
s . PathCurve = Convert . ToByte ( row [ "PathCurve" ] ) ;
s . PathRadiusOffset = Convert . ToSByte ( row [ "PathRadiusOffset" ] ) ;
s . PathRevolutions = Convert . ToByte ( row [ "PathRevolutions" ] ) ;
s . PathTaperX = Convert . ToSByte ( row [ "PathTaperX" ] ) ;
s . PathTaperY = Convert . ToSByte ( row [ "PathTaperY" ] ) ;
s . PathTwist = Convert . ToSByte ( row [ "PathTwist" ] ) ;
s . PathTwistBegin = Convert . ToSByte ( row [ "PathTwistBegin" ] ) ;
2007-08-09 20:59:37 +00:00
// profile
2007-08-09 23:51:26 +00:00
s . ProfileBegin = Convert . ToUInt16 ( row [ "ProfileBegin" ] ) ;
s . ProfileEnd = Convert . ToUInt16 ( row [ "ProfileEnd" ] ) ;
s . ProfileCurve = Convert . ToByte ( row [ "ProfileCurve" ] ) ;
2007-09-22 18:41:01 +00:00
s . ProfileHollow = Convert . ToUInt16 ( row [ "ProfileHollow" ] ) ;
2008-09-24 20:43:27 +00:00
s . State = Convert . ToByte ( row [ "State" ] ) ;
2013-08-04 17:19:11 +00:00
s . LastAttachPoint = Convert . ToByte ( row [ "LastAttachPoint" ] ) ;
2008-09-24 20:43:27 +00:00
2009-05-07 13:20:29 +00:00
byte [ ] textureEntry = ( byte [ ] ) row [ "Texture" ] ;
2007-12-27 14:00:30 +00:00
s . TextureEntry = textureEntry ;
2007-12-27 21:41:48 +00:00
2012-02-12 23:58:28 +00:00
s . ExtraParams = ( byte [ ] ) row [ "ExtraParams" ] ;
2010-09-12 17:43:49 +00:00
2010-07-01 21:52:31 +00:00
if ( ! ( row [ "Media" ] is System . DBNull ) )
2010-08-03 15:26:27 +00:00
s . Media = PrimitiveBaseShape . MediaList . FromXml ( ( string ) row [ "Media" ] ) ;
2017-01-05 19:07:37 +00:00
2007-08-09 20:59:37 +00:00
return s ;
}
2007-08-29 16:35:22 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="row"></param>
/// <param name="prim"></param>
2008-05-01 16:03:53 +00:00
private static void fillShapeRow ( DataRow row , SceneObjectPart prim )
2007-08-09 18:37:55 +00:00
{
2007-08-09 19:02:32 +00:00
PrimitiveBaseShape s = prim . Shape ;
2009-05-07 13:20:29 +00:00
row [ "UUID" ] = prim . UUID . ToString ( ) ;
2007-08-09 19:02:32 +00:00
// shape is an enum
row [ "Shape" ] = 0 ;
// vectors
row [ "ScaleX" ] = s . Scale . X ;
row [ "ScaleY" ] = s . Scale . Y ;
row [ "ScaleZ" ] = s . Scale . Z ;
// paths
row [ "PCode" ] = s . PCode ;
row [ "PathBegin" ] = s . PathBegin ;
row [ "PathEnd" ] = s . PathEnd ;
row [ "PathScaleX" ] = s . PathScaleX ;
row [ "PathScaleY" ] = s . PathScaleY ;
row [ "PathShearX" ] = s . PathShearX ;
row [ "PathShearY" ] = s . PathShearY ;
row [ "PathSkew" ] = s . PathSkew ;
row [ "PathCurve" ] = s . PathCurve ;
row [ "PathRadiusOffset" ] = s . PathRadiusOffset ;
row [ "PathRevolutions" ] = s . PathRevolutions ;
row [ "PathTaperX" ] = s . PathTaperX ;
row [ "PathTaperY" ] = s . PathTaperY ;
row [ "PathTwist" ] = s . PathTwist ;
row [ "PathTwistBegin" ] = s . PathTwistBegin ;
// profile
row [ "ProfileBegin" ] = s . ProfileBegin ;
row [ "ProfileEnd" ] = s . ProfileEnd ;
row [ "ProfileCurve" ] = s . ProfileCurve ;
row [ "ProfileHollow" ] = s . ProfileHollow ;
2008-03-08 22:52:17 +00:00
row [ "State" ] = s . State ;
2013-08-04 17:19:11 +00:00
row [ "LastAttachPoint" ] = s . LastAttachPoint ;
2007-08-10 13:59:19 +00:00
2007-08-23 19:28:09 +00:00
row [ "Texture" ] = s . TextureEntry ;
row [ "ExtraParams" ] = s . ExtraParams ;
2010-09-12 17:43:49 +00:00
2010-08-03 15:26:27 +00:00
if ( s . Media ! = null )
row [ "Media" ] = s . Media . ToXml ( ) ;
2007-08-07 15:45:16 +00:00
}
2008-06-26 20:14:33 +00:00
/// <summary>
2010-07-01 21:52:31 +00:00
/// Persistently store a prim.
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="prim"></param>
/// <param name="sceneGroupID"></param>
/// <param name="regionUUID"></param>
2008-09-06 07:52:41 +00:00
private void addPrim ( SceneObjectPart prim , UUID sceneGroupID , UUID regionUUID )
2007-08-07 14:39:00 +00:00
{
DataTable prims = ds . Tables [ "prims" ] ;
2007-08-09 19:52:02 +00:00
DataTable shapes = ds . Tables [ "primshapes" ] ;
2007-08-29 16:35:22 +00:00
2009-05-07 13:20:29 +00:00
DataRow primRow = prims . Rows . Find ( prim . UUID . ToString ( ) ) ;
2007-08-19 13:35:20 +00:00
if ( primRow = = null )
{
2007-08-09 18:37:55 +00:00
primRow = prims . NewRow ( ) ;
2007-08-23 19:48:21 +00:00
fillPrimRow ( primRow , prim , sceneGroupID , regionUUID ) ;
2007-08-09 18:37:55 +00:00
prims . Rows . Add ( primRow ) ;
2007-08-19 13:35:20 +00:00
}
else
{
2007-08-23 19:48:21 +00:00
fillPrimRow ( primRow , prim , sceneGroupID , regionUUID ) ;
2007-08-09 18:37:55 +00:00
}
2009-05-07 13:20:29 +00:00
DataRow shapeRow = shapes . Rows . Find ( prim . UUID . ToString ( ) ) ;
2007-08-19 13:35:20 +00:00
if ( shapeRow = = null )
{
2007-08-09 19:55:41 +00:00
shapeRow = shapes . NewRow ( ) ;
2007-08-09 19:02:32 +00:00
fillShapeRow ( shapeRow , prim ) ;
2007-08-09 19:55:41 +00:00
shapes . Rows . Add ( shapeRow ) ;
2007-08-19 13:35:20 +00:00
}
else
{
2007-08-09 19:55:41 +00:00
fillShapeRow ( shapeRow , prim ) ;
2007-08-07 15:45:16 +00:00
}
2008-01-05 19:46:00 +00:00
}
2008-05-16 01:22:11 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
/// </summary>
/// <param name="primID"></param>
/// <param name="items"></param>
2008-09-06 07:52:41 +00:00
public void StorePrimInventory ( UUID primID , ICollection < TaskInventoryItem > items )
2008-01-05 19:46:00 +00:00
{
2010-06-04 16:14:12 +00:00
// m_log.DebugFormat("[SQLITE REGION DB]: Entered StorePrimInventory with prim ID {0}", primID);
2008-05-16 01:22:11 +00:00
DataTable dbItems = ds . Tables [ "primitems" ] ;
// For now, we're just going to crudely remove all the previous inventory items
// no matter whether they have changed or not, and replace them with the current set.
2008-01-21 15:12:00 +00:00
lock ( ds )
2008-01-05 19:46:00 +00:00
{
2008-01-21 16:42:53 +00:00
RemoveItems ( primID ) ;
2008-05-16 01:22:11 +00:00
2008-01-21 16:42:53 +00:00
// repalce with current inventory details
foreach ( TaskInventoryItem newItem in items )
2008-01-05 19:46:00 +00:00
{
2012-02-12 23:58:28 +00:00
// m_log.InfoFormat(
// "[DATASTORE]: ",
// "Adding item {0}, {1} to prim ID {2}",
// newItem.Name, newItem.ItemID, newItem.ParentPartID);
2008-05-16 01:22:11 +00:00
2008-01-21 15:12:00 +00:00
DataRow newItemRow = dbItems . NewRow ( ) ;
fillItemRow ( newItemRow , newItem ) ;
2008-05-16 01:22:11 +00:00
dbItems . Rows . Add ( newItemRow ) ;
2008-01-21 15:12:00 +00:00
}
2008-01-05 19:46:00 +00:00
}
2008-05-16 01:22:11 +00:00
2008-01-21 16:42:53 +00:00
Commit ( ) ;
2007-08-07 14:39:00 +00:00
}
2007-08-29 16:35:22 +00:00
2007-08-23 15:16:53 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* 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
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2007-08-07 14:39:00 +00:00
2008-06-26 20:14:33 +00:00
/// <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>
2008-05-01 16:23:53 +00:00
private static SqliteCommand createInsertCommand ( string table , DataTable dt )
2007-08-06 20:36:57 +00:00
{
2007-08-23 15:16:53 +00:00
string [ ] cols = new string [ dt . Columns . Count ] ;
2007-08-29 16:35:22 +00:00
for ( int i = 0 ; i < dt . Columns . Count ; i + + )
{
2007-08-23 15:16:53 +00:00
DataColumn col = dt . Columns [ i ] ;
cols [ i ] = col . ColumnName ;
2007-08-09 23:51:26 +00:00
}
2007-08-23 15:16:53 +00:00
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 + = ")" ;
2012-02-12 23:58:28 +00:00
// m_log.DebugFormat("[SQLITE]: Created insert command {0}", sql);
2007-08-23 15:16:53 +00:00
SqliteCommand cmd = new SqliteCommand ( sql ) ;
2007-08-19 13:35:20 +00:00
2007-08-23 15:16:53 +00:00
// this provides the binding for all our parameters, so
// much less code than it used to be
2007-08-29 16:35:22 +00:00
foreach ( DataColumn col in dt . Columns )
2007-08-19 13:35:20 +00:00
{
2007-08-23 15:16:53 +00:00
cmd . Parameters . Add ( createSqliteParameter ( col . ColumnName , col . DataType ) ) ;
2007-08-19 13:35:20 +00:00
}
2007-08-23 15:16:53 +00:00
return cmd ;
}
2007-08-19 13:35:20 +00:00
2008-06-26 20:14:33 +00:00
/// <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>
2008-05-01 16:23:53 +00:00
private static SqliteCommand createUpdateCommand ( string table , string pk , DataTable dt )
2007-08-23 15:16:53 +00:00
{
string sql = "update " + table + " set " ;
2008-01-15 02:09:55 +00:00
string subsql = String . Empty ;
2007-08-23 15:16:53 +00:00
foreach ( DataColumn col in dt . Columns )
2007-08-19 13:35:20 +00:00
{
2007-08-23 15:16:53 +00:00
if ( subsql . Length > 0 )
2007-10-30 09:05:31 +00:00
{
// a map function would rock so much here
2007-08-23 15:16:53 +00:00
subsql + = ", " ;
}
subsql + = col . ColumnName + "= :" + col . ColumnName ;
2007-08-19 13:35:20 +00:00
}
2007-08-23 15:16:53 +00:00
sql + = subsql ;
sql + = " where " + pk ;
SqliteCommand cmd = new SqliteCommand ( sql ) ;
2007-08-19 13:35:20 +00:00
2007-08-23 15:16:53 +00:00
// this provides the binding for all our parameters, so
// much less code than it used to be
2007-08-19 13:35:20 +00:00
2007-08-29 16:35:22 +00:00
foreach ( DataColumn col in dt . Columns )
2007-08-19 13:35:20 +00:00
{
2007-08-23 15:16:53 +00:00
cmd . Parameters . Add ( createSqliteParameter ( col . ColumnName , col . DataType ) ) ;
2007-08-19 13:35:20 +00:00
}
2007-08-23 15:16:53 +00:00
return cmd ;
2007-08-21 22:01:30 +00:00
}
2010-02-13 10:09:15 +00:00
/// <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>
private static SqliteCommand createUpdateCommand ( string table , string pk1 , string pk2 , 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 " + pk1 + " and " + pk2 ;
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 ;
}
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="dt">Data Table</param>
/// <returns></returns>
2008-06-27 23:03:39 +00:00
// private 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 && col == dt.PrimaryKey[0])
// {
// subsql += " primary key";
// }
// }
// sql += subsql;
// sql += ")";
// return sql;
// }
2007-08-23 15:16:53 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Database Binding functions
*
* These will be db specific due to typing , and minor differences
* in databases .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
///<summary>
/// This is a convenience function that collapses 5 repetitive
/// lines for defining SqliteParameters to 2 parameters:
/// column name and database type.
2008-05-16 01:22:11 +00:00
///
2007-08-23 15:16:53 +00:00
/// 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.
///</summary>
///<returns>a built sqlite parameter</returns>
2008-05-01 16:23:53 +00:00
private static SqliteParameter createSqliteParameter ( string name , Type type )
2007-08-21 22:01:30 +00:00
{
2007-08-23 15:16:53 +00:00
SqliteParameter param = new SqliteParameter ( ) ;
param . ParameterName = ":" + name ;
param . DbType = dbtypeFromType ( type ) ;
param . SourceColumn = name ;
param . SourceVersion = DataRowVersion . Current ;
return param ;
2008-05-16 01:22:11 +00:00
}
2008-01-11 17:00:21 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="da"></param>
/// <param name="conn"></param>
2008-01-11 17:00:21 +00:00
private void setupPrimCommands ( SqliteDataAdapter da , SqliteConnection conn )
{
da . InsertCommand = createInsertCommand ( "prims" , ds . Tables [ "prims" ] ) ;
da . InsertCommand . Connection = conn ;
da . UpdateCommand = createUpdateCommand ( "prims" , "UUID=:UUID" , ds . Tables [ "prims" ] ) ;
da . UpdateCommand . Connection = conn ;
SqliteCommand delete = new SqliteCommand ( "delete from prims where UUID = :UUID" ) ;
2012-02-12 23:58:28 +00:00
delete . Parameters . Add ( createSqliteParameter ( "UUID" , typeof ( String ) ) ) ;
2008-01-11 17:00:21 +00:00
delete . Connection = conn ;
da . DeleteCommand = delete ;
2007-08-23 15:16:53 +00:00
}
2008-05-16 01:22:11 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="da"></param>
/// <param name="conn"></param>
2008-01-05 19:46:00 +00:00
private void setupItemsCommands ( SqliteDataAdapter da , SqliteConnection conn )
{
da . InsertCommand = createInsertCommand ( "primitems" , ds . Tables [ "primitems" ] ) ;
da . InsertCommand . Connection = conn ;
da . UpdateCommand = createUpdateCommand ( "primitems" , "itemID = :itemID" , ds . Tables [ "primitems" ] ) ;
da . UpdateCommand . Connection = conn ;
SqliteCommand delete = new SqliteCommand ( "delete from primitems where itemID = :itemID" ) ;
2012-02-12 23:58:28 +00:00
delete . Parameters . Add ( createSqliteParameter ( "itemID" , typeof ( String ) ) ) ;
2008-01-05 19:46:00 +00:00
delete . Connection = conn ;
da . DeleteCommand = delete ;
2008-05-16 01:22:11 +00:00
}
2007-08-23 15:16:53 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="da"></param>
/// <param name="conn"></param>
2007-10-22 21:57:32 +00:00
private void setupTerrainCommands ( SqliteDataAdapter da , SqliteConnection conn )
{
da . InsertCommand = createInsertCommand ( "terrain" , ds . Tables [ "terrain" ] ) ;
da . InsertCommand . Connection = conn ;
}
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="da"></param>
/// <param name="conn"></param>
2007-12-18 17:42:02 +00:00
private void setupLandCommands ( SqliteDataAdapter da , SqliteConnection conn )
{
da . InsertCommand = createInsertCommand ( "land" , ds . Tables [ "land" ] ) ;
da . InsertCommand . Connection = conn ;
da . UpdateCommand = createUpdateCommand ( "land" , "UUID=:UUID" , ds . Tables [ "land" ] ) ;
da . UpdateCommand . Connection = conn ;
2010-02-13 10:09:15 +00:00
SqliteCommand delete = new SqliteCommand ( "delete from land where UUID=:UUID" ) ;
delete . Parameters . Add ( createSqliteParameter ( "UUID" , typeof ( String ) ) ) ;
da . DeleteCommand = delete ;
da . DeleteCommand . Connection = conn ;
2007-12-18 17:42:02 +00:00
}
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="da"></param>
/// <param name="conn"></param>
2007-12-18 17:42:02 +00:00
private void setupLandAccessCommands ( SqliteDataAdapter da , SqliteConnection conn )
{
da . InsertCommand = createInsertCommand ( "landaccesslist" , ds . Tables [ "landaccesslist" ] ) ;
da . InsertCommand . Connection = conn ;
2010-02-13 10:09:15 +00:00
da . UpdateCommand = createUpdateCommand ( "landaccesslist" , "LandUUID=:landUUID" , "AccessUUID=:AccessUUID" , ds . Tables [ "landaccesslist" ] ) ;
da . UpdateCommand . Connection = conn ;
SqliteCommand delete = new SqliteCommand ( "delete from landaccesslist where LandUUID= :LandUUID and AccessUUID= :AccessUUID" ) ;
delete . Parameters . Add ( createSqliteParameter ( "LandUUID" , typeof ( String ) ) ) ;
delete . Parameters . Add ( createSqliteParameter ( "AccessUUID" , typeof ( String ) ) ) ;
da . DeleteCommand = delete ;
da . DeleteCommand . Connection = conn ;
2008-09-13 20:37:36 +00:00
}
private void setupRegionSettingsCommands ( SqliteDataAdapter da , SqliteConnection conn )
{
da . InsertCommand = createInsertCommand ( "regionsettings" , ds . Tables [ "regionsettings" ] ) ;
da . InsertCommand . Connection = conn ;
2008-09-13 22:29:36 +00:00
da . UpdateCommand = createUpdateCommand ( "regionsettings" , "regionUUID=:regionUUID" , ds . Tables [ "regionsettings" ] ) ;
da . UpdateCommand . Connection = conn ;
2007-12-18 17:42:02 +00:00
}
2007-12-27 21:41:48 +00:00
2012-02-12 23:58:28 +00:00
/// <summary>
///
/// </summary>
/// <param name="da"></param>
/// <param name="conn"></param>
private void setupRegionWindlightCommands ( SqliteDataAdapter da , SqliteConnection conn )
{
da . InsertCommand = createInsertCommand ( "regionwindlight" , ds . Tables [ "regionwindlight" ] ) ;
da . InsertCommand . Connection = conn ;
da . UpdateCommand = createUpdateCommand ( "regionwindlight" , "region_id=:region_id" , ds . Tables [ "regionwindlight" ] ) ;
da . UpdateCommand . Connection = conn ;
}
2012-05-23 19:06:25 +00:00
private void setupRegionEnvironmentCommands ( SqliteDataAdapter da , SqliteConnection conn )
{
da . InsertCommand = createInsertCommand ( "regionenvironment" , ds . Tables [ "regionenvironment" ] ) ;
da . InsertCommand . Connection = conn ;
da . UpdateCommand = createUpdateCommand ( "regionenvironment" , "region_id=:region_id" , ds . Tables [ "regionenvironment" ] ) ;
da . UpdateCommand . Connection = conn ;
}
2012-02-17 22:31:20 +00:00
private void setupRegionSpawnPointsCommands ( SqliteDataAdapter da , SqliteConnection conn )
{
da . InsertCommand = createInsertCommand ( "spawn_points" , ds . Tables [ "spawn_points" ] ) ;
da . InsertCommand . Connection = conn ;
da . UpdateCommand = createUpdateCommand ( "spawn_points" , "RegionID=:RegionID" , ds . Tables [ "spawn_points" ] ) ;
da . UpdateCommand . Connection = conn ;
}
2008-06-26 20:14:33 +00:00
/// <summary>
2008-08-18 00:39:10 +00:00
///
2008-06-26 20:14:33 +00:00
/// </summary>
/// <param name="da"></param>
/// <param name="conn"></param>
2007-08-23 15:16:53 +00:00
private void setupShapeCommands ( SqliteDataAdapter da , SqliteConnection conn )
{
da . InsertCommand = createInsertCommand ( "primshapes" , ds . Tables [ "primshapes" ] ) ;
da . InsertCommand . Connection = conn ;
da . UpdateCommand = createUpdateCommand ( "primshapes" , "UUID=:UUID" , ds . Tables [ "primshapes" ] ) ;
da . UpdateCommand . Connection = conn ;
SqliteCommand delete = new SqliteCommand ( "delete from primshapes where UUID = :UUID" ) ;
2012-02-12 23:58:28 +00:00
delete . Parameters . Add ( createSqliteParameter ( "UUID" , typeof ( String ) ) ) ;
2007-08-23 15:16:53 +00:00
delete . Connection = conn ;
da . DeleteCommand = delete ;
}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Type conversion functions
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2007-08-29 16:35:22 +00:00
2008-06-26 20:14:33 +00:00
/// <summary>
/// Type conversion function
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
2008-05-01 16:03:53 +00:00
private static DbType dbtypeFromType ( Type type )
2007-08-22 21:09:38 +00:00
{
2012-02-12 23:58:28 +00:00
if ( type = = typeof ( String ) )
2007-08-29 16:35:22 +00:00
{
2007-08-23 15:16:53 +00:00
return DbType . String ;
2007-08-29 16:35:22 +00:00
}
2012-02-12 23:58:28 +00:00
else if ( type = = typeof ( Int32 ) )
2007-08-29 16:35:22 +00:00
{
2007-08-23 15:16:53 +00:00
return DbType . Int32 ;
2007-08-29 16:35:22 +00:00
}
2012-02-12 23:58:28 +00:00
else if ( type = = typeof ( Double ) )
2007-10-22 21:57:32 +00:00
{
return DbType . Double ;
}
2012-02-12 23:58:28 +00:00
else if ( type = = typeof ( Byte ) )
2007-10-22 21:57:32 +00:00
{
return DbType . Byte ;
}
2012-02-12 23:58:28 +00:00
else if ( type = = typeof ( Double ) )
2007-08-29 16:35:22 +00:00
{
2007-08-23 15:16:53 +00:00
return DbType . Double ;
2007-08-29 16:35:22 +00:00
}
2012-02-12 23:58:28 +00:00
else if ( type = = typeof ( Byte [ ] ) )
2007-08-29 16:35:22 +00:00
{
2007-08-23 15:16:53 +00:00
return DbType . Binary ;
2007-08-29 16:35:22 +00:00
}
2016-09-17 18:46:40 +00:00
else if ( type = = typeof ( Boolean ) )
{
return DbType . Boolean ;
}
2007-08-29 16:35:22 +00:00
else
{
2007-08-23 15:16:53 +00:00
return DbType . String ;
}
2007-08-22 21:09:38 +00:00
}
2010-09-12 17:43:49 +00:00
2010-04-30 16:45:00 +00:00
static void PrintDataSet ( DataSet ds )
{
2012-02-12 23:58:28 +00:00
// Print out any name and extended properties.
Console . WriteLine ( "DataSet is named: {0}" , ds . DataSetName ) ;
foreach ( System . Collections . DictionaryEntry de in ds . ExtendedProperties )
2010-04-30 16:45:00 +00:00
{
2012-02-12 23:58:28 +00:00
Console . WriteLine ( "Key = {0}, Value = {1}" , de . Key , de . Value ) ;
2010-04-30 16:45:00 +00:00
}
2012-02-12 23:58:28 +00:00
Console . WriteLine ( ) ;
foreach ( DataTable dt in ds . Tables )
2010-04-30 16:45:00 +00:00
{
2012-02-12 23:58:28 +00:00
Console . WriteLine ( "=> {0} Table:" , dt . TableName ) ;
// Print out the column names.
for ( int curCol = 0 ; curCol < dt . Columns . Count ; curCol + + )
{
Console . Write ( dt . Columns [ curCol ] . ColumnName + "\t" ) ;
}
Console . WriteLine ( "\n----------------------------------" ) ;
// Print the DataTable.
for ( int curRow = 0 ; curRow < dt . Rows . Count ; curRow + + )
{
for ( int curCol = 0 ; curCol < dt . Columns . Count ; curCol + + )
{
Console . Write ( dt . Rows [ curRow ] [ curCol ] . ToString ( ) + "\t" ) ;
}
Console . WriteLine ( ) ;
}
2010-04-30 16:45:00 +00:00
}
}
2007-08-29 16:35:22 +00:00
2012-06-07 20:39:03 +00:00
public UUID [ ] GetObjectIDs ( UUID regionID )
{
return new UUID [ 0 ] ;
}
2012-08-14 23:08:30 +00:00
2012-08-15 01:06:22 +00:00
public void SaveExtra ( UUID regionID , string name , string value )
{
}
public void RemoveExtra ( UUID regionID , string name )
{
}
public Dictionary < string , string > GetExtra ( UUID regionID )
{
return null ;
}
2007-08-06 20:36:57 +00:00
}
2008-01-05 19:46:00 +00:00
}