From 5dad0ed7296b4abfe2c934a8404022a4d2189051 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Mon, 22 Oct 2007 21:57:32 +0000 Subject: * Return of R2162. /Take that SVN!/ --- OpenSim/Region/Application/OpenSimMain.cs | 18 +-- .../Environment/Interfaces/IRegionDataStore.cs | 4 +- OpenSim/Region/Environment/ModuleLoader.cs | 2 +- OpenSim/Region/Environment/Scenes/Scene.cs | 8 +- .../Region/ExtensionsScriptModule/ScriptManager.cs | 2 +- .../Region/Physics/Manager/PhysicsPluginManager.cs | 2 +- .../MonoSqliteDataStore.cs | 121 ++++++++++++++++++++- .../OpenSim.DataStore.NullStorage/NullDataStore.cs | 4 +- 8 files changed, 138 insertions(+), 23 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs index d2f5648..9de3831 100644 --- a/OpenSim/Region/Application/OpenSimMain.cs +++ b/OpenSim/Region/Application/OpenSimMain.cs @@ -262,8 +262,10 @@ namespace OpenSim } else { - MainLog.Instance.Verbose("No startup command script specified. Moving on..."); + MainLog.Instance.Verbose("STARTUP","No startup command script specified. Moving on..."); } + + MainLog.Instance.Status("STARTUP","Startup complete, serving " + m_udpServers.Count.ToString() + " region(s)"); } private static void CreateDefaultRegionInfoXml(string fileName) @@ -361,11 +363,11 @@ namespace OpenSim RunCommandScript(m_shutdownCommandsFile); } - m_log.Verbose("Closing all threads"); - m_log.Verbose("Killing listener thread"); - m_log.Verbose("Killing clients"); + m_log.Verbose("SHUTDOWN", "Closing all threads"); + m_log.Verbose("SHUTDOWN", "Killing listener thread"); + m_log.Verbose("SHUTDOWN", "Killing clients"); // IMPLEMENT THIS - m_log.Verbose("Closing console and terminating"); + m_log.Verbose("SHUTDOWN", "Closing console and terminating"); m_sceneManager.Close(); @@ -380,7 +382,7 @@ namespace OpenSim /// private void RunCommandScript(string fileName) { - MainLog.Instance.Verbose("Running command script (" + fileName + ")"); + MainLog.Instance.Verbose("COMMANDFILE", "Running " + fileName); if (File.Exists(fileName)) { StreamReader readFile = File.OpenText(fileName); @@ -389,14 +391,14 @@ namespace OpenSim { if (currentCommand != "") { - MainLog.Instance.Verbose("Running '" + currentCommand + "'"); + MainLog.Instance.Verbose("COMMANDFILE", "Running '" + currentCommand + "'"); MainLog.Instance.MainLogRunCommand(currentCommand); } } } else { - MainLog.Instance.Error("Command script missing. Can not run commands"); + MainLog.Instance.Error("COMMANDFILE","Command script missing. Can not run commands"); } } diff --git a/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs b/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs index 1a00f2c..e375343 100644 --- a/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs +++ b/OpenSim/Region/Environment/Interfaces/IRegionDataStore.cs @@ -47,8 +47,8 @@ namespace OpenSim.Region.Environment.Interfaces List LoadObjects(LLUUID regionUUID); - void StoreTerrain(double[,] terrain); - double[,] LoadTerrain(); + void StoreTerrain(double[,] terrain, LLUUID regionID); + double[,] LoadTerrain(LLUUID regionID); void StoreParcel(Land Parcel); void RemoveLandObject(uint ID); diff --git a/OpenSim/Region/Environment/ModuleLoader.cs b/OpenSim/Region/Environment/ModuleLoader.cs index c579c1d..4fc45a0 100644 --- a/OpenSim/Region/Environment/ModuleLoader.cs +++ b/OpenSim/Region/Environment/ModuleLoader.cs @@ -168,7 +168,7 @@ namespace OpenSim.Region.Environment } catch( BadImageFormatException e ) { - m_log.Warn( "MODULES", "The file [{0}] is not a module assembly.", e.FileName ); + m_log.Verbose( "MODULES", "The file [{0}] is not a module assembly.", e.FileName ); } } diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index e2430f8..ee47678 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -370,7 +370,7 @@ namespace OpenSim.Region.Environment.Scenes phyScene.SetTerrain(Terrain.GetHeights1D()); } - storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD()); + storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD(),RegionInfo.RegionID); float[] terData = Terrain.GetHeights1D(); @@ -466,7 +466,7 @@ namespace OpenSim.Region.Environment.Scenes { try { - double[,] map = storageManager.DataStore.LoadTerrain(); + double[,] map = storageManager.DataStore.LoadTerrain(RegionInfo.RegionID); if (map == null) { if (string.IsNullOrEmpty(m_regInfo.EstateSettings.terrainFile)) @@ -474,7 +474,7 @@ namespace OpenSim.Region.Environment.Scenes MainLog.Instance.Verbose("TERRAIN", "No default terrain. Generating a new terrain."); Terrain.HillsGenerator(); - storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD()); + storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD(),RegionInfo.RegionID); } else { @@ -488,7 +488,7 @@ namespace OpenSim.Region.Environment.Scenes MainLog.Instance.Verbose("TERRAIN", "No terrain found in database or default. Generating a new terrain."); Terrain.HillsGenerator(); } - storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD()); + storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD(), RegionInfo.RegionID); } } else diff --git a/OpenSim/Region/ExtensionsScriptModule/ScriptManager.cs b/OpenSim/Region/ExtensionsScriptModule/ScriptManager.cs index be27a0b..95ab2ca 100644 --- a/OpenSim/Region/ExtensionsScriptModule/ScriptManager.cs +++ b/OpenSim/Region/ExtensionsScriptModule/ScriptManager.cs @@ -70,7 +70,7 @@ namespace OpenSim.Region.ExtensionsScriptModule public void Initialise(Scene scene, IConfigSource config) { - System.Console.WriteLine("Initialising Extensions Scripting Module"); + OpenSim.Framework.Console.MainLog.Instance.Verbose("SCRIPTMODULE", "Initialising Extensions Scripting Module"); m_scene = scene; m_scene.RegisterModuleInterface(this); diff --git a/OpenSim/Region/Physics/Manager/PhysicsPluginManager.cs b/OpenSim/Region/Physics/Manager/PhysicsPluginManager.cs index 87b6d34..81bc938 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsPluginManager.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsPluginManager.cs @@ -93,7 +93,7 @@ namespace OpenSim.Region.Physics.Manager IPhysicsPlugin plug = (IPhysicsPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); plug.Init(); this._plugins.Add(plug.GetName(),plug); - Console.WriteLine("added physics engine: " + plug.GetName()); + OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS","Added physics engine: " + plug.GetName()); } diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs index 733e4c4..cc0ff7a 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs @@ -43,10 +43,12 @@ namespace OpenSim.DataStore.MonoSqlite { private const string primSelect = "select * from prims"; private const string shapeSelect = "select * from primshapes"; + private const string terrainSelect = "select * from terrain"; private DataSet ds; private SqliteDataAdapter primDa; private SqliteDataAdapter shapeDa; + private SqliteDataAdapter terrainDa; /*********************************************************************** * @@ -70,6 +72,8 @@ namespace OpenSim.DataStore.MonoSqlite shapeDa = new SqliteDataAdapter(shapeSelectCmd); // SqliteCommandBuilder shapeCb = new SqliteCommandBuilder(shapeDa); + SqliteCommand terrainSelectCmd = new SqliteCommand(terrainSelect, conn); + terrainDa = new SqliteDataAdapter(terrainSelectCmd); // We fill the data set, now we've got copies in memory for the information // TODO: see if the linkage actually holds. @@ -83,6 +87,10 @@ namespace OpenSim.DataStore.MonoSqlite ds.Tables.Add(createShapeTable()); setupShapeCommands(shapeDa, conn); + + ds.Tables.Add(createTerrainTable()); + setupTerrainCommands(terrainDa, conn); + terrainDa.Fill(ds.Tables["terrain"]); // WORKAROUND: This is a work around for sqlite on // windows, which gets really unhappy with blob columns @@ -210,14 +218,57 @@ namespace OpenSim.DataStore.MonoSqlite } - public void StoreTerrain(double[,] ter) + public void StoreTerrain(double[,] ter, LLUUID regionID) { + int revision = OpenSim.Framework.Utilities.Util.UnixTimeSinceEpoch(); + + MainLog.Instance.Verbose("DATASTORE", "Storing terrain revision r" + revision.ToString()); + + DataTable terrain = ds.Tables["terrain"]; + + DataRow newrow = terrain.NewRow(); + fillTerrainRow(newrow, regionID, revision, ter); + terrain.Rows.Add(newrow); + Commit(); } - public double[,] LoadTerrain() + public double[,] LoadTerrain(LLUUID regionID) { - return null; + double[,] terret = new double[256, 256]; + terret.Initialize(); + + DataTable terrain = ds.Tables["terrain"]; + + DataRow[] rows = terrain.Select("RegionUUID = '" + regionID.ToString() + "'","Revision DESC"); + + int rev = 0; + + if (rows.Length > 0) + { + DataRow row = rows[0]; + + byte[] heightmap = (byte[])row["Heightfield"]; + for (int x = 0; x < 256; x++) + { + for (int y = 0; y < 256; y++) + { + terret[x, y] = BitConverter.ToDouble(heightmap, ((x * 256) + y) * 8); + } + } + + rev = (int)row["Revision"]; + } + else + { + MainLog.Instance.Verbose("DATASTORE", "No terrain found for region"); + return null; + } + + + MainLog.Instance.Verbose("DATASTORE", "Loaded terrain revision r" + rev.ToString()); + + return terret; } public void RemoveLandObject(uint id) @@ -240,6 +291,7 @@ namespace OpenSim.DataStore.MonoSqlite lock (ds) { primDa.Update(ds, "prims"); shapeDa.Update(ds, "primshapes"); + terrainDa.Update(ds, "terrain"); ds.AcceptChanges(); } } @@ -263,6 +315,22 @@ namespace OpenSim.DataStore.MonoSqlite dt.Columns.Add(col); } + private DataTable createTerrainTable() + { + DataTable terrain = new DataTable("terrain"); + + createCol(terrain, "RegionUUID", typeof(System.String)); + createCol(terrain, "Revision", typeof(System.Int32)); + createCol(terrain, "Heightfield", typeof(System.Byte[])); + + /* // Attempting to work out requirements to get SQLite to actually *save* the data. + createCol(terrain, "PrIndex", typeof(System.String)); + terrain.PrimaryKey = new DataColumn[] { terrain.Columns["PrIndex"] }; + */ + + return terrain; + } + private DataTable createPrimTable() { DataTable prims = new DataTable("prims"); @@ -431,6 +499,22 @@ namespace OpenSim.DataStore.MonoSqlite return prim; } + private void fillTerrainRow(DataRow row, LLUUID regionUUID, int rev, double[,] val) + { + row["RegionUUID"] = regionUUID; + row["Revision"] = rev; + + System.IO.MemoryStream str = new System.IO.MemoryStream(65536 * sizeof(double)); + System.IO.BinaryWriter bw = new System.IO.BinaryWriter(str); + + // TODO: COMPATIBILITY - Add byte-order conversions + for (int x = 0; x < 256; x++) + for (int y = 0; y < 256; y++) + bw.Write(val[x, y]); + + row["Heightfield"] = str.ToArray(); + } + private void fillPrimRow(DataRow row, SceneObjectPart prim, LLUUID sceneGroupID, LLUUID regionUUID) { row["UUID"] = prim.UUID; @@ -692,7 +776,7 @@ namespace OpenSim.DataStore.MonoSqlite subsql += ",\n"; } subsql += col.ColumnName + " " + sqliteType(col.DataType); - if (col == dt.PrimaryKey[0]) + if (dt.PrimaryKey.Length > 0 && col == dt.PrimaryKey[0]) { subsql += " primary key"; } @@ -746,6 +830,12 @@ namespace OpenSim.DataStore.MonoSqlite da.DeleteCommand = delete; } + private void setupTerrainCommands(SqliteDataAdapter da, SqliteConnection conn) + { + da.InsertCommand = createInsertCommand("terrain", ds.Tables["terrain"]); + da.InsertCommand.Connection = conn; + } + private void setupShapeCommands(SqliteDataAdapter da, SqliteConnection conn) { da.InsertCommand = createInsertCommand("primshapes", ds.Tables["primshapes"]); @@ -764,12 +854,15 @@ namespace OpenSim.DataStore.MonoSqlite { string createPrims = defineTable(createPrimTable()); string createShapes = defineTable(createShapeTable()); + string createTerrain = defineTable(createTerrainTable()); SqliteCommand pcmd = new SqliteCommand(createPrims, conn); SqliteCommand scmd = new SqliteCommand(createShapes, conn); + SqliteCommand tcmd = new SqliteCommand(createTerrain, conn); conn.Open(); pcmd.ExecuteNonQuery(); scmd.ExecuteNonQuery(); + tcmd.ExecuteNonQuery(); conn.Close(); } @@ -779,12 +872,15 @@ namespace OpenSim.DataStore.MonoSqlite SqliteDataAdapter pDa = new SqliteDataAdapter(primSelectCmd); SqliteCommand shapeSelectCmd = new SqliteCommand(shapeSelect, conn); SqliteDataAdapter sDa = new SqliteDataAdapter(shapeSelectCmd); + SqliteCommand terrainSelectCmd = new SqliteCommand(terrainSelect, conn); + SqliteDataAdapter tDa = new SqliteDataAdapter(terrainSelectCmd); DataSet tmpDS = new DataSet(); try { pDa.Fill(tmpDS, "prims"); sDa.Fill(tmpDS, "primshapes"); + tDa.Fill(tmpDS, "terrain"); } catch (Mono.Data.SqliteClient.SqliteSyntaxException) { @@ -794,6 +890,7 @@ namespace OpenSim.DataStore.MonoSqlite pDa.Fill(tmpDS, "prims"); sDa.Fill(tmpDS, "primshapes"); + tDa.Fill(tmpDS, "terrain"); foreach (DataColumn col in createPrimTable().Columns) { @@ -811,6 +908,14 @@ namespace OpenSim.DataStore.MonoSqlite return false; } } + foreach (DataColumn col in createTerrainTable().Columns) + { + if (!tmpDS.Tables["terrain"].Columns.Contains(col.ColumnName)) + { + MainLog.Instance.Verbose("DATASTORE", "Missing require column:" + col.ColumnName); + return false; + } + } return true; } @@ -834,6 +939,14 @@ namespace OpenSim.DataStore.MonoSqlite { return DbType.Double; } + else if (type == typeof(System.Byte)) + { + return DbType.Byte; + } + else if (type == typeof(System.Double)) + { + return DbType.Double; + } else if (type == typeof(System.Byte[])) { return DbType.Binary; diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs index 91b1914..f726ea2 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.NullStorage/NullDataStore.cs @@ -61,12 +61,12 @@ namespace OpenSim.DataStore.NullStorage return new List(); } - public void StoreTerrain(double[,] ter) + public void StoreTerrain(double[,] ter, LLUUID regionID) { } - public double[,] LoadTerrain() + public double[,] LoadTerrain(LLUUID regionID) { return null; } -- cgit v1.1