aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Data/MySQL/MySQLSimulationData.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Data/MySQL/MySQLSimulationData.cs162
1 files changed, 117 insertions, 45 deletions
diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs
index 1a2e113..faf749f 100644
--- a/OpenSim/Data/MySQL/MySQLSimulationData.cs
+++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs
@@ -66,7 +66,7 @@ namespace OpenSim.Data.MySQL
66 Initialise(connectionString); 66 Initialise(connectionString);
67 } 67 }
68 68
69 public void Initialise(string connectionString) 69 public virtual void Initialise(string connectionString)
70 { 70 {
71 m_connectionString = connectionString; 71 m_connectionString = connectionString;
72 72
@@ -113,7 +113,7 @@ namespace OpenSim.Data.MySQL
113 113
114 public void Dispose() {} 114 public void Dispose() {}
115 115
116 public void StoreObject(SceneObjectGroup obj, UUID regionUUID) 116 public virtual void StoreObject(SceneObjectGroup obj, UUID regionUUID)
117 { 117 {
118 uint flags = obj.RootPart.GetEffectiveObjectFlags(); 118 uint flags = obj.RootPart.GetEffectiveObjectFlags();
119 119
@@ -135,7 +135,7 @@ namespace OpenSim.Data.MySQL
135 foreach (SceneObjectPart prim in obj.Parts) 135 foreach (SceneObjectPart prim in obj.Parts)
136 { 136 {
137 cmd.Parameters.Clear(); 137 cmd.Parameters.Clear();
138 138
139 cmd.CommandText = "replace into prims (" + 139 cmd.CommandText = "replace into prims (" +
140 "UUID, CreationDate, " + 140 "UUID, CreationDate, " +
141 "Name, Text, Description, " + 141 "Name, Text, Description, " +
@@ -171,7 +171,10 @@ namespace OpenSim.Data.MySQL
171 "ParticleSystem, ClickAction, Material, " + 171 "ParticleSystem, ClickAction, Material, " +
172 "CollisionSound, CollisionSoundVolume, " + 172 "CollisionSound, CollisionSoundVolume, " +
173 "PassTouches, " + 173 "PassTouches, " +
174 "LinkNumber, MediaURL) values (" + "?UUID, " + 174 "PassCollisions, " +
175 "LinkNumber, MediaURL, KeyframeMotion, " +
176 "PhysicsShapeType, Density, GravityModifier, " +
177 "Friction, Restitution) values (" + "?UUID, " +
175 "?CreationDate, ?Name, ?Text, " + 178 "?CreationDate, ?Name, ?Text, " +
176 "?Description, ?SitName, ?TouchName, " + 179 "?Description, ?SitName, ?TouchName, " +
177 "?ObjectFlags, ?OwnerMask, ?NextOwnerMask, " + 180 "?ObjectFlags, ?OwnerMask, ?NextOwnerMask, " +
@@ -202,14 +205,17 @@ namespace OpenSim.Data.MySQL
202 "?SaleType, ?ColorR, ?ColorG, " + 205 "?SaleType, ?ColorR, ?ColorG, " +
203 "?ColorB, ?ColorA, ?ParticleSystem, " + 206 "?ColorB, ?ColorA, ?ParticleSystem, " +
204 "?ClickAction, ?Material, ?CollisionSound, " + 207 "?ClickAction, ?Material, ?CollisionSound, " +
205 "?CollisionSoundVolume, ?PassTouches, ?LinkNumber, ?MediaURL)"; 208 "?CollisionSoundVolume, ?PassTouches, ?PassCollisions, " +
206 209 "?LinkNumber, ?MediaURL, ?KeyframeMotion, " +
210 "?PhysicsShapeType, ?Density, ?GravityModifier, " +
211 "?Friction, ?Restitution)";
212
207 FillPrimCommand(cmd, prim, obj.UUID, regionUUID); 213 FillPrimCommand(cmd, prim, obj.UUID, regionUUID);
208 214
209 ExecuteNonQuery(cmd); 215 ExecuteNonQuery(cmd);
210 216
211 cmd.Parameters.Clear(); 217 cmd.Parameters.Clear();
212 218
213 cmd.CommandText = "replace into primshapes (" + 219 cmd.CommandText = "replace into primshapes (" +
214 "UUID, Shape, ScaleX, ScaleY, " + 220 "UUID, Shape, ScaleX, ScaleY, " +
215 "ScaleZ, PCode, PathBegin, PathEnd, " + 221 "ScaleZ, PCode, PathBegin, PathEnd, " +
@@ -231,9 +237,9 @@ namespace OpenSim.Data.MySQL
231 "?ProfileEnd, ?ProfileCurve, " + 237 "?ProfileEnd, ?ProfileCurve, " +
232 "?ProfileHollow, ?Texture, ?ExtraParams, " + 238 "?ProfileHollow, ?Texture, ?ExtraParams, " +
233 "?State, ?Media)"; 239 "?State, ?Media)";
234 240
235 FillShapeCommand(cmd, prim); 241 FillShapeCommand(cmd, prim);
236 242
237 ExecuteNonQuery(cmd); 243 ExecuteNonQuery(cmd);
238 } 244 }
239 } 245 }
@@ -241,7 +247,7 @@ namespace OpenSim.Data.MySQL
241 } 247 }
242 } 248 }
243 249
244 public void RemoveObject(UUID obj, UUID regionUUID) 250 public virtual void RemoveObject(UUID obj, UUID regionUUID)
245 { 251 {
246// m_log.DebugFormat("[REGION DB]: Deleting scene object {0} from {1} in database", obj, regionUUID); 252// m_log.DebugFormat("[REGION DB]: Deleting scene object {0} from {1} in database", obj, regionUUID);
247 253
@@ -390,7 +396,7 @@ namespace OpenSim.Data.MySQL
390 } 396 }
391 } 397 }
392 398
393 public List<SceneObjectGroup> LoadObjects(UUID regionID) 399 public virtual List<SceneObjectGroup> LoadObjects(UUID regionID)
394 { 400 {
395 const int ROWS_PER_QUERY = 5000; 401 const int ROWS_PER_QUERY = 5000;
396 402
@@ -446,7 +452,11 @@ namespace OpenSim.Data.MySQL
446 foreach (SceneObjectPart prim in prims.Values) 452 foreach (SceneObjectPart prim in prims.Values)
447 { 453 {
448 if (prim.ParentUUID == UUID.Zero) 454 if (prim.ParentUUID == UUID.Zero)
455 {
449 objects[prim.UUID] = new SceneObjectGroup(prim); 456 objects[prim.UUID] = new SceneObjectGroup(prim);
457 if (prim.KeyframeMotion != null)
458 prim.KeyframeMotion.UpdateSceneObject(objects[prim.UUID]);
459 }
450 } 460 }
451 461
452 // Add all of the children objects to the SOGs 462 // Add all of the children objects to the SOGs
@@ -559,36 +569,51 @@ namespace OpenSim.Data.MySQL
559 } 569 }
560 } 570 }
561 571
562 public void StoreTerrain(double[,] ter, UUID regionID) 572 public virtual void StoreTerrain(double[,] ter, UUID regionID)
563 { 573 {
564 m_log.Info("[REGION DB]: Storing terrain"); 574 Util.FireAndForget(delegate(object x)
565
566 lock (m_dbLock)
567 { 575 {
568 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 576 double[,] oldTerrain = LoadTerrain(regionID);
569 {
570 dbcon.Open();
571 577
572 using (MySqlCommand cmd = dbcon.CreateCommand()) 578 m_log.Info("[REGION DB]: Storing terrain");
579
580 lock (m_dbLock)
581 {
582 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
573 { 583 {
574 cmd.CommandText = "delete from terrain where RegionUUID = ?RegionUUID"; 584 dbcon.Open();
575 cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
576 585
577 ExecuteNonQuery(cmd); 586 using (MySqlCommand cmd = dbcon.CreateCommand())
587 {
588 cmd.CommandText = "delete from terrain where RegionUUID = ?RegionUUID";
589 cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
578 590
579 cmd.CommandText = "insert into terrain (RegionUUID, " + 591 using (MySqlCommand cmd2 = dbcon.CreateCommand())
580 "Revision, Heightfield) values (?RegionUUID, " + 592 {
581 "1, ?Heightfield)"; 593 try
594 {
595 cmd2.CommandText = "insert into terrain (RegionUUID, " +
596 "Revision, Heightfield) values (?RegionUUID, " +
597 "1, ?Heightfield)";
582 598
583 cmd.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter)); 599 cmd2.Parameters.AddWithValue("RegionUUID", regionID.ToString());
600 cmd2.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter, oldTerrain));
584 601
585 ExecuteNonQuery(cmd); 602 ExecuteNonQuery(cmd);
603 ExecuteNonQuery(cmd2);
604 }
605 catch (Exception e)
606 {
607 m_log.ErrorFormat(e.ToString());
608 }
609 }
610 }
586 } 611 }
587 } 612 }
588 } 613 });
589 } 614 }
590 615
591 public double[,] LoadTerrain(UUID regionID) 616 public virtual double[,] LoadTerrain(UUID regionID)
592 { 617 {
593 double[,] terrain = null; 618 double[,] terrain = null;
594 619
@@ -638,7 +663,7 @@ namespace OpenSim.Data.MySQL
638 return terrain; 663 return terrain;
639 } 664 }
640 665
641 public void RemoveLandObject(UUID globalID) 666 public virtual void RemoveLandObject(UUID globalID)
642 { 667 {
643 lock (m_dbLock) 668 lock (m_dbLock)
644 { 669 {
@@ -657,7 +682,7 @@ namespace OpenSim.Data.MySQL
657 } 682 }
658 } 683 }
659 684
660 public void StoreLandObject(ILandObject parcel) 685 public virtual void StoreLandObject(ILandObject parcel)
661 { 686 {
662 lock (m_dbLock) 687 lock (m_dbLock)
663 { 688 {
@@ -714,7 +739,7 @@ namespace OpenSim.Data.MySQL
714 } 739 }
715 } 740 }
716 741
717 public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID) 742 public virtual RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
718 { 743 {
719 RegionLightShareData nWP = new RegionLightShareData(); 744 RegionLightShareData nWP = new RegionLightShareData();
720 nWP.OnSave += StoreRegionWindlightSettings; 745 nWP.OnSave += StoreRegionWindlightSettings;
@@ -736,7 +761,7 @@ namespace OpenSim.Data.MySQL
736 { 761 {
737 //No result, so store our default windlight profile and return it 762 //No result, so store our default windlight profile and return it
738 nWP.regionID = regionUUID; 763 nWP.regionID = regionUUID;
739 StoreRegionWindlightSettings(nWP); 764 // StoreRegionWindlightSettings(nWP);
740 return nWP; 765 return nWP;
741 } 766 }
742 else 767 else
@@ -811,7 +836,7 @@ namespace OpenSim.Data.MySQL
811 return nWP; 836 return nWP;
812 } 837 }
813 838
814 public RegionSettings LoadRegionSettings(UUID regionUUID) 839 public virtual RegionSettings LoadRegionSettings(UUID regionUUID)
815 { 840 {
816 RegionSettings rs = null; 841 RegionSettings rs = null;
817 842
@@ -851,7 +876,7 @@ namespace OpenSim.Data.MySQL
851 return rs; 876 return rs;
852 } 877 }
853 878
854 public void StoreRegionWindlightSettings(RegionLightShareData wl) 879 public virtual void StoreRegionWindlightSettings(RegionLightShareData wl)
855 { 880 {
856 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 881 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
857 { 882 {
@@ -954,7 +979,7 @@ namespace OpenSim.Data.MySQL
954 } 979 }
955 } 980 }
956 981
957 public void RemoveRegionWindlightSettings(UUID regionID) 982 public virtual void RemoveRegionWindlightSettings(UUID regionID)
958 { 983 {
959 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 984 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
960 { 985 {
@@ -1031,7 +1056,7 @@ namespace OpenSim.Data.MySQL
1031 } 1056 }
1032 #endregion 1057 #endregion
1033 1058
1034 public void StoreRegionSettings(RegionSettings rs) 1059 public virtual void StoreRegionSettings(RegionSettings rs)
1035 { 1060 {
1036 lock (m_dbLock) 1061 lock (m_dbLock)
1037 { 1062 {
@@ -1058,7 +1083,7 @@ namespace OpenSim.Data.MySQL
1058 "use_estate_sun, fixed_sun, sun_position, " + 1083 "use_estate_sun, fixed_sun, sun_position, " +
1059 "covenant, covenant_datetime, Sandbox, sunvectorx, sunvectory, " + 1084 "covenant, covenant_datetime, Sandbox, sunvectorx, sunvectory, " +
1060 "sunvectorz, loaded_creation_datetime, " + 1085 "sunvectorz, loaded_creation_datetime, " +
1061 "loaded_creation_id, map_tile_ID, " + 1086 "loaded_creation_id, map_tile_ID, block_search, casino, " +
1062 "TelehubObject, parcel_tile_ID) " + 1087 "TelehubObject, parcel_tile_ID) " +
1063 "values (?RegionUUID, ?BlockTerraform, " + 1088 "values (?RegionUUID, ?BlockTerraform, " +
1064 "?BlockFly, ?AllowDamage, ?RestrictPushing, " + 1089 "?BlockFly, ?AllowDamage, ?RestrictPushing, " +
@@ -1075,7 +1100,8 @@ namespace OpenSim.Data.MySQL
1075 "?SunPosition, ?Covenant, ?CovenantChangedDateTime, ?Sandbox, " + 1100 "?SunPosition, ?Covenant, ?CovenantChangedDateTime, ?Sandbox, " +
1076 "?SunVectorX, ?SunVectorY, ?SunVectorZ, " + 1101 "?SunVectorX, ?SunVectorY, ?SunVectorZ, " +
1077 "?LoadedCreationDateTime, ?LoadedCreationID, " + 1102 "?LoadedCreationDateTime, ?LoadedCreationID, " +
1078 "?TerrainImageID, ?TelehubObject, ?ParcelImageID) "; 1103 "?TerrainImageID, ?block_search, ?casino, " +
1104 "?TelehubObject, ?ParcelImageID)";
1079 1105
1080 FillRegionSettingsCommand(cmd, rs); 1106 FillRegionSettingsCommand(cmd, rs);
1081 1107
@@ -1086,7 +1112,7 @@ namespace OpenSim.Data.MySQL
1086 SaveSpawnPoints(rs); 1112 SaveSpawnPoints(rs);
1087 } 1113 }
1088 1114
1089 public List<LandData> LoadLandObjects(UUID regionUUID) 1115 public virtual List<LandData> LoadLandObjects(UUID regionUUID)
1090 { 1116 {
1091 List<LandData> landData = new List<LandData>(); 1117 List<LandData> landData = new List<LandData>();
1092 1118
@@ -1268,11 +1294,31 @@ namespace OpenSim.Data.MySQL
1268 prim.CollisionSoundVolume = (float)(double)row["CollisionSoundVolume"]; 1294 prim.CollisionSoundVolume = (float)(double)row["CollisionSoundVolume"];
1269 1295
1270 prim.PassTouches = ((sbyte)row["PassTouches"] != 0); 1296 prim.PassTouches = ((sbyte)row["PassTouches"] != 0);
1297 prim.PassCollisions = ((sbyte)row["PassCollisions"] != 0);
1271 prim.LinkNum = (int)row["LinkNumber"]; 1298 prim.LinkNum = (int)row["LinkNumber"];
1272 1299
1273 if (!(row["MediaURL"] is System.DBNull)) 1300 if (!(row["MediaURL"] is System.DBNull))
1274 prim.MediaUrl = (string)row["MediaURL"]; 1301 prim.MediaUrl = (string)row["MediaURL"];
1275 1302
1303 if (!(row["KeyframeMotion"] is DBNull))
1304 {
1305 Byte[] data = (byte[])row["KeyframeMotion"];
1306 if (data.Length > 0)
1307 prim.KeyframeMotion = KeyframeMotion.FromData(null, data);
1308 else
1309 prim.KeyframeMotion = null;
1310 }
1311 else
1312 {
1313 prim.KeyframeMotion = null;
1314 }
1315
1316 prim.PhysicsShapeType = (byte)Convert.ToInt32(row["PhysicsShapeType"].ToString());
1317 prim.Density = (float)(double)row["Density"];
1318 prim.GravityModifier = (float)(double)row["GravityModifier"];
1319 prim.Friction = (float)(double)row["Friction"];
1320 prim.Bounciness = (float)(double)row["Restitution"];
1321
1276 return prim; 1322 return prim;
1277 } 1323 }
1278 1324
@@ -1366,6 +1412,9 @@ namespace OpenSim.Data.MySQL
1366 newSettings.ParcelImageID = DBGuid.FromDB(row["parcel_tile_ID"]); 1412 newSettings.ParcelImageID = DBGuid.FromDB(row["parcel_tile_ID"]);
1367 newSettings.TelehubObject = DBGuid.FromDB(row["TelehubObject"]); 1413 newSettings.TelehubObject = DBGuid.FromDB(row["TelehubObject"]);
1368 1414
1415 newSettings.GodBlockSearch = Convert.ToBoolean(row["block_search"]);
1416 newSettings.Casino = Convert.ToBoolean(row["casino"]);
1417
1369 return newSettings; 1418 return newSettings;
1370 } 1419 }
1371 1420
@@ -1463,7 +1512,7 @@ namespace OpenSim.Data.MySQL
1463 /// </summary> 1512 /// </summary>
1464 /// <param name="val"></param> 1513 /// <param name="val"></param>
1465 /// <returns></returns> 1514 /// <returns></returns>
1466 private static Array SerializeTerrain(double[,] val) 1515 private static Array SerializeTerrain(double[,] val, double[,] oldTerrain)
1467 { 1516 {
1468 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double)); 1517 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double));
1469 BinaryWriter bw = new BinaryWriter(str); 1518 BinaryWriter bw = new BinaryWriter(str);
@@ -1472,7 +1521,11 @@ namespace OpenSim.Data.MySQL
1472 for (int x = 0; x < (int)Constants.RegionSize; x++) 1521 for (int x = 0; x < (int)Constants.RegionSize; x++)
1473 for (int y = 0; y < (int)Constants.RegionSize; y++) 1522 for (int y = 0; y < (int)Constants.RegionSize; y++)
1474 { 1523 {
1475 double height = val[x, y]; 1524 double height = 20.0;
1525 if (oldTerrain != null)
1526 height = oldTerrain[x, y];
1527 if (!double.IsNaN(val[x, y]))
1528 height = val[x, y];
1476 if (height == 0.0) 1529 if (height == 0.0)
1477 height = double.Epsilon; 1530 height = double.Epsilon;
1478 1531
@@ -1616,8 +1669,24 @@ namespace OpenSim.Data.MySQL
1616 else 1669 else
1617 cmd.Parameters.AddWithValue("PassTouches", 0); 1670 cmd.Parameters.AddWithValue("PassTouches", 0);
1618 1671
1672 if (prim.PassCollisions)
1673 cmd.Parameters.AddWithValue("PassCollisions", 1);
1674 else
1675 cmd.Parameters.AddWithValue("PassCollisions", 0);
1676
1619 cmd.Parameters.AddWithValue("LinkNumber", prim.LinkNum); 1677 cmd.Parameters.AddWithValue("LinkNumber", prim.LinkNum);
1620 cmd.Parameters.AddWithValue("MediaURL", prim.MediaUrl); 1678 cmd.Parameters.AddWithValue("MediaURL", prim.MediaUrl);
1679
1680 if (prim.KeyframeMotion != null)
1681 cmd.Parameters.AddWithValue("KeyframeMotion", prim.KeyframeMotion.Serialize());
1682 else
1683 cmd.Parameters.AddWithValue("KeyframeMotion", new Byte[0]);
1684
1685 cmd.Parameters.AddWithValue("PhysicsShapeType", prim.PhysicsShapeType);
1686 cmd.Parameters.AddWithValue("Density", (double)prim.Density);
1687 cmd.Parameters.AddWithValue("GravityModifier", (double)prim.GravityModifier);
1688 cmd.Parameters.AddWithValue("Friction", (double)prim.Friction);
1689 cmd.Parameters.AddWithValue("Restitution", (double)prim.Bounciness);
1621 } 1690 }
1622 1691
1623 /// <summary> 1692 /// <summary>
@@ -1696,6 +1765,9 @@ namespace OpenSim.Data.MySQL
1696 cmd.Parameters.AddWithValue("LoadedCreationDateTime", settings.LoadedCreationDateTime); 1765 cmd.Parameters.AddWithValue("LoadedCreationDateTime", settings.LoadedCreationDateTime);
1697 cmd.Parameters.AddWithValue("LoadedCreationID", settings.LoadedCreationID); 1766 cmd.Parameters.AddWithValue("LoadedCreationID", settings.LoadedCreationID);
1698 cmd.Parameters.AddWithValue("TerrainImageID", settings.TerrainImageID); 1767 cmd.Parameters.AddWithValue("TerrainImageID", settings.TerrainImageID);
1768 cmd.Parameters.AddWithValue("block_search", settings.GodBlockSearch);
1769 cmd.Parameters.AddWithValue("casino", settings.Casino);
1770
1699 cmd.Parameters.AddWithValue("ParcelImageID", settings.ParcelImageID); 1771 cmd.Parameters.AddWithValue("ParcelImageID", settings.ParcelImageID);
1700 cmd.Parameters.AddWithValue("TelehubObject", settings.TelehubObject); 1772 cmd.Parameters.AddWithValue("TelehubObject", settings.TelehubObject);
1701 } 1773 }
@@ -1856,7 +1928,7 @@ namespace OpenSim.Data.MySQL
1856 cmd.Parameters.AddWithValue("Media", null == s.Media ? null : s.Media.ToXml()); 1928 cmd.Parameters.AddWithValue("Media", null == s.Media ? null : s.Media.ToXml());
1857 } 1929 }
1858 1930
1859 public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items) 1931 public virtual void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items)
1860 { 1932 {
1861 lock (m_dbLock) 1933 lock (m_dbLock)
1862 { 1934 {