diff options
-rw-r--r-- | OpenSim/Data/SQLite/Resources/011_RegionStore.sql | 28 | ||||
-rw-r--r-- | OpenSim/Data/SQLite/SQLiteRegionData.cs | 152 | ||||
-rw-r--r-- | OpenSim/Data/Tests/BasicRegionTest.cs | 11 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 12 |
4 files changed, 201 insertions, 2 deletions
diff --git a/OpenSim/Data/SQLite/Resources/011_RegionStore.sql b/OpenSim/Data/SQLite/Resources/011_RegionStore.sql new file mode 100644 index 0000000..42bef89 --- /dev/null +++ b/OpenSim/Data/SQLite/Resources/011_RegionStore.sql | |||
@@ -0,0 +1,28 @@ | |||
1 | BEGIN; | ||
2 | |||
3 | ALTER TABLE prims ADD COLUMN PayPrice INTEGER NOT NULL default 0; | ||
4 | ALTER TABLE prims ADD COLUMN PayButton1 INTEGER NOT NULL default 0; | ||
5 | ALTER TABLE prims ADD COLUMN PayButton2 INTEGER NOT NULL default 0; | ||
6 | ALTER TABLE prims ADD COLUMN PayButton3 INTEGER NOT NULL default 0; | ||
7 | ALTER TABLE prims ADD COLUMN PayButton4 INTEGER NOT NULL default 0; | ||
8 | ALTER TABLE prims ADD COLUMN LoopedSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; | ||
9 | ALTER TABLE prims ADD COLUMN LoopedSoundGain float NOT NULL default 0; | ||
10 | ALTER TABLE prims ADD COLUMN TextureAnimation string; | ||
11 | ALTER TABLE prims ADD COLUMN ParticleSystem string; | ||
12 | ALTER TABLE prims ADD COLUMN OmegaX float NOT NULL default 0; | ||
13 | ALTER TABLE prims ADD COLUMN OmegaY float NOT NULL default 0; | ||
14 | ALTER TABLE prims ADD COLUMN OmegaZ float NOT NULL default 0; | ||
15 | ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float NOT NULL default 0; | ||
16 | ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float NOT NULL default 0; | ||
17 | ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float NOT NULL default 0; | ||
18 | ALTER TABLE prims ADD COLUMN CameraAtOffsetX float NOT NULL default 0; | ||
19 | ALTER TABLE prims ADD COLUMN CameraAtOffsetY float NOT NULL default 0; | ||
20 | ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float NOT NULL default 0; | ||
21 | ALTER TABLE prims ADD COLUMN ForceMouselook string NOT NULL default 0; | ||
22 | ALTER TABLE prims ADD COLUMN ScriptAccessPin INTEGER NOT NULL default 0; | ||
23 | ALTER TABLE prims ADD COLUMN AllowedDrop INTEGER NOT NULL default 0; | ||
24 | ALTER TABLE prims ADD COLUMN DieAtEdge string NOT NULL default 0; | ||
25 | ALTER TABLE prims ADD COLUMN SalePrice INTEGER NOT NULL default 0; | ||
26 | ALTER TABLE prims ADD COLUMN SaleType string NOT NULL default 0; | ||
27 | |||
28 | COMMIT; \ No newline at end of file | ||
diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs index fef5e3b..36b3d2f 100644 --- a/OpenSim/Data/SQLite/SQLiteRegionData.cs +++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs | |||
@@ -774,6 +774,39 @@ namespace OpenSim.Data.SQLite | |||
774 | createCol(prims, "SitTargetOrientY", typeof (Double)); | 774 | createCol(prims, "SitTargetOrientY", typeof (Double)); |
775 | createCol(prims, "SitTargetOrientZ", typeof (Double)); | 775 | createCol(prims, "SitTargetOrientZ", typeof (Double)); |
776 | 776 | ||
777 | createCol(prims, "PayPrice", typeof(Int32)); | ||
778 | createCol(prims, "PayButton1", typeof(Int32)); | ||
779 | createCol(prims, "PayButton2", typeof(Int32)); | ||
780 | createCol(prims, "PayButton3", typeof(Int32)); | ||
781 | createCol(prims, "PayButton4", typeof(Int32)); | ||
782 | |||
783 | createCol(prims, "LoopedSound", typeof(String)); | ||
784 | createCol(prims, "LoopedSoundGain", typeof(Double)); | ||
785 | createCol(prims, "TextureAnimation", typeof(String)); | ||
786 | createCol(prims, "ParticleSystem", typeof(String)); | ||
787 | |||
788 | createCol(prims, "OmegaX", typeof(Double)); | ||
789 | createCol(prims, "OmegaY", typeof(Double)); | ||
790 | createCol(prims, "OmegaZ", typeof(Double)); | ||
791 | |||
792 | createCol(prims, "CameraEyeOffsetX", typeof(Double)); | ||
793 | createCol(prims, "CameraEyeOffsetY", typeof(Double)); | ||
794 | createCol(prims, "CameraEyeOffsetZ", typeof(Double)); | ||
795 | |||
796 | createCol(prims, "CameraAtOffsetX", typeof(Double)); | ||
797 | createCol(prims, "CameraAtOffsetY", typeof(Double)); | ||
798 | createCol(prims, "CameraAtOffsetZ", typeof(Double)); | ||
799 | |||
800 | createCol(prims, "ForceMouselook", typeof(Int16)); | ||
801 | |||
802 | createCol(prims, "ScriptAccessPin", typeof(Int32)); | ||
803 | |||
804 | createCol(prims, "AllowedDrop", typeof(Int16)); | ||
805 | createCol(prims, "DieAtEdge", typeof(Int16)); | ||
806 | |||
807 | createCol(prims, "SalePrice", typeof(Int32)); | ||
808 | createCol(prims, "SaleType", typeof(Int16)); | ||
809 | |||
777 | // click action | 810 | // click action |
778 | createCol(prims, "ClickAction", typeof (Byte)); | 811 | createCol(prims, "ClickAction", typeof (Byte)); |
779 | 812 | ||
@@ -984,9 +1017,29 @@ namespace OpenSim.Data.SQLite | |||
984 | /// <returns></returns> | 1017 | /// <returns></returns> |
985 | private SceneObjectPart buildPrim(DataRow row) | 1018 | private SceneObjectPart buildPrim(DataRow row) |
986 | { | 1019 | { |
1020 | // Code commented. Uncomment to test the unit test inline. | ||
1021 | |||
1022 | // The unit test mentions this commented code for the purposes | ||
1023 | // of debugging a unit test failure | ||
1024 | |||
1025 | // SceneObjectGroup sog = new SceneObjectGroup(); | ||
1026 | // SceneObjectPart sop = new SceneObjectPart(); | ||
1027 | // sop.LocalId = 1; | ||
1028 | // sop.Name = "object1"; | ||
1029 | // sop.Description = "object1"; | ||
1030 | // sop.Text = ""; | ||
1031 | // sop.SitName = ""; | ||
1032 | // sop.TouchName = ""; | ||
1033 | // sop.UUID = UUID.Random(); | ||
1034 | // sop.Shape = PrimitiveBaseShape.Default; | ||
1035 | // sog.AddPart(sop); | ||
1036 | // sog.RootPart = sop; | ||
1037 | // Add breakpoint in above line. Check sop fields. | ||
1038 | |||
987 | // TODO: this doesn't work yet because something more | 1039 | // TODO: this doesn't work yet because something more |
988 | // interesting has to be done to actually get these values | 1040 | // interesting has to be done to actually get these values |
989 | // back out. Not enough time to figure it out yet. | 1041 | // back out. Not enough time to figure it out yet. |
1042 | |||
990 | SceneObjectPart prim = new SceneObjectPart(); | 1043 | SceneObjectPart prim = new SceneObjectPart(); |
991 | prim.UUID = new UUID((String) row["UUID"]); | 1044 | prim.UUID = new UUID((String) row["UUID"]); |
992 | // explicit conversion of integers is required, which sort | 1045 | // explicit conversion of integers is required, which sort |
@@ -1093,6 +1146,52 @@ namespace OpenSim.Data.SQLite | |||
1093 | prim.Color = Color.FromArgb(Convert.ToInt32(row["ColorR"]), Convert.ToInt32(row["ColorB"]), Convert.ToInt32(row["ColorG"])); | 1146 | prim.Color = Color.FromArgb(Convert.ToInt32(row["ColorR"]), Convert.ToInt32(row["ColorB"]), Convert.ToInt32(row["ColorG"])); |
1094 | 1147 | ||
1095 | prim.ClickAction = Convert.ToByte(row["ClickAction"]); | 1148 | prim.ClickAction = Convert.ToByte(row["ClickAction"]); |
1149 | prim.PayPrice[0] = Convert.ToInt32(row["PayPrice"]); | ||
1150 | prim.PayPrice[1] = Convert.ToInt32(row["PayButton1"]); | ||
1151 | prim.PayPrice[2] = Convert.ToInt32(row["PayButton2"]); | ||
1152 | prim.PayPrice[3] = Convert.ToInt32(row["PayButton3"]); | ||
1153 | prim.PayPrice[4] = Convert.ToInt32(row["PayButton4"]); | ||
1154 | |||
1155 | prim.Sound = new UUID(row["LoopedSound"].ToString()); | ||
1156 | prim.SoundGain = Convert.ToSingle(row["LoopedSoundGain"]); | ||
1157 | prim.SoundFlags = 1; // If it's persisted at all, it's looped | ||
1158 | |||
1159 | if (!row.IsNull("TextureAnimation")) | ||
1160 | prim.TextureAnimation = Convert.FromBase64String(row["TextureAnimation"].ToString()); | ||
1161 | if (!row.IsNull("ParticleSystem")) | ||
1162 | prim.ParticleSystem = Convert.FromBase64String(row["ParticleSystem"].ToString()); | ||
1163 | |||
1164 | prim.RotationalVelocity = new Vector3( | ||
1165 | Convert.ToSingle(row["OmegaX"]), | ||
1166 | Convert.ToSingle(row["OmegaY"]), | ||
1167 | Convert.ToSingle(row["OmegaZ"]) | ||
1168 | ); | ||
1169 | |||
1170 | prim.SetCameraEyeOffset(new Vector3( | ||
1171 | Convert.ToSingle(row["CameraEyeOffsetX"]), | ||
1172 | Convert.ToSingle(row["CameraEyeOffsetY"]), | ||
1173 | Convert.ToSingle(row["CameraEyeOffsetZ"]) | ||
1174 | )); | ||
1175 | |||
1176 | prim.SetCameraAtOffset(new Vector3( | ||
1177 | Convert.ToSingle(row["CameraAtOffsetX"]), | ||
1178 | Convert.ToSingle(row["CameraAtOffsetY"]), | ||
1179 | Convert.ToSingle(row["CameraAtOffsetZ"]) | ||
1180 | )); | ||
1181 | |||
1182 | if (Convert.ToInt16(row["ForceMouselook"]) != 0) | ||
1183 | prim.SetForceMouselook(true); | ||
1184 | |||
1185 | prim.ScriptAccessPin = Convert.ToInt32(row["ScriptAccessPin"]); | ||
1186 | |||
1187 | if (Convert.ToInt16(row["AllowedDrop"]) != 0) | ||
1188 | prim.AllowedDrop = true; | ||
1189 | |||
1190 | if (Convert.ToInt16(row["DieAtEdge"]) != 0) | ||
1191 | prim.DIE_AT_EDGE = true; | ||
1192 | |||
1193 | prim.SalePrice = Convert.ToInt32(row["SalePrice"]); | ||
1194 | prim.ObjectSaleType = Convert.ToByte(row["SaleType"]); | ||
1096 | return prim; | 1195 | return prim; |
1097 | } | 1196 | } |
1098 | 1197 | ||
@@ -1383,6 +1482,59 @@ namespace OpenSim.Data.SQLite | |||
1383 | row["ColorG"] = Convert.ToInt32(prim.Color.G); | 1482 | row["ColorG"] = Convert.ToInt32(prim.Color.G); |
1384 | row["ColorB"] = Convert.ToInt32(prim.Color.B); | 1483 | row["ColorB"] = Convert.ToInt32(prim.Color.B); |
1385 | row["ColorA"] = Convert.ToInt32(prim.Color.A); | 1484 | row["ColorA"] = Convert.ToInt32(prim.Color.A); |
1485 | row["PayPrice"] = prim.PayPrice[0]; | ||
1486 | row["PayButton1"] = prim.PayPrice[1]; | ||
1487 | row["PayButton2"] = prim.PayPrice[2]; | ||
1488 | row["PayButton3"] = prim.PayPrice[3]; | ||
1489 | row["PayButton4"] = prim.PayPrice[4]; | ||
1490 | |||
1491 | |||
1492 | row["TextureAnimation"] = Convert.ToBase64String(prim.TextureAnimation); | ||
1493 | row["ParticleSystem"] = Convert.ToBase64String(prim.ParticleSystem); | ||
1494 | |||
1495 | row["OmegaX"] = prim.RotationalVelocity.X; | ||
1496 | row["OmegaY"] = prim.RotationalVelocity.Y; | ||
1497 | row["OmegaZ"] = prim.RotationalVelocity.Z; | ||
1498 | |||
1499 | row["CameraEyeOffsetX"] = prim.GetCameraEyeOffset().X; | ||
1500 | row["CameraEyeOffsetY"] = prim.GetCameraEyeOffset().Y; | ||
1501 | row["CameraEyeOffsetZ"] = prim.GetCameraEyeOffset().Z; | ||
1502 | |||
1503 | row["CameraAtOffsetX"] = prim.GetCameraAtOffset().X; | ||
1504 | row["CameraAtOffsetY"] = prim.GetCameraAtOffset().Y; | ||
1505 | row["CameraAtOffsetZ"] = prim.GetCameraAtOffset().Z; | ||
1506 | |||
1507 | |||
1508 | if ((prim.SoundFlags & 1) != 0) // Looped | ||
1509 | { | ||
1510 | row["LoopedSound"] = prim.Sound.ToString(); | ||
1511 | row["LoopedSoundGain"] = prim.SoundGain; | ||
1512 | } | ||
1513 | else | ||
1514 | { | ||
1515 | row["LoopedSound"] = UUID.Zero.ToString(); | ||
1516 | row["LoopedSoundGain"] = 0.0f; | ||
1517 | } | ||
1518 | |||
1519 | if (prim.GetForceMouselook()) | ||
1520 | row["ForceMouselook"] = 1; | ||
1521 | else | ||
1522 | row["ForceMouselook"] = 0; | ||
1523 | |||
1524 | row["ScriptAccessPin"] = prim.ScriptAccessPin; | ||
1525 | |||
1526 | if (prim.AllowedDrop) | ||
1527 | row["AllowedDrop"] = 1; | ||
1528 | else | ||
1529 | row["AllowedDrop"] = 0; | ||
1530 | |||
1531 | if (prim.DIE_AT_EDGE) | ||
1532 | row["DieAtEdge"] = 1; | ||
1533 | else | ||
1534 | row["DieAtEdge"] = 0; | ||
1535 | |||
1536 | row["SalePrice"] = prim.SalePrice; | ||
1537 | row["SaleType"] = Convert.ToInt16(prim.ObjectSaleType); | ||
1386 | 1538 | ||
1387 | // click action | 1539 | // click action |
1388 | row["ClickAction"] = prim.ClickAction; | 1540 | row["ClickAction"] = prim.ClickAction; |
diff --git a/OpenSim/Data/Tests/BasicRegionTest.cs b/OpenSim/Data/Tests/BasicRegionTest.cs index b5e9ed4..05e3827 100644 --- a/OpenSim/Data/Tests/BasicRegionTest.cs +++ b/OpenSim/Data/Tests/BasicRegionTest.cs | |||
@@ -205,6 +205,14 @@ namespace OpenSim.Data.Tests | |||
205 | // common failure case is people adding new fields that aren't | 205 | // common failure case is people adding new fields that aren't |
206 | // initialized, but have non-null db constraints. We should | 206 | // initialized, but have non-null db constraints. We should |
207 | // honestly be passing more and more null things in here. | 207 | // honestly be passing more and more null things in here. |
208 | // | ||
209 | // Please note that in Sqlite.BuildPrim there is a commented out inline version | ||
210 | // of this so you can debug and step through the build process and check the fields | ||
211 | // | ||
212 | // Real World Value: Tests for situation where extending a SceneObjectGroup/SceneObjectPart | ||
213 | // causes the application to crash at the database layer because of null values | ||
214 | // in NOT NULL fields | ||
215 | // | ||
208 | private SceneObjectGroup NewSOG(string name) | 216 | private SceneObjectGroup NewSOG(string name) |
209 | { | 217 | { |
210 | SceneObjectGroup sog = new SceneObjectGroup(); | 218 | SceneObjectGroup sog = new SceneObjectGroup(); |
@@ -218,7 +226,8 @@ namespace OpenSim.Data.Tests | |||
218 | sop.UUID = UUID.Random(); | 226 | sop.UUID = UUID.Random(); |
219 | sop.Shape = PrimitiveBaseShape.Default; | 227 | sop.Shape = PrimitiveBaseShape.Default; |
220 | sog.AddPart(sop); | 228 | sog.AddPart(sop); |
221 | sog.RootPart = sop; | 229 | sog.RootPart = sop; |
230 | |||
222 | return sog; | 231 | return sog; |
223 | } | 232 | } |
224 | 233 | ||
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 510f2fa..5c22367 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -211,6 +211,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
211 | { | 211 | { |
212 | // It's not necessary to persist this | 212 | // It's not necessary to persist this |
213 | m_TextureAnimation = new byte[0]; | 213 | m_TextureAnimation = new byte[0]; |
214 | m_particleSystem = new byte[0]; | ||
214 | } | 215 | } |
215 | 216 | ||
216 | public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, UUID ownerID, uint localID, | 217 | public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, UUID ownerID, uint localID, |
@@ -256,7 +257,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
256 | Velocity = new Vector3(0, 0, 0); | 257 | Velocity = new Vector3(0, 0, 0); |
257 | AngularVelocity = new Vector3(0, 0, 0); | 258 | AngularVelocity = new Vector3(0, 0, 0); |
258 | Acceleration = new Vector3(0, 0, 0); | 259 | Acceleration = new Vector3(0, 0, 0); |
260 | |||
261 | |||
262 | |||
259 | m_TextureAnimation = new byte[0]; | 263 | m_TextureAnimation = new byte[0]; |
264 | m_particleSystem = new byte[0]; | ||
265 | |||
266 | |||
260 | 267 | ||
261 | // Prims currently only contain a single folder (Contents). From looking at the Second Life protocol, | 268 | // Prims currently only contain a single folder (Contents). From looking at the Second Life protocol, |
262 | // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from | 269 | // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from |
@@ -304,6 +311,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
304 | RotationOffset = rotation; | 311 | RotationOffset = rotation; |
305 | ObjectFlags = flags; | 312 | ObjectFlags = flags; |
306 | 313 | ||
314 | m_TextureAnimation = new byte[0]; | ||
315 | m_particleSystem = new byte[0]; | ||
307 | // Since we don't store script state, this is only a 'temporary' objectflag now | 316 | // Since we don't store script state, this is only a 'temporary' objectflag now |
308 | // If the object is scripted, the script will get loaded and this will be set again | 317 | // If the object is scripted, the script will get loaded and this will be set again |
309 | ObjectFlags &= ~(uint)(PrimFlags.Scripted | PrimFlags.Touch); | 318 | ObjectFlags &= ~(uint)(PrimFlags.Scripted | PrimFlags.Touch); |
@@ -317,7 +326,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
317 | protected SceneObjectPart(SerializationInfo info, StreamingContext context) | 326 | protected SceneObjectPart(SerializationInfo info, StreamingContext context) |
318 | { | 327 | { |
319 | //System.Console.WriteLine("SceneObjectPart Deserialize BGN"); | 328 | //System.Console.WriteLine("SceneObjectPart Deserialize BGN"); |
320 | 329 | m_TextureAnimation = new byte[0]; | |
330 | m_particleSystem = new byte[0]; | ||
321 | if (info == null) | 331 | if (info == null) |
322 | { | 332 | { |
323 | throw new ArgumentNullException("info"); | 333 | throw new ArgumentNullException("info"); |