aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Data/MSSQL/MSSQLSimulationData.cs2
-rw-r--r--OpenSim/Data/MySQL/MySQLSimulationData.cs7
-rw-r--r--OpenSim/Data/SQLite/SQLiteSimulationData.cs14
-rw-r--r--OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs21
4 files changed, 28 insertions, 16 deletions
diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
index f41f60c..8adddc9 100644
--- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
@@ -576,7 +576,7 @@ ELSE
576 /// <param name="regionID">regionID.</param> 576 /// <param name="regionID">regionID.</param>
577 public void StoreTerrain(double[,] terrain, UUID regionID) 577 public void StoreTerrain(double[,] terrain, UUID regionID)
578 { 578 {
579 int revision = Util.UnixTimeSinceEpoch(); 579 int revision = (int)DBTerrainRevision.Legacy256;
580 580
581 //Delete old terrain map 581 //Delete old terrain map
582 string sql = "delete from terrain where RegionUUID=@RegionUUID"; 582 string sql = "delete from terrain where RegionUUID=@RegionUUID";
diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs
index b03a904..5751dc8 100644
--- a/OpenSim/Data/MySQL/MySQLSimulationData.cs
+++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs
@@ -575,6 +575,7 @@ namespace OpenSim.Data.MySQL
575 public void StoreTerrain(double[,] ter, UUID regionID) 575 public void StoreTerrain(double[,] ter, UUID regionID)
576 { 576 {
577 m_log.Info("[REGION DB]: Storing terrain"); 577 m_log.Info("[REGION DB]: Storing terrain");
578 int revision = (int)DBTerrainRevision.Legacy256;
578 579
579 lock (m_dbLock) 580 lock (m_dbLock)
580 { 581 {
@@ -589,10 +590,10 @@ namespace OpenSim.Data.MySQL
589 590
590 ExecuteNonQuery(cmd); 591 ExecuteNonQuery(cmd);
591 592
592 cmd.CommandText = "insert into terrain (RegionUUID, " + 593 cmd.CommandText = "insert into terrain (RegionUUID, Revision, Heightfield)"
593 "Revision, Heightfield) values (?RegionUUID, " + 594 + "values (?RegionUUID, ?Revision, ?Heightfield)";
594 "1, ?Heightfield)";
595 595
596 cmd.Parameters.AddWithValue("Revision", revision);
596 cmd.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter)); 597 cmd.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter));
597 598
598 ExecuteNonQuery(cmd); 599 ExecuteNonQuery(cmd);
diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs
index d938b6b..b70af6b 100644
--- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs
+++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs
@@ -828,22 +828,12 @@ namespace OpenSim.Data.SQLite
828 { 828 {
829 lock (ds) 829 lock (ds)
830 { 830 {
831 int revision = Util.UnixTimeSinceEpoch(); 831 int revision = (int)DBTerrainRevision.Legacy256;
832
833 // This is added to get rid of the infinitely growing
834 // terrain databases which negatively impact on SQLite
835 // over time. Before reenabling this feature there
836 // needs to be a limitter put on the number of
837 // revisions in the database, as this old
838 // implementation is a DOS attack waiting to happen.
839 832
840 using ( 833 using (
841 SqliteCommand cmd = 834 SqliteCommand cmd = new SqliteCommand("delete from terrain where RegionUUID=:RegionUUID", m_conn))
842 new SqliteCommand("delete from terrain where RegionUUID=:RegionUUID and Revision <= :Revision",
843 m_conn))
844 { 835 {
845 cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString())); 836 cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
846 cmd.Parameters.Add(new SqliteParameter(":Revision", revision));
847 cmd.ExecuteNonQuery(); 837 cmd.ExecuteNonQuery();
848 } 838 }
849 839
diff --git a/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs b/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs
index 3787ca0..c936a84 100644
--- a/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs
+++ b/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs
@@ -134,5 +134,26 @@ namespace OpenSim.Region.Framework.Interfaces
134 Dictionary<string, string> GetExtra(UUID regionID); 134 Dictionary<string, string> GetExtra(UUID regionID);
135 135
136 void Shutdown(); 136 void Shutdown();
137 }
138
139 // The terrain is stored as a blob in the database with a 'revision' field.
140 // Some implementations of terrain storage would fill the revision field with
141 // the time the terrain was stored. When real revisions were added and this
142 // feature removed, that left some old entries with the time in the revision
143 // field.
144 // Thus, if revision is greater than 'RevisionHigh' then terrain db entry is
145 // left over and it is presumed to be 'Legacy256'.
146 // Numbers are arbitrary and are chosen to to reduce possible mis-interpretation.
147 // If a revision does not match any of these, it is assumed to be Legacy256.
148 public enum DBTerrainRevision
149 {
150 // Terrain is 'double[256,256]'
151 Legacy256 = 11,
152 // Terrain is 'int32, int32, float[,]' where the shorts are X and Y dimensions
153 // The dimensions are presumed to be multiples of 16 and, more likely, multiples of 256.
154 Variable2D = 22,
155 // A revision that is not listed above or any revision greater than this value is 'Legacy256'.
156 RevisionHigh = 1234
137 } 157 }
158
138} 159}