opensim – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 eva 1 /*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27  
28 using System;
29 using System.Collections.Generic;
30 using System.Data;
31 using System.Drawing;
32 using System.IO;
33 using System.Reflection;
34 using System.Threading;
35 using log4net;
36 using MySql.Data.MySqlClient;
37 using OpenMetaverse;
38 using OpenSim.Framework;
39 using OpenSim.Region.Framework.Interfaces;
40 using OpenSim.Region.Framework.Scenes;
41 using OpenSim.Data;
42  
43 namespace OpenSim.Data.MySQL
44 {
45 /// <summary>
46 /// A MySQL Interface for the Region Server
47 /// </summary>
48 public class MySQLSimulationData : ISimulationDataStore
49 {
50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51 private static string LogHeader = "[REGION DB MYSQL]";
52  
53 private string m_connectionString;
54 private object m_dbLock = new object();
55  
56 protected virtual Assembly Assembly
57 {
58 get { return GetType().Assembly; }
59 }
60  
61 public MySQLSimulationData()
62 {
63 }
64  
65 public MySQLSimulationData(string connectionString)
66 {
67 Initialise(connectionString);
68 }
69  
70 public void Initialise(string connectionString)
71 {
72 m_connectionString = connectionString;
73  
74 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
75 {
76 dbcon.Open();
77  
78 // Apply new Migrations
79 //
80 Migration m = new Migration(dbcon, Assembly, "RegionStore");
81 m.Update();
82 }
83 }
84  
85 private IDataReader ExecuteReader(MySqlCommand c)
86 {
87 IDataReader r = null;
88  
89 try
90 {
91 r = c.ExecuteReader();
92 }
93 catch (Exception e)
94 {
95 m_log.ErrorFormat("{0} MySQL error in ExecuteReader: {1}", LogHeader, e);
96 throw;
97 }
98  
99 return r;
100 }
101  
102 private void ExecuteNonQuery(MySqlCommand c)
103 {
104 try
105 {
106 c.ExecuteNonQuery();
107 }
108 catch (Exception e)
109 {
110 m_log.Error("[REGION DB]: MySQL error in ExecuteNonQuery: " + e.Message);
111 throw;
112 }
113 }
114  
115 public void Dispose() {}
116  
117 public void StoreObject(SceneObjectGroup obj, UUID regionUUID)
118 {
119 uint flags = obj.RootPart.GetEffectiveObjectFlags();
120  
121 // Eligibility check
122 //
123 // PrimFlags.Temporary is not used in OpenSim code and cannot
124 // be guaranteed to always be clear. Don't check it.
125 // if ((flags & (uint)PrimFlags.Temporary) != 0)
126 // return;
127 if ((flags & (uint)PrimFlags.TemporaryOnRez) != 0)
128 return;
129  
130 lock (m_dbLock)
131 {
132 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
133 {
134 dbcon.Open();
135  
136 using (MySqlCommand cmd = dbcon.CreateCommand())
137 {
138 foreach (SceneObjectPart prim in obj.Parts)
139 {
140 cmd.Parameters.Clear();
141  
142 cmd.CommandText = "replace into prims (" +
143 "UUID, CreationDate, " +
144 "Name, Text, Description, " +
145 "SitName, TouchName, ObjectFlags, " +
146 "OwnerMask, NextOwnerMask, GroupMask, " +
147 "EveryoneMask, BaseMask, PositionX, " +
148 "PositionY, PositionZ, GroupPositionX, " +
149 "GroupPositionY, GroupPositionZ, VelocityX, " +
150 "VelocityY, VelocityZ, AngularVelocityX, " +
151 "AngularVelocityY, AngularVelocityZ, " +
152 "AccelerationX, AccelerationY, " +
153 "AccelerationZ, RotationX, " +
154 "RotationY, RotationZ, " +
155 "RotationW, SitTargetOffsetX, " +
156 "SitTargetOffsetY, SitTargetOffsetZ, " +
157 "SitTargetOrientW, SitTargetOrientX, " +
158 "SitTargetOrientY, SitTargetOrientZ, " +
159 "RegionUUID, CreatorID, " +
160 "OwnerID, GroupID, " +
161 "LastOwnerID, SceneGroupID, " +
162 "PayPrice, PayButton1, " +
163 "PayButton2, PayButton3, " +
164 "PayButton4, LoopedSound, " +
165 "LoopedSoundGain, TextureAnimation, " +
166 "OmegaX, OmegaY, OmegaZ, " +
167 "CameraEyeOffsetX, CameraEyeOffsetY, " +
168 "CameraEyeOffsetZ, CameraAtOffsetX, " +
169 "CameraAtOffsetY, CameraAtOffsetZ, " +
170 "ForceMouselook, ScriptAccessPin, " +
171 "AllowedDrop, DieAtEdge, " +
172 "SalePrice, SaleType, " +
173 "ColorR, ColorG, ColorB, ColorA, " +
174 "ParticleSystem, ClickAction, Material, " +
175 "CollisionSound, CollisionSoundVolume, " +
176 "PassTouches, " +
177 "LinkNumber, MediaURL, AttachedPosX, " +
178 "AttachedPosY, AttachedPosZ, KeyframeMotion, " +
179 "PhysicsShapeType, Density, GravityModifier, " +
180 "Friction, Restitution, DynAttrs " +
181 ") values (" + "?UUID, " +
182 "?CreationDate, ?Name, ?Text, " +
183 "?Description, ?SitName, ?TouchName, " +
184 "?ObjectFlags, ?OwnerMask, ?NextOwnerMask, " +
185 "?GroupMask, ?EveryoneMask, ?BaseMask, " +
186 "?PositionX, ?PositionY, ?PositionZ, " +
187 "?GroupPositionX, ?GroupPositionY, " +
188 "?GroupPositionZ, ?VelocityX, " +
189 "?VelocityY, ?VelocityZ, ?AngularVelocityX, " +
190 "?AngularVelocityY, ?AngularVelocityZ, " +
191 "?AccelerationX, ?AccelerationY, " +
192 "?AccelerationZ, ?RotationX, " +
193 "?RotationY, ?RotationZ, " +
194 "?RotationW, ?SitTargetOffsetX, " +
195 "?SitTargetOffsetY, ?SitTargetOffsetZ, " +
196 "?SitTargetOrientW, ?SitTargetOrientX, " +
197 "?SitTargetOrientY, ?SitTargetOrientZ, " +
198 "?RegionUUID, ?CreatorID, ?OwnerID, " +
199 "?GroupID, ?LastOwnerID, ?SceneGroupID, " +
200 "?PayPrice, ?PayButton1, ?PayButton2, " +
201 "?PayButton3, ?PayButton4, ?LoopedSound, " +
202 "?LoopedSoundGain, ?TextureAnimation, " +
203 "?OmegaX, ?OmegaY, ?OmegaZ, " +
204 "?CameraEyeOffsetX, ?CameraEyeOffsetY, " +
205 "?CameraEyeOffsetZ, ?CameraAtOffsetX, " +
206 "?CameraAtOffsetY, ?CameraAtOffsetZ, " +
207 "?ForceMouselook, ?ScriptAccessPin, " +
208 "?AllowedDrop, ?DieAtEdge, ?SalePrice, " +
209 "?SaleType, ?ColorR, ?ColorG, " +
210 "?ColorB, ?ColorA, ?ParticleSystem, " +
211 "?ClickAction, ?Material, ?CollisionSound, " +
212 "?CollisionSoundVolume, ?PassTouches, " +
213 "?LinkNumber, ?MediaURL, ?AttachedPosX, " +
214 "?AttachedPosY, ?AttachedPosZ, ?KeyframeMotion, " +
215 "?PhysicsShapeType, ?Density, ?GravityModifier, " +
216 "?Friction, ?Restitution, ?DynAttrs)";
217  
218 FillPrimCommand(cmd, prim, obj.UUID, regionUUID);
219  
220 ExecuteNonQuery(cmd);
221  
222 cmd.Parameters.Clear();
223  
224 cmd.CommandText = "replace into primshapes (" +
225 "UUID, Shape, ScaleX, ScaleY, " +
226 "ScaleZ, PCode, PathBegin, PathEnd, " +
227 "PathScaleX, PathScaleY, PathShearX, " +
228 "PathShearY, PathSkew, PathCurve, " +
229 "PathRadiusOffset, PathRevolutions, " +
230 "PathTaperX, PathTaperY, PathTwist, " +
231 "PathTwistBegin, ProfileBegin, ProfileEnd, " +
232 "ProfileCurve, ProfileHollow, Texture, " +
233 "ExtraParams, State, LastAttachPoint, Media) " +
234 "values (?UUID, " +
235 "?Shape, ?ScaleX, ?ScaleY, ?ScaleZ, " +
236 "?PCode, ?PathBegin, ?PathEnd, " +
237 "?PathScaleX, ?PathScaleY, " +
238 "?PathShearX, ?PathShearY, " +
239 "?PathSkew, ?PathCurve, ?PathRadiusOffset, " +
240 "?PathRevolutions, ?PathTaperX, " +
241 "?PathTaperY, ?PathTwist, " +
242 "?PathTwistBegin, ?ProfileBegin, " +
243 "?ProfileEnd, ?ProfileCurve, " +
244 "?ProfileHollow, ?Texture, ?ExtraParams, " +
245 "?State, ?LastAttachPoint, ?Media)";
246  
247 FillShapeCommand(cmd, prim);
248  
249 ExecuteNonQuery(cmd);
250 }
251 }
252 }
253 }
254 }
255  
256 public void RemoveObject(UUID obj, UUID regionUUID)
257 {
258 // m_log.DebugFormat("[REGION DB]: Deleting scene object {0} from {1} in database", obj, regionUUID);
259  
260 List<UUID> uuids = new List<UUID>();
261  
262 // Formerly, this used to check the region UUID.
263 // That makes no sense, as we remove the contents of a prim
264 // unconditionally, but the prim dependent on the region ID.
265 // So, we would destroy an object and cause hard to detect
266 // issues if we delete the contents only. Deleting it all may
267 // cause the loss of a prim, but is cleaner.
268 // It's also faster because it uses the primary key.
269 //
270 lock (m_dbLock)
271 {
272 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
273 {
274 dbcon.Open();
275  
276 using (MySqlCommand cmd = dbcon.CreateCommand())
277 {
278 cmd.CommandText = "select UUID from prims where SceneGroupID= ?UUID";
279 cmd.Parameters.AddWithValue("UUID", obj.ToString());
280  
281 using (IDataReader reader = ExecuteReader(cmd))
282 {
283 while (reader.Read())
284 uuids.Add(DBGuid.FromDB(reader["UUID"].ToString()));
285 }
286  
287 // delete the main prims
288 cmd.CommandText = "delete from prims where SceneGroupID= ?UUID";
289 ExecuteNonQuery(cmd);
290 }
291 }
292 }
293  
294 // there is no way this should be < 1 unless there is
295 // a very corrupt database, but in that case be extra
296 // safe anyway.
297 if (uuids.Count > 0)
298 {
299 RemoveShapes(uuids);
300 RemoveItems(uuids);
301 }
302 }
303  
304 /// <summary>
305 /// Remove all persisted items of the given prim.
306 /// The caller must acquire the necessrary synchronization locks
307 /// </summary>
308 /// <param name="uuid">the Item UUID</param>
309 private void RemoveItems(UUID uuid)
310 {
311 lock (m_dbLock)
312 {
313 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
314 {
315 dbcon.Open();
316  
317 using (MySqlCommand cmd = dbcon.CreateCommand())
318 {
319 cmd.CommandText = "delete from primitems where PrimID = ?PrimID";
320 cmd.Parameters.AddWithValue("PrimID", uuid.ToString());
321  
322 ExecuteNonQuery(cmd);
323 }
324 }
325 }
326 }
327  
328 /// <summary>
329 /// Remove all persisted shapes for a list of prims
330 /// The caller must acquire the necessrary synchronization locks
331 /// </summary>
332 /// <param name="uuids">the list of UUIDs</param>
333 private void RemoveShapes(List<UUID> uuids)
334 {
335 lock (m_dbLock)
336 {
337 string sql = "delete from primshapes where ";
338 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
339 {
340 dbcon.Open();
341  
342 using (MySqlCommand cmd = dbcon.CreateCommand())
343 {
344 for (int i = 0; i < uuids.Count; i++)
345 {
346 if ((i + 1) == uuids.Count)
347 {// end of the list
348 sql += "(UUID = ?UUID" + i + ")";
349 }
350 else
351 {
352 sql += "(UUID = ?UUID" + i + ") or ";
353 }
354 }
355 cmd.CommandText = sql;
356  
357 for (int i = 0; i < uuids.Count; i++)
358 cmd.Parameters.AddWithValue("UUID" + i, uuids[i].ToString());
359  
360 ExecuteNonQuery(cmd);
361 }
362 }
363 }
364 }
365  
366 /// <summary>
367 /// Remove all persisted items for a list of prims
368 /// The caller must acquire the necessrary synchronization locks
369 /// </summary>
370 /// <param name="uuids">the list of UUIDs</param>
371 private void RemoveItems(List<UUID> uuids)
372 {
373 lock (m_dbLock)
374 {
375 string sql = "delete from primitems where ";
376 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
377 {
378 dbcon.Open();
379  
380 using (MySqlCommand cmd = dbcon.CreateCommand())
381 {
382 for (int i = 0; i < uuids.Count; i++)
383 {
384 if ((i + 1) == uuids.Count)
385 {
386 // end of the list
387 sql += "(PrimID = ?PrimID" + i + ")";
388 }
389 else
390 {
391 sql += "(PrimID = ?PrimID" + i + ") or ";
392 }
393 }
394 cmd.CommandText = sql;
395  
396 for (int i = 0; i < uuids.Count; i++)
397 cmd.Parameters.AddWithValue("PrimID" + i, uuids[i].ToString());
398  
399 ExecuteNonQuery(cmd);
400 }
401 }
402 }
403 }
404  
405 public List<SceneObjectGroup> LoadObjects(UUID regionID)
406 {
407 const int ROWS_PER_QUERY = 5000;
408  
409 Dictionary<UUID, SceneObjectPart> prims = new Dictionary<UUID, SceneObjectPart>(ROWS_PER_QUERY);
410 Dictionary<UUID, SceneObjectGroup> objects = new Dictionary<UUID, SceneObjectGroup>();
411 int count = 0;
412  
413 #region Prim Loading
414  
415 lock (m_dbLock)
416 {
417 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
418 {
419 dbcon.Open();
420  
421 using (MySqlCommand cmd = dbcon.CreateCommand())
422 {
423 cmd.CommandText =
424 "SELECT * FROM prims LEFT JOIN primshapes ON prims.UUID = primshapes.UUID WHERE RegionUUID = ?RegionUUID";
425 cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
426 cmd.CommandTimeout = 3600;
427  
428 using (IDataReader reader = ExecuteReader(cmd))
429 {
430 while (reader.Read())
431 {
432 SceneObjectPart prim = BuildPrim(reader);
433 if (reader["Shape"] is DBNull)
434 prim.Shape = PrimitiveBaseShape.Default;
435 else
436 prim.Shape = BuildShape(reader);
437  
438 UUID parentID = DBGuid.FromDB(reader["SceneGroupID"].ToString());
439 if (parentID != prim.UUID)
440 prim.ParentUUID = parentID;
441  
442 prims[prim.UUID] = prim;
443  
444 ++count;
445 if (count % ROWS_PER_QUERY == 0)
446 m_log.Debug("[REGION DB]: Loaded " + count + " prims...");
447 }
448 }
449 }
450 }
451 }
452  
453 #endregion Prim Loading
454  
455 #region SceneObjectGroup Creation
456  
457 // Create all of the SOGs from the root prims first
458 foreach (SceneObjectPart prim in prims.Values)
459 {
460 if (prim.ParentUUID == UUID.Zero)
461 {
462 objects[prim.UUID] = new SceneObjectGroup(prim);
463 }
464 }
465  
466 // Add all of the children objects to the SOGs
467 foreach (SceneObjectPart prim in prims.Values)
468 {
469 SceneObjectGroup sog;
470 if (prim.UUID != prim.ParentUUID)
471 {
472 if (objects.TryGetValue(prim.ParentUUID, out sog))
473 {
474 int originalLinkNum = prim.LinkNum;
475  
476 sog.AddPart(prim);
477  
478 // SceneObjectGroup.AddPart() tries to be smart and automatically set the LinkNum.
479 // We override that here
480 if (originalLinkNum != 0)
481 prim.LinkNum = originalLinkNum;
482 }
483 else
484 {
485 m_log.WarnFormat(
486 "[REGION DB]: Database contains an orphan child prim {0} {1} in region {2} pointing to missing parent {3}. This prim will not be loaded.",
487 prim.Name, prim.UUID, regionID, prim.ParentUUID);
488 }
489 }
490 }
491  
492 #endregion SceneObjectGroup Creation
493  
494 m_log.DebugFormat("[REGION DB]: Loaded {0} objects using {1} prims", objects.Count, prims.Count);
495  
496 #region Prim Inventory Loading
497  
498 // Instead of attempting to LoadItems on every prim,
499 // most of which probably have no items... get a
500 // list from DB of all prims which have items and
501 // LoadItems only on those
502 List<SceneObjectPart> primsWithInventory = new List<SceneObjectPart>();
503 lock (m_dbLock)
504 {
505 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
506 {
507 dbcon.Open();
508  
509 using (MySqlCommand itemCmd = dbcon.CreateCommand())
510 {
511 itemCmd.CommandText = "SELECT DISTINCT primID FROM primitems";
512 using (IDataReader itemReader = ExecuteReader(itemCmd))
513 {
514 while (itemReader.Read())
515 {
516 if (!(itemReader["primID"] is DBNull))
517 {
518 UUID primID = DBGuid.FromDB(itemReader["primID"].ToString());
519 if (prims.ContainsKey(primID))
520 primsWithInventory.Add(prims[primID]);
521 }
522 }
523 }
524 }
525 }
526 }
527  
528 foreach (SceneObjectPart prim in primsWithInventory)
529 {
530 LoadItems(prim);
531 }
532  
533 #endregion Prim Inventory Loading
534  
535 m_log.DebugFormat("[REGION DB]: Loaded inventory from {0} objects", primsWithInventory.Count);
536  
537 return new List<SceneObjectGroup>(objects.Values);
538 }
539  
540 /// <summary>
541 /// Load in a prim's persisted inventory.
542 /// </summary>
543 /// <param name="prim">The prim</param>
544 private void LoadItems(SceneObjectPart prim)
545 {
546 lock (m_dbLock)
547 {
548 List<TaskInventoryItem> inventory = new List<TaskInventoryItem>();
549  
550 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
551 {
552 dbcon.Open();
553  
554 using (MySqlCommand cmd = dbcon.CreateCommand())
555 {
556 cmd.CommandText = "select * from primitems where PrimID = ?PrimID";
557 cmd.Parameters.AddWithValue("PrimID", prim.UUID.ToString());
558  
559 using (IDataReader reader = ExecuteReader(cmd))
560 {
561 while (reader.Read())
562 {
563 TaskInventoryItem item = BuildItem(reader);
564  
565 item.ParentID = prim.UUID; // Values in database are often wrong
566 inventory.Add(item);
567 }
568 }
569 }
570 }
571  
572 prim.Inventory.RestoreInventoryItems(inventory);
573 }
574 }
575  
576 // Legacy entry point for when terrain was always a 256x256 hieghtmap
577 public void StoreTerrain(double[,] ter, UUID regionID)
578 {
579 StoreTerrain(new HeightmapTerrainData(ter), regionID);
580 }
581  
582 public void StoreTerrain(TerrainData terrData, UUID regionID)
583 {
584 lock (m_dbLock)
585 {
586 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
587 {
588 dbcon.Open();
589  
590 using (MySqlCommand cmd = dbcon.CreateCommand())
591 {
592 cmd.CommandText = "delete from terrain where RegionUUID = ?RegionUUID";
593 cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
594  
595 ExecuteNonQuery(cmd);
596  
597 int terrainDBRevision;
598 Array terrainDBblob;
599 terrData.GetDatabaseBlob(out terrainDBRevision, out terrainDBblob);
600  
601 m_log.InfoFormat("{0} Storing terrain. X={1}, Y={2}, rev={3}",
602 LogHeader, terrData.SizeX, terrData.SizeY, terrainDBRevision);
603  
604 cmd.CommandText = "insert into terrain (RegionUUID, Revision, Heightfield)"
605 + "values (?RegionUUID, ?Revision, ?Heightfield)";
606  
607 cmd.Parameters.AddWithValue("Revision", terrainDBRevision);
608 cmd.Parameters.AddWithValue("Heightfield", terrainDBblob);
609  
610 ExecuteNonQuery(cmd);
611 }
612 }
613 }
614 }
615  
616 // Legacy region loading
617 public double[,] LoadTerrain(UUID regionID)
618 {
619 double[,] ret = null;
620 TerrainData terrData = LoadTerrain(regionID, (int)Constants.RegionSize, (int)Constants.RegionSize, (int)Constants.RegionHeight);
621 if (terrData != null)
622 ret = terrData.GetDoubles();
623 return ret;
624 }
625  
626 // Returns 'null' if region not found
627 public TerrainData LoadTerrain(UUID regionID, int pSizeX, int pSizeY, int pSizeZ)
628 {
629 TerrainData terrData = null;
630  
631 lock (m_dbLock)
632 {
633 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
634 {
635 dbcon.Open();
636  
637 using (MySqlCommand cmd = dbcon.CreateCommand())
638 {
639 cmd.CommandText = "select RegionUUID, Revision, Heightfield " +
640 "from terrain where RegionUUID = ?RegionUUID " +
641 "order by Revision desc limit 1";
642 cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
643  
644 using (IDataReader reader = ExecuteReader(cmd))
645 {
646 while (reader.Read())
647 {
648 int rev = Convert.ToInt32(reader["Revision"]);
649 byte[] blob = (byte[])reader["Heightfield"];
650 terrData = TerrainData.CreateFromDatabaseBlobFactory(pSizeX, pSizeY, pSizeZ, rev, blob);
651 }
652 }
653 }
654 }
655 }
656  
657 return terrData;
658 }
659  
660 public void RemoveLandObject(UUID globalID)
661 {
662 lock (m_dbLock)
663 {
664 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
665 {
666 dbcon.Open();
667  
668 using (MySqlCommand cmd = dbcon.CreateCommand())
669 {
670 cmd.CommandText = "delete from land where UUID = ?UUID";
671 cmd.Parameters.AddWithValue("UUID", globalID.ToString());
672  
673 ExecuteNonQuery(cmd);
674 }
675 }
676 }
677 }
678  
679 public void StoreLandObject(ILandObject parcel)
680 {
681 lock (m_dbLock)
682 {
683 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
684 {
685 dbcon.Open();
686  
687 using (MySqlCommand cmd = dbcon.CreateCommand())
688 {
689 cmd.CommandText = "replace into land (UUID, RegionUUID, " +
690 "LocalLandID, Bitmap, Name, Description, " +
691 "OwnerUUID, IsGroupOwned, Area, AuctionID, " +
692 "Category, ClaimDate, ClaimPrice, GroupUUID, " +
693 "SalePrice, LandStatus, LandFlags, LandingType, " +
694 "MediaAutoScale, MediaTextureUUID, MediaURL, " +
695 "MusicURL, PassHours, PassPrice, SnapshotUUID, " +
696 "UserLocationX, UserLocationY, UserLocationZ, " +
697 "UserLookAtX, UserLookAtY, UserLookAtZ, " +
698 "AuthbuyerID, OtherCleanTime, MediaType, MediaDescription, " +
699 "MediaSize, MediaLoop, ObscureMusic, ObscureMedia) values (" +
700 "?UUID, ?RegionUUID, " +
701 "?LocalLandID, ?Bitmap, ?Name, ?Description, " +
702 "?OwnerUUID, ?IsGroupOwned, ?Area, ?AuctionID, " +
703 "?Category, ?ClaimDate, ?ClaimPrice, ?GroupUUID, " +
704 "?SalePrice, ?LandStatus, ?LandFlags, ?LandingType, " +
705 "?MediaAutoScale, ?MediaTextureUUID, ?MediaURL, " +
706 "?MusicURL, ?PassHours, ?PassPrice, ?SnapshotUUID, " +
707 "?UserLocationX, ?UserLocationY, ?UserLocationZ, " +
708 "?UserLookAtX, ?UserLookAtY, ?UserLookAtZ, " +
709 "?AuthbuyerID, ?OtherCleanTime, ?MediaType, ?MediaDescription, "+
710 "CONCAT(?MediaWidth, ',', ?MediaHeight), ?MediaLoop, ?ObscureMusic, ?ObscureMedia)";
711  
712 FillLandCommand(cmd, parcel.LandData, parcel.RegionUUID);
713  
714 ExecuteNonQuery(cmd);
715  
716 cmd.CommandText = "delete from landaccesslist where LandUUID = ?UUID";
717  
718 ExecuteNonQuery(cmd);
719  
720 cmd.Parameters.Clear();
721 cmd.CommandText = "insert into landaccesslist (LandUUID, " +
722 "AccessUUID, Flags, Expires) values (?LandUUID, ?AccessUUID, " +
723 "?Flags, ?Expires)";
724  
725 foreach (LandAccessEntry entry in parcel.LandData.ParcelAccessList)
726 {
727 FillLandAccessCommand(cmd, entry, parcel.LandData.GlobalID);
728 ExecuteNonQuery(cmd);
729 cmd.Parameters.Clear();
730 }
731 }
732 }
733 }
734 }
735  
736 public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
737 {
738 RegionLightShareData nWP = new RegionLightShareData();
739 nWP.OnSave += StoreRegionWindlightSettings;
740  
741 lock (m_dbLock)
742 {
743 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
744 {
745 dbcon.Open();
746  
747 string command = "select * from `regionwindlight` where region_id = ?regionID";
748  
749 using (MySqlCommand cmd = new MySqlCommand(command))
750 {
751 cmd.Connection = dbcon;
752  
753 cmd.Parameters.AddWithValue("?regionID", regionUUID.ToString());
754  
755 IDataReader result = ExecuteReader(cmd);
756 if (!result.Read())
757 {
758 //No result, so store our default windlight profile and return it
759 nWP.regionID = regionUUID;
760 // StoreRegionWindlightSettings(nWP);
761 return nWP;
762 }
763 else
764 {
765 nWP.regionID = DBGuid.FromDB(result["region_id"]);
766 nWP.waterColor.X = Convert.ToSingle(result["water_color_r"]);
767 nWP.waterColor.Y = Convert.ToSingle(result["water_color_g"]);
768 nWP.waterColor.Z = Convert.ToSingle(result["water_color_b"]);
769 nWP.waterFogDensityExponent = Convert.ToSingle(result["water_fog_density_exponent"]);
770 nWP.underwaterFogModifier = Convert.ToSingle(result["underwater_fog_modifier"]);
771 nWP.reflectionWaveletScale.X = Convert.ToSingle(result["reflection_wavelet_scale_1"]);
772 nWP.reflectionWaveletScale.Y = Convert.ToSingle(result["reflection_wavelet_scale_2"]);
773 nWP.reflectionWaveletScale.Z = Convert.ToSingle(result["reflection_wavelet_scale_3"]);
774 nWP.fresnelScale = Convert.ToSingle(result["fresnel_scale"]);
775 nWP.fresnelOffset = Convert.ToSingle(result["fresnel_offset"]);
776 nWP.refractScaleAbove = Convert.ToSingle(result["refract_scale_above"]);
777 nWP.refractScaleBelow = Convert.ToSingle(result["refract_scale_below"]);
778 nWP.blurMultiplier = Convert.ToSingle(result["blur_multiplier"]);
779 nWP.bigWaveDirection.X = Convert.ToSingle(result["big_wave_direction_x"]);
780 nWP.bigWaveDirection.Y = Convert.ToSingle(result["big_wave_direction_y"]);
781 nWP.littleWaveDirection.X = Convert.ToSingle(result["little_wave_direction_x"]);
782 nWP.littleWaveDirection.Y = Convert.ToSingle(result["little_wave_direction_y"]);
783 UUID.TryParse(result["normal_map_texture"].ToString(), out nWP.normalMapTexture);
784 nWP.horizon.X = Convert.ToSingle(result["horizon_r"]);
785 nWP.horizon.Y = Convert.ToSingle(result["horizon_g"]);
786 nWP.horizon.Z = Convert.ToSingle(result["horizon_b"]);
787 nWP.horizon.W = Convert.ToSingle(result["horizon_i"]);
788 nWP.hazeHorizon = Convert.ToSingle(result["haze_horizon"]);
789 nWP.blueDensity.X = Convert.ToSingle(result["blue_density_r"]);
790 nWP.blueDensity.Y = Convert.ToSingle(result["blue_density_g"]);
791 nWP.blueDensity.Z = Convert.ToSingle(result["blue_density_b"]);
792 nWP.blueDensity.W = Convert.ToSingle(result["blue_density_i"]);
793 nWP.hazeDensity = Convert.ToSingle(result["haze_density"]);
794 nWP.densityMultiplier = Convert.ToSingle(result["density_multiplier"]);
795 nWP.distanceMultiplier = Convert.ToSingle(result["distance_multiplier"]);
796 nWP.maxAltitude = Convert.ToUInt16(result["max_altitude"]);
797 nWP.sunMoonColor.X = Convert.ToSingle(result["sun_moon_color_r"]);
798 nWP.sunMoonColor.Y = Convert.ToSingle(result["sun_moon_color_g"]);
799 nWP.sunMoonColor.Z = Convert.ToSingle(result["sun_moon_color_b"]);
800 nWP.sunMoonColor.W = Convert.ToSingle(result["sun_moon_color_i"]);
801 nWP.sunMoonPosition = Convert.ToSingle(result["sun_moon_position"]);
802 nWP.ambient.X = Convert.ToSingle(result["ambient_r"]);
803 nWP.ambient.Y = Convert.ToSingle(result["ambient_g"]);
804 nWP.ambient.Z = Convert.ToSingle(result["ambient_b"]);
805 nWP.ambient.W = Convert.ToSingle(result["ambient_i"]);
806 nWP.eastAngle = Convert.ToSingle(result["east_angle"]);
807 nWP.sunGlowFocus = Convert.ToSingle(result["sun_glow_focus"]);
808 nWP.sunGlowSize = Convert.ToSingle(result["sun_glow_size"]);
809 nWP.sceneGamma = Convert.ToSingle(result["scene_gamma"]);
810 nWP.starBrightness = Convert.ToSingle(result["star_brightness"]);
811 nWP.cloudColor.X = Convert.ToSingle(result["cloud_color_r"]);
812 nWP.cloudColor.Y = Convert.ToSingle(result["cloud_color_g"]);
813 nWP.cloudColor.Z = Convert.ToSingle(result["cloud_color_b"]);
814 nWP.cloudColor.W = Convert.ToSingle(result["cloud_color_i"]);
815 nWP.cloudXYDensity.X = Convert.ToSingle(result["cloud_x"]);
816 nWP.cloudXYDensity.Y = Convert.ToSingle(result["cloud_y"]);
817 nWP.cloudXYDensity.Z = Convert.ToSingle(result["cloud_density"]);
818 nWP.cloudCoverage = Convert.ToSingle(result["cloud_coverage"]);
819 nWP.cloudScale = Convert.ToSingle(result["cloud_scale"]);
820 nWP.cloudDetailXYDensity.X = Convert.ToSingle(result["cloud_detail_x"]);
821 nWP.cloudDetailXYDensity.Y = Convert.ToSingle(result["cloud_detail_y"]);
822 nWP.cloudDetailXYDensity.Z = Convert.ToSingle(result["cloud_detail_density"]);
823 nWP.cloudScrollX = Convert.ToSingle(result["cloud_scroll_x"]);
824 nWP.cloudScrollXLock = Convert.ToBoolean(result["cloud_scroll_x_lock"]);
825 nWP.cloudScrollY = Convert.ToSingle(result["cloud_scroll_y"]);
826 nWP.cloudScrollYLock = Convert.ToBoolean(result["cloud_scroll_y_lock"]);
827 nWP.drawClassicClouds = Convert.ToBoolean(result["draw_classic_clouds"]);
828 nWP.valid = true;
829 }
830 }
831 }
832 }
833  
834 return nWP;
835 }
836  
837 public RegionSettings LoadRegionSettings(UUID regionUUID)
838 {
839 RegionSettings rs = null;
840  
841 lock (m_dbLock)
842 {
843 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
844 {
845 dbcon.Open();
846  
847 using (MySqlCommand cmd = dbcon.CreateCommand())
848 {
849 cmd.CommandText = "select * from regionsettings where regionUUID = ?RegionUUID";
850 cmd.Parameters.AddWithValue("regionUUID", regionUUID);
851  
852 using (IDataReader reader = ExecuteReader(cmd))
853 {
854 if (reader.Read())
855 {
856 rs = BuildRegionSettings(reader);
857 rs.OnSave += StoreRegionSettings;
858 }
859 else
860 {
861 rs = new RegionSettings();
862 rs.RegionUUID = regionUUID;
863 rs.OnSave += StoreRegionSettings;
864  
865 StoreRegionSettings(rs);
866 }
867 }
868 }
869 }
870 }
871  
872 LoadSpawnPoints(rs);
873  
874 return rs;
875 }
876  
877 public void StoreRegionWindlightSettings(RegionLightShareData wl)
878 {
879 lock (m_dbLock)
880 {
881 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
882 {
883 dbcon.Open();
884  
885 using (MySqlCommand cmd = dbcon.CreateCommand())
886 {
887 cmd.CommandText = "REPLACE INTO `regionwindlight` (`region_id`, `water_color_r`, `water_color_g`, ";
888 cmd.CommandText += "`water_color_b`, `water_fog_density_exponent`, `underwater_fog_modifier`, ";
889 cmd.CommandText += "`reflection_wavelet_scale_1`, `reflection_wavelet_scale_2`, `reflection_wavelet_scale_3`, ";
890 cmd.CommandText += "`fresnel_scale`, `fresnel_offset`, `refract_scale_above`, `refract_scale_below`, ";
891 cmd.CommandText += "`blur_multiplier`, `big_wave_direction_x`, `big_wave_direction_y`, `little_wave_direction_x`, ";
892 cmd.CommandText += "`little_wave_direction_y`, `normal_map_texture`, `horizon_r`, `horizon_g`, `horizon_b`, ";
893 cmd.CommandText += "`horizon_i`, `haze_horizon`, `blue_density_r`, `blue_density_g`, `blue_density_b`, ";
894 cmd.CommandText += "`blue_density_i`, `haze_density`, `density_multiplier`, `distance_multiplier`, `max_altitude`, ";
895 cmd.CommandText += "`sun_moon_color_r`, `sun_moon_color_g`, `sun_moon_color_b`, `sun_moon_color_i`, `sun_moon_position`, ";
896 cmd.CommandText += "`ambient_r`, `ambient_g`, `ambient_b`, `ambient_i`, `east_angle`, `sun_glow_focus`, `sun_glow_size`, ";
897 cmd.CommandText += "`scene_gamma`, `star_brightness`, `cloud_color_r`, `cloud_color_g`, `cloud_color_b`, `cloud_color_i`, ";
898 cmd.CommandText += "`cloud_x`, `cloud_y`, `cloud_density`, `cloud_coverage`, `cloud_scale`, `cloud_detail_x`, ";
899 cmd.CommandText += "`cloud_detail_y`, `cloud_detail_density`, `cloud_scroll_x`, `cloud_scroll_x_lock`, `cloud_scroll_y`, ";
900 cmd.CommandText += "`cloud_scroll_y_lock`, `draw_classic_clouds`) VALUES (?region_id, ?water_color_r, ";
901 cmd.CommandText += "?water_color_g, ?water_color_b, ?water_fog_density_exponent, ?underwater_fog_modifier, ?reflection_wavelet_scale_1, ";
902 cmd.CommandText += "?reflection_wavelet_scale_2, ?reflection_wavelet_scale_3, ?fresnel_scale, ?fresnel_offset, ?refract_scale_above, ";
903 cmd.CommandText += "?refract_scale_below, ?blur_multiplier, ?big_wave_direction_x, ?big_wave_direction_y, ?little_wave_direction_x, ";
904 cmd.CommandText += "?little_wave_direction_y, ?normal_map_texture, ?horizon_r, ?horizon_g, ?horizon_b, ?horizon_i, ?haze_horizon, ";
905 cmd.CommandText += "?blue_density_r, ?blue_density_g, ?blue_density_b, ?blue_density_i, ?haze_density, ?density_multiplier, ";
906 cmd.CommandText += "?distance_multiplier, ?max_altitude, ?sun_moon_color_r, ?sun_moon_color_g, ?sun_moon_color_b, ";
907 cmd.CommandText += "?sun_moon_color_i, ?sun_moon_position, ?ambient_r, ?ambient_g, ?ambient_b, ?ambient_i, ?east_angle, ";
908 cmd.CommandText += "?sun_glow_focus, ?sun_glow_size, ?scene_gamma, ?star_brightness, ?cloud_color_r, ?cloud_color_g, ";
909 cmd.CommandText += "?cloud_color_b, ?cloud_color_i, ?cloud_x, ?cloud_y, ?cloud_density, ?cloud_coverage, ?cloud_scale, ";
910 cmd.CommandText += "?cloud_detail_x, ?cloud_detail_y, ?cloud_detail_density, ?cloud_scroll_x, ?cloud_scroll_x_lock, ";
911 cmd.CommandText += "?cloud_scroll_y, ?cloud_scroll_y_lock, ?draw_classic_clouds)";
912  
913 cmd.Parameters.AddWithValue("region_id", wl.regionID);
914 cmd.Parameters.AddWithValue("water_color_r", wl.waterColor.X);
915 cmd.Parameters.AddWithValue("water_color_g", wl.waterColor.Y);
916 cmd.Parameters.AddWithValue("water_color_b", wl.waterColor.Z);
917 cmd.Parameters.AddWithValue("water_fog_density_exponent", wl.waterFogDensityExponent);
918 cmd.Parameters.AddWithValue("underwater_fog_modifier", wl.underwaterFogModifier);
919 cmd.Parameters.AddWithValue("reflection_wavelet_scale_1", wl.reflectionWaveletScale.X);
920 cmd.Parameters.AddWithValue("reflection_wavelet_scale_2", wl.reflectionWaveletScale.Y);
921 cmd.Parameters.AddWithValue("reflection_wavelet_scale_3", wl.reflectionWaveletScale.Z);
922 cmd.Parameters.AddWithValue("fresnel_scale", wl.fresnelScale);
923 cmd.Parameters.AddWithValue("fresnel_offset", wl.fresnelOffset);
924 cmd.Parameters.AddWithValue("refract_scale_above", wl.refractScaleAbove);
925 cmd.Parameters.AddWithValue("refract_scale_below", wl.refractScaleBelow);
926 cmd.Parameters.AddWithValue("blur_multiplier", wl.blurMultiplier);
927 cmd.Parameters.AddWithValue("big_wave_direction_x", wl.bigWaveDirection.X);
928 cmd.Parameters.AddWithValue("big_wave_direction_y", wl.bigWaveDirection.Y);
929 cmd.Parameters.AddWithValue("little_wave_direction_x", wl.littleWaveDirection.X);
930 cmd.Parameters.AddWithValue("little_wave_direction_y", wl.littleWaveDirection.Y);
931 cmd.Parameters.AddWithValue("normal_map_texture", wl.normalMapTexture);
932 cmd.Parameters.AddWithValue("horizon_r", wl.horizon.X);
933 cmd.Parameters.AddWithValue("horizon_g", wl.horizon.Y);
934 cmd.Parameters.AddWithValue("horizon_b", wl.horizon.Z);
935 cmd.Parameters.AddWithValue("horizon_i", wl.horizon.W);
936 cmd.Parameters.AddWithValue("haze_horizon", wl.hazeHorizon);
937 cmd.Parameters.AddWithValue("blue_density_r", wl.blueDensity.X);
938 cmd.Parameters.AddWithValue("blue_density_g", wl.blueDensity.Y);
939 cmd.Parameters.AddWithValue("blue_density_b", wl.blueDensity.Z);
940 cmd.Parameters.AddWithValue("blue_density_i", wl.blueDensity.W);
941 cmd.Parameters.AddWithValue("haze_density", wl.hazeDensity);
942 cmd.Parameters.AddWithValue("density_multiplier", wl.densityMultiplier);
943 cmd.Parameters.AddWithValue("distance_multiplier", wl.distanceMultiplier);
944 cmd.Parameters.AddWithValue("max_altitude", wl.maxAltitude);
945 cmd.Parameters.AddWithValue("sun_moon_color_r", wl.sunMoonColor.X);
946 cmd.Parameters.AddWithValue("sun_moon_color_g", wl.sunMoonColor.Y);
947 cmd.Parameters.AddWithValue("sun_moon_color_b", wl.sunMoonColor.Z);
948 cmd.Parameters.AddWithValue("sun_moon_color_i", wl.sunMoonColor.W);
949 cmd.Parameters.AddWithValue("sun_moon_position", wl.sunMoonPosition);
950 cmd.Parameters.AddWithValue("ambient_r", wl.ambient.X);
951 cmd.Parameters.AddWithValue("ambient_g", wl.ambient.Y);
952 cmd.Parameters.AddWithValue("ambient_b", wl.ambient.Z);
953 cmd.Parameters.AddWithValue("ambient_i", wl.ambient.W);
954 cmd.Parameters.AddWithValue("east_angle", wl.eastAngle);
955 cmd.Parameters.AddWithValue("sun_glow_focus", wl.sunGlowFocus);
956 cmd.Parameters.AddWithValue("sun_glow_size", wl.sunGlowSize);
957 cmd.Parameters.AddWithValue("scene_gamma", wl.sceneGamma);
958 cmd.Parameters.AddWithValue("star_brightness", wl.starBrightness);
959 cmd.Parameters.AddWithValue("cloud_color_r", wl.cloudColor.X);
960 cmd.Parameters.AddWithValue("cloud_color_g", wl.cloudColor.Y);
961 cmd.Parameters.AddWithValue("cloud_color_b", wl.cloudColor.Z);
962 cmd.Parameters.AddWithValue("cloud_color_i", wl.cloudColor.W);
963 cmd.Parameters.AddWithValue("cloud_x", wl.cloudXYDensity.X);
964 cmd.Parameters.AddWithValue("cloud_y", wl.cloudXYDensity.Y);
965 cmd.Parameters.AddWithValue("cloud_density", wl.cloudXYDensity.Z);
966 cmd.Parameters.AddWithValue("cloud_coverage", wl.cloudCoverage);
967 cmd.Parameters.AddWithValue("cloud_scale", wl.cloudScale);
968 cmd.Parameters.AddWithValue("cloud_detail_x", wl.cloudDetailXYDensity.X);
969 cmd.Parameters.AddWithValue("cloud_detail_y", wl.cloudDetailXYDensity.Y);
970 cmd.Parameters.AddWithValue("cloud_detail_density", wl.cloudDetailXYDensity.Z);
971 cmd.Parameters.AddWithValue("cloud_scroll_x", wl.cloudScrollX);
972 cmd.Parameters.AddWithValue("cloud_scroll_x_lock", wl.cloudScrollXLock);
973 cmd.Parameters.AddWithValue("cloud_scroll_y", wl.cloudScrollY);
974 cmd.Parameters.AddWithValue("cloud_scroll_y_lock", wl.cloudScrollYLock);
975 cmd.Parameters.AddWithValue("draw_classic_clouds", wl.drawClassicClouds);
976  
977 ExecuteNonQuery(cmd);
978 }
979 }
980 }
981 }
982  
983 public void RemoveRegionWindlightSettings(UUID regionID)
984 {
985 lock (m_dbLock)
986 {
987 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
988 {
989 dbcon.Open();
990  
991 using (MySqlCommand cmd = dbcon.CreateCommand())
992 {
993 cmd.CommandText = "delete from `regionwindlight` where `region_id`=?regionID";
994 cmd.Parameters.AddWithValue("?regionID", regionID.ToString());
995 ExecuteNonQuery(cmd);
996 }
997 }
998 }
999 }
1000  
1001 #region RegionEnvironmentSettings
1002 public string LoadRegionEnvironmentSettings(UUID regionUUID)
1003 {
1004 lock (m_dbLock)
1005 {
1006 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
1007 {
1008 dbcon.Open();
1009  
1010 string command = "select * from `regionenvironment` where region_id = ?region_id";
1011  
1012 using (MySqlCommand cmd = new MySqlCommand(command))
1013 {
1014 cmd.Connection = dbcon;
1015  
1016 cmd.Parameters.AddWithValue("?region_id", regionUUID.ToString());
1017  
1018 IDataReader result = ExecuteReader(cmd);
1019 if (!result.Read())
1020 {
1021 return String.Empty;
1022 }
1023 else
1024 {
1025 return Convert.ToString(result["llsd_settings"]);
1026 }
1027 }
1028 }
1029 }
1030 }
1031  
1032 public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings)
1033 {
1034 lock (m_dbLock)
1035 {
1036 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
1037 {
1038 dbcon.Open();
1039  
1040 using (MySqlCommand cmd = dbcon.CreateCommand())
1041 {
1042 cmd.CommandText = "REPLACE INTO `regionenvironment` (`region_id`, `llsd_settings`) VALUES (?region_id, ?llsd_settings)";
1043  
1044 cmd.Parameters.AddWithValue("region_id", regionUUID);
1045 cmd.Parameters.AddWithValue("llsd_settings", settings);
1046  
1047 ExecuteNonQuery(cmd);
1048 }
1049 }
1050 }
1051 }
1052  
1053 public void RemoveRegionEnvironmentSettings(UUID regionUUID)
1054 {
1055 lock (m_dbLock)
1056 {
1057 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
1058 {
1059 dbcon.Open();
1060  
1061 using (MySqlCommand cmd = dbcon.CreateCommand())
1062 {
1063 cmd.CommandText = "delete from `regionenvironment` where region_id = ?region_id";
1064 cmd.Parameters.AddWithValue("?region_id", regionUUID.ToString());
1065 ExecuteNonQuery(cmd);
1066 }
1067 }
1068 }
1069 }
1070 #endregion
1071  
1072 public void StoreRegionSettings(RegionSettings rs)
1073 {
1074 lock (m_dbLock)
1075 {
1076 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
1077 {
1078 dbcon.Open();
1079  
1080 using (MySqlCommand cmd = dbcon.CreateCommand())
1081 {
1082 cmd.CommandText = "replace into regionsettings (regionUUID, " +
1083 "block_terraform, block_fly, allow_damage, " +
1084 "restrict_pushing, allow_land_resell, " +
1085 "allow_land_join_divide, block_show_in_search, " +
1086 "agent_limit, object_bonus, maturity, " +
1087 "disable_scripts, disable_collisions, " +
1088 "disable_physics, terrain_texture_1, " +
1089 "terrain_texture_2, terrain_texture_3, " +
1090 "terrain_texture_4, elevation_1_nw, " +
1091 "elevation_2_nw, elevation_1_ne, " +
1092 "elevation_2_ne, elevation_1_se, " +
1093 "elevation_2_se, elevation_1_sw, " +
1094 "elevation_2_sw, water_height, " +
1095 "terrain_raise_limit, terrain_lower_limit, " +
1096 "use_estate_sun, fixed_sun, sun_position, " +
1097 "covenant, covenant_datetime, Sandbox, sunvectorx, sunvectory, " +
1098 "sunvectorz, loaded_creation_datetime, " +
1099 "loaded_creation_id, map_tile_ID, " +
1100 "TelehubObject, parcel_tile_ID) " +
1101 "values (?RegionUUID, ?BlockTerraform, " +
1102 "?BlockFly, ?AllowDamage, ?RestrictPushing, " +
1103 "?AllowLandResell, ?AllowLandJoinDivide, " +
1104 "?BlockShowInSearch, ?AgentLimit, ?ObjectBonus, " +
1105 "?Maturity, ?DisableScripts, ?DisableCollisions, " +
1106 "?DisablePhysics, ?TerrainTexture1, " +
1107 "?TerrainTexture2, ?TerrainTexture3, " +
1108 "?TerrainTexture4, ?Elevation1NW, ?Elevation2NW, " +
1109 "?Elevation1NE, ?Elevation2NE, ?Elevation1SE, " +
1110 "?Elevation2SE, ?Elevation1SW, ?Elevation2SW, " +
1111 "?WaterHeight, ?TerrainRaiseLimit, " +
1112 "?TerrainLowerLimit, ?UseEstateSun, ?FixedSun, " +
1113 "?SunPosition, ?Covenant, ?CovenantChangedDateTime, ?Sandbox, " +
1114 "?SunVectorX, ?SunVectorY, ?SunVectorZ, " +
1115 "?LoadedCreationDateTime, ?LoadedCreationID, " +
1116 "?TerrainImageID, " +
1117 "?TelehubObject, ?ParcelImageID)";
1118  
1119 FillRegionSettingsCommand(cmd, rs);
1120  
1121 ExecuteNonQuery(cmd);
1122 }
1123 }
1124 }
1125 SaveSpawnPoints(rs);
1126 }
1127  
1128 public List<LandData> LoadLandObjects(UUID regionUUID)
1129 {
1130 List<LandData> landData = new List<LandData>();
1131  
1132 lock (m_dbLock)
1133 {
1134 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
1135 {
1136 dbcon.Open();
1137  
1138 using (MySqlCommand cmd = dbcon.CreateCommand())
1139 {
1140 cmd.CommandText = "select * from land where RegionUUID = ?RegionUUID";
1141 cmd.Parameters.AddWithValue("RegionUUID", regionUUID.ToString());
1142  
1143 using (IDataReader reader = ExecuteReader(cmd))
1144 {
1145 while (reader.Read())
1146 {
1147 LandData newLand = BuildLandData(reader);
1148 landData.Add(newLand);
1149 }
1150 }
1151 }
1152  
1153 using (MySqlCommand cmd = dbcon.CreateCommand())
1154 {
1155 foreach (LandData land in landData)
1156 {
1157 cmd.Parameters.Clear();
1158 cmd.CommandText = "select * from landaccesslist where LandUUID = ?LandUUID";
1159 cmd.Parameters.AddWithValue("LandUUID", land.GlobalID.ToString());
1160  
1161 using (IDataReader reader = ExecuteReader(cmd))
1162 {
1163 while (reader.Read())
1164 {
1165 land.ParcelAccessList.Add(BuildLandAccessData(reader));
1166 }
1167 }
1168 }
1169 }
1170 }
1171 }
1172  
1173 return landData;
1174 }
1175  
1176 public void Shutdown()
1177 {
1178 }
1179  
1180 private SceneObjectPart BuildPrim(IDataReader row)
1181 {
1182 SceneObjectPart prim = new SceneObjectPart();
1183  
1184 // depending on the MySQL connector version, CHAR(36) may be already converted to Guid!
1185 prim.UUID = DBGuid.FromDB(row["UUID"]);
1186 prim.CreatorIdentification = (string)row["CreatorID"];
1187 prim.OwnerID = DBGuid.FromDB(row["OwnerID"]);
1188 prim.GroupID = DBGuid.FromDB(row["GroupID"]);
1189 prim.LastOwnerID = DBGuid.FromDB(row["LastOwnerID"]);
1190  
1191 // explicit conversion of integers is required, which sort
1192 // of sucks. No idea if there is a shortcut here or not.
1193 prim.CreationDate = (int)row["CreationDate"];
1194 if (row["Name"] != DBNull.Value)
1195 prim.Name = (string)row["Name"];
1196 else
1197 prim.Name = String.Empty;
1198 // Various text fields
1199 prim.Text = (string)row["Text"];
1200 prim.Color = Color.FromArgb((int)row["ColorA"],
1201 (int)row["ColorR"],
1202 (int)row["ColorG"],
1203 (int)row["ColorB"]);
1204 prim.Description = (string)row["Description"];
1205 prim.SitName = (string)row["SitName"];
1206 prim.TouchName = (string)row["TouchName"];
1207 // Permissions
1208 prim.Flags = (PrimFlags)(int)row["ObjectFlags"];
1209 prim.OwnerMask = (uint)(int)row["OwnerMask"];
1210 prim.NextOwnerMask = (uint)(int)row["NextOwnerMask"];
1211 prim.GroupMask = (uint)(int)row["GroupMask"];
1212 prim.EveryoneMask = (uint)(int)row["EveryoneMask"];
1213 prim.BaseMask = (uint)(int)row["BaseMask"];
1214  
1215 // Vectors
1216 prim.OffsetPosition = new Vector3(
1217 (float)(double)row["PositionX"],
1218 (float)(double)row["PositionY"],
1219 (float)(double)row["PositionZ"]
1220 );
1221 prim.GroupPosition = new Vector3(
1222 (float)(double)row["GroupPositionX"],
1223 (float)(double)row["GroupPositionY"],
1224 (float)(double)row["GroupPositionZ"]
1225 );
1226 prim.Velocity = new Vector3(
1227 (float)(double)row["VelocityX"],
1228 (float)(double)row["VelocityY"],
1229 (float)(double)row["VelocityZ"]
1230 );
1231 prim.AngularVelocity = new Vector3(
1232 (float)(double)row["AngularVelocityX"],
1233 (float)(double)row["AngularVelocityY"],
1234 (float)(double)row["AngularVelocityZ"]
1235 );
1236 prim.Acceleration = new Vector3(
1237 (float)(double)row["AccelerationX"],
1238 (float)(double)row["AccelerationY"],
1239 (float)(double)row["AccelerationZ"]
1240 );
1241 // quaternions
1242 prim.RotationOffset = new Quaternion(
1243 (float)(double)row["RotationX"],
1244 (float)(double)row["RotationY"],
1245 (float)(double)row["RotationZ"],
1246 (float)(double)row["RotationW"]
1247 );
1248 prim.SitTargetPositionLL = new Vector3(
1249 (float)(double)row["SitTargetOffsetX"],
1250 (float)(double)row["SitTargetOffsetY"],
1251 (float)(double)row["SitTargetOffsetZ"]
1252 );
1253 prim.SitTargetOrientationLL = new Quaternion(
1254 (float)(double)row["SitTargetOrientX"],
1255 (float)(double)row["SitTargetOrientY"],
1256 (float)(double)row["SitTargetOrientZ"],
1257 (float)(double)row["SitTargetOrientW"]
1258 );
1259  
1260 prim.PayPrice[0] = (int)row["PayPrice"];
1261 prim.PayPrice[1] = (int)row["PayButton1"];
1262 prim.PayPrice[2] = (int)row["PayButton2"];
1263 prim.PayPrice[3] = (int)row["PayButton3"];
1264 prim.PayPrice[4] = (int)row["PayButton4"];
1265  
1266 prim.Sound = DBGuid.FromDB(row["LoopedSound"].ToString());
1267 prim.SoundGain = (float)(double)row["LoopedSoundGain"];
1268 prim.SoundFlags = 1; // If it's persisted at all, it's looped
1269  
1270 if (!(row["TextureAnimation"] is DBNull))
1271 prim.TextureAnimation = (byte[])row["TextureAnimation"];
1272 if (!(row["ParticleSystem"] is DBNull))
1273 prim.ParticleSystem = (byte[])row["ParticleSystem"];
1274  
1275 prim.AngularVelocity = new Vector3(
1276 (float)(double)row["OmegaX"],
1277 (float)(double)row["OmegaY"],
1278 (float)(double)row["OmegaZ"]
1279 );
1280  
1281 prim.SetCameraEyeOffset(new Vector3(
1282 (float)(double)row["CameraEyeOffsetX"],
1283 (float)(double)row["CameraEyeOffsetY"],
1284 (float)(double)row["CameraEyeOffsetZ"]
1285 ));
1286  
1287 prim.SetCameraAtOffset(new Vector3(
1288 (float)(double)row["CameraAtOffsetX"],
1289 (float)(double)row["CameraAtOffsetY"],
1290 (float)(double)row["CameraAtOffsetZ"]
1291 ));
1292  
1293 prim.SetForceMouselook((sbyte)row["ForceMouselook"] != 0);
1294 prim.ScriptAccessPin = (int)row["ScriptAccessPin"];
1295 prim.AllowedDrop = ((sbyte)row["AllowedDrop"] != 0);
1296 prim.DIE_AT_EDGE = ((sbyte)row["DieAtEdge"] != 0);
1297  
1298 prim.SalePrice = (int)row["SalePrice"];
1299 prim.ObjectSaleType = unchecked((byte)(sbyte)row["SaleType"]);
1300  
1301 prim.Material = unchecked((byte)(sbyte)row["Material"]);
1302  
1303 if (!(row["ClickAction"] is DBNull))
1304 prim.ClickAction = unchecked((byte)(sbyte)row["ClickAction"]);
1305  
1306 prim.CollisionSound = DBGuid.FromDB(row["CollisionSound"]);
1307 prim.CollisionSoundVolume = (float)(double)row["CollisionSoundVolume"];
1308  
1309 prim.PassTouches = ((sbyte)row["PassTouches"] != 0);
1310 prim.LinkNum = (int)row["LinkNumber"];
1311  
1312 if (!(row["MediaURL"] is System.DBNull))
1313 prim.MediaUrl = (string)row["MediaURL"];
1314  
1315 if (!(row["AttachedPosX"] is System.DBNull))
1316 {
1317 prim.AttachedPos = new Vector3(
1318 (float)(double)row["AttachedPosX"],
1319 (float)(double)row["AttachedPosY"],
1320 (float)(double)row["AttachedPosZ"]
1321 );
1322 }
1323  
1324 if (!(row["DynAttrs"] is System.DBNull))
1325 prim.DynAttrs = DAMap.FromXml((string)row["DynAttrs"]);
1326 else
1327 prim.DynAttrs = new DAMap();
1328  
1329 if (!(row["KeyframeMotion"] is DBNull))
1330 {
1331 Byte[] data = (byte[])row["KeyframeMotion"];
1332 if (data.Length > 0)
1333 prim.KeyframeMotion = KeyframeMotion.FromData(null, data);
1334 else
1335 prim.KeyframeMotion = null;
1336 }
1337 else
1338 {
1339 prim.KeyframeMotion = null;
1340 }
1341  
1342 prim.PhysicsShapeType = (byte)Convert.ToInt32(row["PhysicsShapeType"].ToString());
1343 prim.Density = (float)(double)row["Density"];
1344 prim.GravityModifier = (float)(double)row["GravityModifier"];
1345 prim.Friction = (float)(double)row["Friction"];
1346 prim.Restitution = (float)(double)row["Restitution"];
1347  
1348 return prim;
1349 }
1350  
1351 /// <summary>
1352 /// Build a prim inventory item from the persisted data.
1353 /// </summary>
1354 /// <param name="row"></param>
1355 /// <returns></returns>
1356 private static TaskInventoryItem BuildItem(IDataReader row)
1357 {
1358 TaskInventoryItem taskItem = new TaskInventoryItem();
1359  
1360 taskItem.ItemID = DBGuid.FromDB(row["itemID"]);
1361 taskItem.ParentPartID = DBGuid.FromDB(row["primID"]);
1362 taskItem.AssetID = DBGuid.FromDB(row["assetID"]);
1363 taskItem.ParentID = DBGuid.FromDB(row["parentFolderID"]);
1364  
1365 taskItem.InvType = Convert.ToInt32(row["invType"]);
1366 taskItem.Type = Convert.ToInt32(row["assetType"]);
1367  
1368 taskItem.Name = (String)row["name"];
1369 taskItem.Description = (String)row["description"];
1370 taskItem.CreationDate = Convert.ToUInt32(row["creationDate"]);
1371 taskItem.CreatorIdentification = (String)row["creatorID"];
1372 taskItem.OwnerID = DBGuid.FromDB(row["ownerID"]);
1373 taskItem.LastOwnerID = DBGuid.FromDB(row["lastOwnerID"]);
1374 taskItem.GroupID = DBGuid.FromDB(row["groupID"]);
1375  
1376 taskItem.NextPermissions = Convert.ToUInt32(row["nextPermissions"]);
1377 taskItem.CurrentPermissions = Convert.ToUInt32(row["currentPermissions"]);
1378 taskItem.BasePermissions = Convert.ToUInt32(row["basePermissions"]);
1379 taskItem.EveryonePermissions = Convert.ToUInt32(row["everyonePermissions"]);
1380 taskItem.GroupPermissions = Convert.ToUInt32(row["groupPermissions"]);
1381 taskItem.Flags = Convert.ToUInt32(row["flags"]);
1382  
1383 return taskItem;
1384 }
1385  
1386 private static RegionSettings BuildRegionSettings(IDataReader row)
1387 {
1388 RegionSettings newSettings = new RegionSettings();
1389  
1390 newSettings.RegionUUID = DBGuid.FromDB(row["regionUUID"]);
1391 newSettings.BlockTerraform = Convert.ToBoolean(row["block_terraform"]);
1392 newSettings.AllowDamage = Convert.ToBoolean(row["allow_damage"]);
1393 newSettings.BlockFly = Convert.ToBoolean(row["block_fly"]);
1394 newSettings.RestrictPushing = Convert.ToBoolean(row["restrict_pushing"]);
1395 newSettings.AllowLandResell = Convert.ToBoolean(row["allow_land_resell"]);
1396 newSettings.AllowLandJoinDivide = Convert.ToBoolean(row["allow_land_join_divide"]);
1397 newSettings.BlockShowInSearch = Convert.ToBoolean(row["block_show_in_search"]);
1398 newSettings.AgentLimit = Convert.ToInt32(row["agent_limit"]);
1399 newSettings.ObjectBonus = Convert.ToDouble(row["object_bonus"]);
1400 newSettings.Maturity = Convert.ToInt32(row["maturity"]);
1401 newSettings.DisableScripts = Convert.ToBoolean(row["disable_scripts"]);
1402 newSettings.DisableCollisions = Convert.ToBoolean(row["disable_collisions"]);
1403 newSettings.DisablePhysics = Convert.ToBoolean(row["disable_physics"]);
1404 newSettings.TerrainTexture1 = DBGuid.FromDB(row["terrain_texture_1"]);
1405 newSettings.TerrainTexture2 = DBGuid.FromDB(row["terrain_texture_2"]);
1406 newSettings.TerrainTexture3 = DBGuid.FromDB(row["terrain_texture_3"]);
1407 newSettings.TerrainTexture4 = DBGuid.FromDB(row["terrain_texture_4"]);
1408 newSettings.Elevation1NW = Convert.ToDouble(row["elevation_1_nw"]);
1409 newSettings.Elevation2NW = Convert.ToDouble(row["elevation_2_nw"]);
1410 newSettings.Elevation1NE = Convert.ToDouble(row["elevation_1_ne"]);
1411 newSettings.Elevation2NE = Convert.ToDouble(row["elevation_2_ne"]);
1412 newSettings.Elevation1SE = Convert.ToDouble(row["elevation_1_se"]);
1413 newSettings.Elevation2SE = Convert.ToDouble(row["elevation_2_se"]);
1414 newSettings.Elevation1SW = Convert.ToDouble(row["elevation_1_sw"]);
1415 newSettings.Elevation2SW = Convert.ToDouble(row["elevation_2_sw"]);
1416 newSettings.WaterHeight = Convert.ToDouble(row["water_height"]);
1417 newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]);
1418 newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]);
1419 newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]);
1420 newSettings.Sandbox = Convert.ToBoolean(row["Sandbox"]);
1421 newSettings.SunVector = new Vector3 (
1422 Convert.ToSingle(row["sunvectorx"]),
1423 Convert.ToSingle(row["sunvectory"]),
1424 Convert.ToSingle(row["sunvectorz"])
1425 );
1426 newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]);
1427 newSettings.SunPosition = Convert.ToDouble(row["sun_position"]);
1428 newSettings.Covenant = DBGuid.FromDB(row["covenant"]);
1429 newSettings.CovenantChangedDateTime = Convert.ToInt32(row["covenant_datetime"]);
1430 newSettings.LoadedCreationDateTime = Convert.ToInt32(row["loaded_creation_datetime"]);
1431  
1432 if (row["loaded_creation_id"] is DBNull)
1433 newSettings.LoadedCreationID = "";
1434 else
1435 newSettings.LoadedCreationID = (String) row["loaded_creation_id"];
1436  
1437 newSettings.TerrainImageID = DBGuid.FromDB(row["map_tile_ID"]);
1438 newSettings.ParcelImageID = DBGuid.FromDB(row["parcel_tile_ID"]);
1439 newSettings.TelehubObject = DBGuid.FromDB(row["TelehubObject"]);
1440  
1441 return newSettings;
1442 }
1443  
1444 /// <summary>
1445 ///
1446 /// </summary>
1447 /// <param name="row"></param>
1448 /// <returns></returns>
1449 private static LandData BuildLandData(IDataReader row)
1450 {
1451 LandData newData = new LandData();
1452  
1453 newData.GlobalID = DBGuid.FromDB(row["UUID"]);
1454 newData.LocalID = Convert.ToInt32(row["LocalLandID"]);
1455  
1456 // Bitmap is a byte[512]
1457 newData.Bitmap = (Byte[]) row["Bitmap"];
1458  
1459 newData.Name = (String) row["Name"];
1460 newData.Description = (String) row["Description"];
1461 newData.OwnerID = DBGuid.FromDB(row["OwnerUUID"]);
1462 newData.IsGroupOwned = Convert.ToBoolean(row["IsGroupOwned"]);
1463 newData.Area = Convert.ToInt32(row["Area"]);
1464 newData.AuctionID = Convert.ToUInt32(row["AuctionID"]); //Unimplemented
1465 newData.Category = (ParcelCategory) Convert.ToInt32(row["Category"]);
1466 //Enum libsecondlife.Parcel.ParcelCategory
1467 newData.ClaimDate = Convert.ToInt32(row["ClaimDate"]);
1468 newData.ClaimPrice = Convert.ToInt32(row["ClaimPrice"]);
1469 newData.GroupID = DBGuid.FromDB(row["GroupUUID"]);
1470 newData.SalePrice = Convert.ToInt32(row["SalePrice"]);
1471 newData.Status = (ParcelStatus) Convert.ToInt32(row["LandStatus"]);
1472 //Enum. libsecondlife.Parcel.ParcelStatus
1473 newData.Flags = Convert.ToUInt32(row["LandFlags"]);
1474 newData.LandingType = Convert.ToByte(row["LandingType"]);
1475 newData.MediaAutoScale = Convert.ToByte(row["MediaAutoScale"]);
1476 newData.MediaID = DBGuid.FromDB(row["MediaTextureUUID"]);
1477 newData.MediaURL = (String) row["MediaURL"];
1478 newData.MusicURL = (String) row["MusicURL"];
1479 newData.PassHours = Convert.ToSingle(row["PassHours"]);
1480 newData.PassPrice = Convert.ToInt32(row["PassPrice"]);
1481 UUID authedbuyer = UUID.Zero;
1482 UUID snapshotID = UUID.Zero;
1483  
1484 UUID.TryParse((string)row["AuthBuyerID"], out authedbuyer);
1485 UUID.TryParse((string)row["SnapshotUUID"], out snapshotID);
1486 newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]);
1487  
1488 newData.AuthBuyerID = authedbuyer;
1489 newData.SnapshotID = snapshotID;
1490 try
1491 {
1492 newData.UserLocation =
1493 new Vector3(Convert.ToSingle(row["UserLocationX"]), Convert.ToSingle(row["UserLocationY"]),
1494 Convert.ToSingle(row["UserLocationZ"]));
1495 newData.UserLookAt =
1496 new Vector3(Convert.ToSingle(row["UserLookAtX"]), Convert.ToSingle(row["UserLookAtY"]),
1497 Convert.ToSingle(row["UserLookAtZ"]));
1498 }
1499 catch (InvalidCastException)
1500 {
1501 newData.UserLocation = Vector3.Zero;
1502 newData.UserLookAt = Vector3.Zero;
1503 m_log.ErrorFormat("[PARCEL]: unable to get parcel telehub settings for {1}", newData.Name);
1504 }
1505  
1506 newData.MediaDescription = (string) row["MediaDescription"];
1507 newData.MediaType = (string) row["MediaType"];
1508 newData.MediaWidth = Convert.ToInt32((((string) row["MediaSize"]).Split(','))[0]);
1509 newData.MediaHeight = Convert.ToInt32((((string) row["MediaSize"]).Split(','))[1]);
1510 newData.MediaLoop = Convert.ToBoolean(row["MediaLoop"]);
1511 newData.ObscureMusic = Convert.ToBoolean(row["ObscureMusic"]);
1512 newData.ObscureMedia = Convert.ToBoolean(row["ObscureMedia"]);
1513  
1514 newData.ParcelAccessList = new List<LandAccessEntry>();
1515  
1516 return newData;
1517 }
1518  
1519 /// <summary>
1520 ///
1521 /// </summary>
1522 /// <param name="row"></param>
1523 /// <returns></returns>
1524 private static LandAccessEntry BuildLandAccessData(IDataReader row)
1525 {
1526 LandAccessEntry entry = new LandAccessEntry();
1527 entry.AgentID = DBGuid.FromDB(row["AccessUUID"]);
1528 entry.Flags = (AccessList) Convert.ToInt32(row["Flags"]);
1529 entry.Expires = Convert.ToInt32(row["Expires"]);
1530 return entry;
1531 }
1532  
1533 /// <summary>
1534 /// Fill the prim command with prim values
1535 /// </summary>
1536 /// <param name="row"></param>
1537 /// <param name="prim"></param>
1538 /// <param name="sceneGroupID"></param>
1539 /// <param name="regionUUID"></param>
1540 private void FillPrimCommand(MySqlCommand cmd, SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
1541 {
1542 cmd.Parameters.AddWithValue("UUID", prim.UUID.ToString());
1543 cmd.Parameters.AddWithValue("RegionUUID", regionUUID.ToString());
1544 cmd.Parameters.AddWithValue("CreationDate", prim.CreationDate);
1545 cmd.Parameters.AddWithValue("Name", prim.Name);
1546 cmd.Parameters.AddWithValue("SceneGroupID", sceneGroupID.ToString());
1547 // the UUID of the root part for this SceneObjectGroup
1548 // various text fields
1549 cmd.Parameters.AddWithValue("Text", prim.Text);
1550 cmd.Parameters.AddWithValue("ColorR", prim.Color.R);
1551 cmd.Parameters.AddWithValue("ColorG", prim.Color.G);
1552 cmd.Parameters.AddWithValue("ColorB", prim.Color.B);
1553 cmd.Parameters.AddWithValue("ColorA", prim.Color.A);
1554 cmd.Parameters.AddWithValue("Description", prim.Description);
1555 cmd.Parameters.AddWithValue("SitName", prim.SitName);
1556 cmd.Parameters.AddWithValue("TouchName", prim.TouchName);
1557 // permissions
1558 cmd.Parameters.AddWithValue("ObjectFlags", (uint)prim.Flags);
1559 cmd.Parameters.AddWithValue("CreatorID", prim.CreatorIdentification.ToString());
1560 cmd.Parameters.AddWithValue("OwnerID", prim.OwnerID.ToString());
1561 cmd.Parameters.AddWithValue("GroupID", prim.GroupID.ToString());
1562 cmd.Parameters.AddWithValue("LastOwnerID", prim.LastOwnerID.ToString());
1563 cmd.Parameters.AddWithValue("OwnerMask", prim.OwnerMask);
1564 cmd.Parameters.AddWithValue("NextOwnerMask", prim.NextOwnerMask);
1565 cmd.Parameters.AddWithValue("GroupMask", prim.GroupMask);
1566 cmd.Parameters.AddWithValue("EveryoneMask", prim.EveryoneMask);
1567 cmd.Parameters.AddWithValue("BaseMask", prim.BaseMask);
1568 // vectors
1569 cmd.Parameters.AddWithValue("PositionX", (double)prim.OffsetPosition.X);
1570 cmd.Parameters.AddWithValue("PositionY", (double)prim.OffsetPosition.Y);
1571 cmd.Parameters.AddWithValue("PositionZ", (double)prim.OffsetPosition.Z);
1572 cmd.Parameters.AddWithValue("GroupPositionX", (double)prim.GroupPosition.X);
1573 cmd.Parameters.AddWithValue("GroupPositionY", (double)prim.GroupPosition.Y);
1574 cmd.Parameters.AddWithValue("GroupPositionZ", (double)prim.GroupPosition.Z);
1575 cmd.Parameters.AddWithValue("VelocityX", (double)prim.Velocity.X);
1576 cmd.Parameters.AddWithValue("VelocityY", (double)prim.Velocity.Y);
1577 cmd.Parameters.AddWithValue("VelocityZ", (double)prim.Velocity.Z);
1578 cmd.Parameters.AddWithValue("AngularVelocityX", (double)prim.AngularVelocity.X);
1579 cmd.Parameters.AddWithValue("AngularVelocityY", (double)prim.AngularVelocity.Y);
1580 cmd.Parameters.AddWithValue("AngularVelocityZ", (double)prim.AngularVelocity.Z);
1581 cmd.Parameters.AddWithValue("AccelerationX", (double)prim.Acceleration.X);
1582 cmd.Parameters.AddWithValue("AccelerationY", (double)prim.Acceleration.Y);
1583 cmd.Parameters.AddWithValue("AccelerationZ", (double)prim.Acceleration.Z);
1584 // quaternions
1585 cmd.Parameters.AddWithValue("RotationX", (double)prim.RotationOffset.X);
1586 cmd.Parameters.AddWithValue("RotationY", (double)prim.RotationOffset.Y);
1587 cmd.Parameters.AddWithValue("RotationZ", (double)prim.RotationOffset.Z);
1588 cmd.Parameters.AddWithValue("RotationW", (double)prim.RotationOffset.W);
1589  
1590 // Sit target
1591 Vector3 sitTargetPos = prim.SitTargetPositionLL;
1592 cmd.Parameters.AddWithValue("SitTargetOffsetX", (double)sitTargetPos.X);
1593 cmd.Parameters.AddWithValue("SitTargetOffsetY", (double)sitTargetPos.Y);
1594 cmd.Parameters.AddWithValue("SitTargetOffsetZ", (double)sitTargetPos.Z);
1595  
1596 Quaternion sitTargetOrient = prim.SitTargetOrientationLL;
1597 cmd.Parameters.AddWithValue("SitTargetOrientW", (double)sitTargetOrient.W);
1598 cmd.Parameters.AddWithValue("SitTargetOrientX", (double)sitTargetOrient.X);
1599 cmd.Parameters.AddWithValue("SitTargetOrientY", (double)sitTargetOrient.Y);
1600 cmd.Parameters.AddWithValue("SitTargetOrientZ", (double)sitTargetOrient.Z);
1601  
1602 cmd.Parameters.AddWithValue("PayPrice", prim.PayPrice[0]);
1603 cmd.Parameters.AddWithValue("PayButton1", prim.PayPrice[1]);
1604 cmd.Parameters.AddWithValue("PayButton2", prim.PayPrice[2]);
1605 cmd.Parameters.AddWithValue("PayButton3", prim.PayPrice[3]);
1606 cmd.Parameters.AddWithValue("PayButton4", prim.PayPrice[4]);
1607  
1608 if ((prim.SoundFlags & 1) != 0) // Looped
1609 {
1610 cmd.Parameters.AddWithValue("LoopedSound", prim.Sound.ToString());
1611 cmd.Parameters.AddWithValue("LoopedSoundGain", prim.SoundGain);
1612 }
1613 else
1614 {
1615 cmd.Parameters.AddWithValue("LoopedSound", UUID.Zero);
1616 cmd.Parameters.AddWithValue("LoopedSoundGain", 0.0f);
1617 }
1618  
1619 cmd.Parameters.AddWithValue("TextureAnimation", prim.TextureAnimation);
1620 cmd.Parameters.AddWithValue("ParticleSystem", prim.ParticleSystem);
1621  
1622 cmd.Parameters.AddWithValue("OmegaX", (double)prim.AngularVelocity.X);
1623 cmd.Parameters.AddWithValue("OmegaY", (double)prim.AngularVelocity.Y);
1624 cmd.Parameters.AddWithValue("OmegaZ", (double)prim.AngularVelocity.Z);
1625  
1626 cmd.Parameters.AddWithValue("CameraEyeOffsetX", (double)prim.GetCameraEyeOffset().X);
1627 cmd.Parameters.AddWithValue("CameraEyeOffsetY", (double)prim.GetCameraEyeOffset().Y);
1628 cmd.Parameters.AddWithValue("CameraEyeOffsetZ", (double)prim.GetCameraEyeOffset().Z);
1629  
1630 cmd.Parameters.AddWithValue("CameraAtOffsetX", (double)prim.GetCameraAtOffset().X);
1631 cmd.Parameters.AddWithValue("CameraAtOffsetY", (double)prim.GetCameraAtOffset().Y);
1632 cmd.Parameters.AddWithValue("CameraAtOffsetZ", (double)prim.GetCameraAtOffset().Z);
1633  
1634 if (prim.GetForceMouselook())
1635 cmd.Parameters.AddWithValue("ForceMouselook", 1);
1636 else
1637 cmd.Parameters.AddWithValue("ForceMouselook", 0);
1638  
1639 cmd.Parameters.AddWithValue("ScriptAccessPin", prim.ScriptAccessPin);
1640  
1641 if (prim.AllowedDrop)
1642 cmd.Parameters.AddWithValue("AllowedDrop", 1);
1643 else
1644 cmd.Parameters.AddWithValue("AllowedDrop", 0);
1645  
1646 if (prim.DIE_AT_EDGE)
1647 cmd.Parameters.AddWithValue("DieAtEdge", 1);
1648 else
1649 cmd.Parameters.AddWithValue("DieAtEdge", 0);
1650  
1651 cmd.Parameters.AddWithValue("SalePrice", prim.SalePrice);
1652 cmd.Parameters.AddWithValue("SaleType", unchecked((sbyte)(prim.ObjectSaleType)));
1653  
1654 byte clickAction = prim.ClickAction;
1655 cmd.Parameters.AddWithValue("ClickAction", unchecked((sbyte)(clickAction)));
1656  
1657 cmd.Parameters.AddWithValue("Material", unchecked((sbyte)(prim.Material)));
1658  
1659 cmd.Parameters.AddWithValue("CollisionSound", prim.CollisionSound.ToString());
1660 cmd.Parameters.AddWithValue("CollisionSoundVolume", prim.CollisionSoundVolume);
1661  
1662 if (prim.PassTouches)
1663 cmd.Parameters.AddWithValue("PassTouches", 1);
1664 else
1665 cmd.Parameters.AddWithValue("PassTouches", 0);
1666  
1667 cmd.Parameters.AddWithValue("LinkNumber", prim.LinkNum);
1668 cmd.Parameters.AddWithValue("MediaURL", prim.MediaUrl);
1669 if (prim.AttachedPos != null)
1670 {
1671 cmd.Parameters.AddWithValue("AttachedPosX", (double)prim.AttachedPos.X);
1672 cmd.Parameters.AddWithValue("AttachedPosY", (double)prim.AttachedPos.Y);
1673 cmd.Parameters.AddWithValue("AttachedPosZ", (double)prim.AttachedPos.Z);
1674 }
1675  
1676 if (prim.KeyframeMotion != null)
1677 cmd.Parameters.AddWithValue("KeyframeMotion", prim.KeyframeMotion.Serialize());
1678 else
1679 cmd.Parameters.AddWithValue("KeyframeMotion", new Byte[0]);
1680  
1681 if (prim.DynAttrs.CountNamespaces > 0)
1682 cmd.Parameters.AddWithValue("DynAttrs", prim.DynAttrs.ToXml());
1683 else
1684 cmd.Parameters.AddWithValue("DynAttrs", null);
1685  
1686 cmd.Parameters.AddWithValue("PhysicsShapeType", prim.PhysicsShapeType);
1687 cmd.Parameters.AddWithValue("Density", (double)prim.Density);
1688 cmd.Parameters.AddWithValue("GravityModifier", (double)prim.GravityModifier);
1689 cmd.Parameters.AddWithValue("Friction", (double)prim.Friction);
1690 cmd.Parameters.AddWithValue("Restitution", (double)prim.Restitution);
1691 }
1692  
1693 /// <summary>
1694 ///
1695 /// </summary>
1696 /// <param name="row"></param>
1697 /// <param name="taskItem"></param>
1698 private static void FillItemCommand(MySqlCommand cmd, TaskInventoryItem taskItem)
1699 {
1700 cmd.Parameters.AddWithValue("itemID", taskItem.ItemID);
1701 cmd.Parameters.AddWithValue("primID", taskItem.ParentPartID);
1702 cmd.Parameters.AddWithValue("assetID", taskItem.AssetID);
1703 cmd.Parameters.AddWithValue("parentFolderID", taskItem.ParentID);
1704  
1705 cmd.Parameters.AddWithValue("invType", taskItem.InvType);
1706 cmd.Parameters.AddWithValue("assetType", taskItem.Type);
1707  
1708 cmd.Parameters.AddWithValue("name", taskItem.Name);
1709 cmd.Parameters.AddWithValue("description", taskItem.Description);
1710 cmd.Parameters.AddWithValue("creationDate", taskItem.CreationDate);
1711 cmd.Parameters.AddWithValue("creatorID", taskItem.CreatorIdentification);
1712 cmd.Parameters.AddWithValue("ownerID", taskItem.OwnerID);
1713 cmd.Parameters.AddWithValue("lastOwnerID", taskItem.LastOwnerID);
1714 cmd.Parameters.AddWithValue("groupID", taskItem.GroupID);
1715 cmd.Parameters.AddWithValue("nextPermissions", taskItem.NextPermissions);
1716 cmd.Parameters.AddWithValue("currentPermissions", taskItem.CurrentPermissions);
1717 cmd.Parameters.AddWithValue("basePermissions", taskItem.BasePermissions);
1718 cmd.Parameters.AddWithValue("everyonePermissions", taskItem.EveryonePermissions);
1719 cmd.Parameters.AddWithValue("groupPermissions", taskItem.GroupPermissions);
1720 cmd.Parameters.AddWithValue("flags", taskItem.Flags);
1721 }
1722  
1723 /// <summary>
1724 ///
1725 /// </summary>
1726 private static void FillRegionSettingsCommand(MySqlCommand cmd, RegionSettings settings)
1727 {
1728 cmd.Parameters.AddWithValue("RegionUUID", settings.RegionUUID.ToString());
1729 cmd.Parameters.AddWithValue("BlockTerraform", settings.BlockTerraform);
1730 cmd.Parameters.AddWithValue("BlockFly", settings.BlockFly);
1731 cmd.Parameters.AddWithValue("AllowDamage", settings.AllowDamage);
1732 cmd.Parameters.AddWithValue("RestrictPushing", settings.RestrictPushing);
1733 cmd.Parameters.AddWithValue("AllowLandResell", settings.AllowLandResell);
1734 cmd.Parameters.AddWithValue("AllowLandJoinDivide", settings.AllowLandJoinDivide);
1735 cmd.Parameters.AddWithValue("BlockShowInSearch", settings.BlockShowInSearch);
1736 cmd.Parameters.AddWithValue("AgentLimit", settings.AgentLimit);
1737 cmd.Parameters.AddWithValue("ObjectBonus", settings.ObjectBonus);
1738 cmd.Parameters.AddWithValue("Maturity", settings.Maturity);
1739 cmd.Parameters.AddWithValue("DisableScripts", settings.DisableScripts);
1740 cmd.Parameters.AddWithValue("DisableCollisions", settings.DisableCollisions);
1741 cmd.Parameters.AddWithValue("DisablePhysics", settings.DisablePhysics);
1742 cmd.Parameters.AddWithValue("TerrainTexture1", settings.TerrainTexture1.ToString());
1743 cmd.Parameters.AddWithValue("TerrainTexture2", settings.TerrainTexture2.ToString());
1744 cmd.Parameters.AddWithValue("TerrainTexture3", settings.TerrainTexture3.ToString());
1745 cmd.Parameters.AddWithValue("TerrainTexture4", settings.TerrainTexture4.ToString());
1746 cmd.Parameters.AddWithValue("Elevation1NW", settings.Elevation1NW);
1747 cmd.Parameters.AddWithValue("Elevation2NW", settings.Elevation2NW);
1748 cmd.Parameters.AddWithValue("Elevation1NE", settings.Elevation1NE);
1749 cmd.Parameters.AddWithValue("Elevation2NE", settings.Elevation2NE);
1750 cmd.Parameters.AddWithValue("Elevation1SE", settings.Elevation1SE);
1751 cmd.Parameters.AddWithValue("Elevation2SE", settings.Elevation2SE);
1752 cmd.Parameters.AddWithValue("Elevation1SW", settings.Elevation1SW);
1753 cmd.Parameters.AddWithValue("Elevation2SW", settings.Elevation2SW);
1754 cmd.Parameters.AddWithValue("WaterHeight", settings.WaterHeight);
1755 cmd.Parameters.AddWithValue("TerrainRaiseLimit", settings.TerrainRaiseLimit);
1756 cmd.Parameters.AddWithValue("TerrainLowerLimit", settings.TerrainLowerLimit);
1757 cmd.Parameters.AddWithValue("UseEstateSun", settings.UseEstateSun);
1758 cmd.Parameters.AddWithValue("Sandbox", settings.Sandbox);
1759 cmd.Parameters.AddWithValue("SunVectorX", settings.SunVector.X);
1760 cmd.Parameters.AddWithValue("SunVectorY", settings.SunVector.Y);
1761 cmd.Parameters.AddWithValue("SunVectorZ", settings.SunVector.Z);
1762 cmd.Parameters.AddWithValue("FixedSun", settings.FixedSun);
1763 cmd.Parameters.AddWithValue("SunPosition", settings.SunPosition);
1764 cmd.Parameters.AddWithValue("Covenant", settings.Covenant.ToString());
1765 cmd.Parameters.AddWithValue("CovenantChangedDateTime", settings.CovenantChangedDateTime);
1766 cmd.Parameters.AddWithValue("LoadedCreationDateTime", settings.LoadedCreationDateTime);
1767 cmd.Parameters.AddWithValue("LoadedCreationID", settings.LoadedCreationID);
1768 cmd.Parameters.AddWithValue("TerrainImageID", settings.TerrainImageID);
1769  
1770 cmd.Parameters.AddWithValue("ParcelImageID", settings.ParcelImageID);
1771 cmd.Parameters.AddWithValue("TelehubObject", settings.TelehubObject);
1772 }
1773  
1774 /// <summary>
1775 ///
1776 /// </summary>
1777 /// <param name="row"></param>
1778 /// <param name="land"></param>
1779 /// <param name="regionUUID"></param>
1780 private static void FillLandCommand(MySqlCommand cmd, LandData land, UUID regionUUID)
1781 {
1782 cmd.Parameters.AddWithValue("UUID", land.GlobalID.ToString());
1783 cmd.Parameters.AddWithValue("RegionUUID", regionUUID.ToString());
1784 cmd.Parameters.AddWithValue("LocalLandID", land.LocalID);
1785  
1786 // Bitmap is a byte[512]
1787 cmd.Parameters.AddWithValue("Bitmap", land.Bitmap);
1788  
1789 cmd.Parameters.AddWithValue("Name", land.Name);
1790 cmd.Parameters.AddWithValue("Description", land.Description);
1791 cmd.Parameters.AddWithValue("OwnerUUID", land.OwnerID.ToString());
1792 cmd.Parameters.AddWithValue("IsGroupOwned", land.IsGroupOwned);
1793 cmd.Parameters.AddWithValue("Area", land.Area);
1794 cmd.Parameters.AddWithValue("AuctionID", land.AuctionID); //Unemplemented
1795 cmd.Parameters.AddWithValue("Category", land.Category); //Enum libsecondlife.Parcel.ParcelCategory
1796 cmd.Parameters.AddWithValue("ClaimDate", land.ClaimDate);
1797 cmd.Parameters.AddWithValue("ClaimPrice", land.ClaimPrice);
1798 cmd.Parameters.AddWithValue("GroupUUID", land.GroupID.ToString());
1799 cmd.Parameters.AddWithValue("SalePrice", land.SalePrice);
1800 cmd.Parameters.AddWithValue("LandStatus", land.Status); //Enum. libsecondlife.Parcel.ParcelStatus
1801 cmd.Parameters.AddWithValue("LandFlags", land.Flags);
1802 cmd.Parameters.AddWithValue("LandingType", land.LandingType);
1803 cmd.Parameters.AddWithValue("MediaAutoScale", land.MediaAutoScale);
1804 cmd.Parameters.AddWithValue("MediaTextureUUID", land.MediaID.ToString());
1805 cmd.Parameters.AddWithValue("MediaURL", land.MediaURL);
1806 cmd.Parameters.AddWithValue("MusicURL", land.MusicURL);
1807 cmd.Parameters.AddWithValue("PassHours", land.PassHours);
1808 cmd.Parameters.AddWithValue("PassPrice", land.PassPrice);
1809 cmd.Parameters.AddWithValue("SnapshotUUID", land.SnapshotID.ToString());
1810 cmd.Parameters.AddWithValue("UserLocationX", land.UserLocation.X);
1811 cmd.Parameters.AddWithValue("UserLocationY", land.UserLocation.Y);
1812 cmd.Parameters.AddWithValue("UserLocationZ", land.UserLocation.Z);
1813 cmd.Parameters.AddWithValue("UserLookAtX", land.UserLookAt.X);
1814 cmd.Parameters.AddWithValue("UserLookAtY", land.UserLookAt.Y);
1815 cmd.Parameters.AddWithValue("UserLookAtZ", land.UserLookAt.Z);
1816 cmd.Parameters.AddWithValue("AuthBuyerID", land.AuthBuyerID);
1817 cmd.Parameters.AddWithValue("OtherCleanTime", land.OtherCleanTime);
1818 cmd.Parameters.AddWithValue("MediaDescription", land.MediaDescription);
1819 cmd.Parameters.AddWithValue("MediaType", land.MediaType);
1820 cmd.Parameters.AddWithValue("MediaWidth", land.MediaWidth);
1821 cmd.Parameters.AddWithValue("MediaHeight", land.MediaHeight);
1822 cmd.Parameters.AddWithValue("MediaLoop", land.MediaLoop);
1823 cmd.Parameters.AddWithValue("ObscureMusic", land.ObscureMusic);
1824 cmd.Parameters.AddWithValue("ObscureMedia", land.ObscureMedia);
1825  
1826 }
1827  
1828 /// <summary>
1829 ///
1830 /// </summary>
1831 /// <param name="row"></param>
1832 /// <param name="entry"></param>
1833 /// <param name="parcelID"></param>
1834 private static void FillLandAccessCommand(MySqlCommand cmd, LandAccessEntry entry, UUID parcelID)
1835 {
1836 cmd.Parameters.AddWithValue("LandUUID", parcelID.ToString());
1837 cmd.Parameters.AddWithValue("AccessUUID", entry.AgentID.ToString());
1838 cmd.Parameters.AddWithValue("Flags", entry.Flags);
1839 cmd.Parameters.AddWithValue("Expires", entry.Expires.ToString());
1840 }
1841  
1842 /// <summary>
1843 ///
1844 /// </summary>
1845 /// <param name="row"></param>
1846 /// <returns></returns>
1847 private PrimitiveBaseShape BuildShape(IDataReader row)
1848 {
1849 PrimitiveBaseShape s = new PrimitiveBaseShape();
1850 s.Scale = new Vector3(
1851 (float)(double)row["ScaleX"],
1852 (float)(double)row["ScaleY"],
1853 (float)(double)row["ScaleZ"]
1854 );
1855 // paths
1856 s.PCode = (byte)(int)row["PCode"];
1857 s.PathBegin = (ushort)(int)row["PathBegin"];
1858 s.PathEnd = (ushort)(int)row["PathEnd"];
1859 s.PathScaleX = (byte)(int)row["PathScaleX"];
1860 s.PathScaleY = (byte)(int)row["PathScaleY"];
1861 s.PathShearX = (byte)(int)row["PathShearX"];
1862 s.PathShearY = (byte)(int)row["PathShearY"];
1863 s.PathSkew = (sbyte)(int)row["PathSkew"];
1864 s.PathCurve = (byte)(int)row["PathCurve"];
1865 s.PathRadiusOffset = (sbyte)(int)row["PathRadiusOffset"];
1866 s.PathRevolutions = (byte)(int)row["PathRevolutions"];
1867 s.PathTaperX = (sbyte)(int)row["PathTaperX"];
1868 s.PathTaperY = (sbyte)(int)row["PathTaperY"];
1869 s.PathTwist = (sbyte)(int)row["PathTwist"];
1870 s.PathTwistBegin = (sbyte)(int)row["PathTwistBegin"];
1871 // profile
1872 s.ProfileBegin = (ushort)(int)row["ProfileBegin"];
1873 s.ProfileEnd = (ushort)(int)row["ProfileEnd"];
1874 s.ProfileCurve = (byte)(int)row["ProfileCurve"];
1875 s.ProfileHollow = (ushort)(int)row["ProfileHollow"];
1876 s.TextureEntry = (byte[])row["Texture"];
1877  
1878 s.ExtraParams = (byte[])row["ExtraParams"];
1879  
1880 s.State = (byte)(int)row["State"];
1881 s.LastAttachPoint = (byte)(int)row["LastAttachPoint"];
1882  
1883 if (!(row["Media"] is System.DBNull))
1884 s.Media = PrimitiveBaseShape.MediaList.FromXml((string)row["Media"]);
1885  
1886 return s;
1887 }
1888  
1889 /// <summary>
1890 ///
1891 /// </summary>
1892 /// <param name="row"></param>
1893 /// <param name="prim"></param>
1894 private void FillShapeCommand(MySqlCommand cmd, SceneObjectPart prim)
1895 {
1896 PrimitiveBaseShape s = prim.Shape;
1897 cmd.Parameters.AddWithValue("UUID", prim.UUID.ToString());
1898 // shape is an enum
1899 cmd.Parameters.AddWithValue("Shape", 0);
1900 // vectors
1901 cmd.Parameters.AddWithValue("ScaleX", (double)s.Scale.X);
1902 cmd.Parameters.AddWithValue("ScaleY", (double)s.Scale.Y);
1903 cmd.Parameters.AddWithValue("ScaleZ", (double)s.Scale.Z);
1904 // paths
1905 cmd.Parameters.AddWithValue("PCode", s.PCode);
1906 cmd.Parameters.AddWithValue("PathBegin", s.PathBegin);
1907 cmd.Parameters.AddWithValue("PathEnd", s.PathEnd);
1908 cmd.Parameters.AddWithValue("PathScaleX", s.PathScaleX);
1909 cmd.Parameters.AddWithValue("PathScaleY", s.PathScaleY);
1910 cmd.Parameters.AddWithValue("PathShearX", s.PathShearX);
1911 cmd.Parameters.AddWithValue("PathShearY", s.PathShearY);
1912 cmd.Parameters.AddWithValue("PathSkew", s.PathSkew);
1913 cmd.Parameters.AddWithValue("PathCurve", s.PathCurve);
1914 cmd.Parameters.AddWithValue("PathRadiusOffset", s.PathRadiusOffset);
1915 cmd.Parameters.AddWithValue("PathRevolutions", s.PathRevolutions);
1916 cmd.Parameters.AddWithValue("PathTaperX", s.PathTaperX);
1917 cmd.Parameters.AddWithValue("PathTaperY", s.PathTaperY);
1918 cmd.Parameters.AddWithValue("PathTwist", s.PathTwist);
1919 cmd.Parameters.AddWithValue("PathTwistBegin", s.PathTwistBegin);
1920 // profile
1921 cmd.Parameters.AddWithValue("ProfileBegin", s.ProfileBegin);
1922 cmd.Parameters.AddWithValue("ProfileEnd", s.ProfileEnd);
1923 cmd.Parameters.AddWithValue("ProfileCurve", s.ProfileCurve);
1924 cmd.Parameters.AddWithValue("ProfileHollow", s.ProfileHollow);
1925 cmd.Parameters.AddWithValue("Texture", s.TextureEntry);
1926 cmd.Parameters.AddWithValue("ExtraParams", s.ExtraParams);
1927 cmd.Parameters.AddWithValue("State", s.State);
1928 cmd.Parameters.AddWithValue("LastAttachPoint", s.LastAttachPoint);
1929 cmd.Parameters.AddWithValue("Media", null == s.Media ? null : s.Media.ToXml());
1930 }
1931  
1932 public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items)
1933 {
1934 lock (m_dbLock)
1935 {
1936 RemoveItems(primID);
1937  
1938 if (items.Count == 0)
1939 return;
1940  
1941 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
1942 {
1943 dbcon.Open();
1944  
1945 using (MySqlCommand cmd = dbcon.CreateCommand())
1946 {
1947 cmd.CommandText = "insert into primitems (" +
1948 "invType, assetType, name, " +
1949 "description, creationDate, nextPermissions, " +
1950 "currentPermissions, basePermissions, " +
1951 "everyonePermissions, groupPermissions, " +
1952 "flags, itemID, primID, assetID, " +
1953 "parentFolderID, creatorID, ownerID, " +
1954 "groupID, lastOwnerID) values (?invType, " +
1955 "?assetType, ?name, ?description, " +
1956 "?creationDate, ?nextPermissions, " +
1957 "?currentPermissions, ?basePermissions, " +
1958 "?everyonePermissions, ?groupPermissions, " +
1959 "?flags, ?itemID, ?primID, ?assetID, " +
1960 "?parentFolderID, ?creatorID, ?ownerID, " +
1961 "?groupID, ?lastOwnerID)";
1962  
1963 foreach (TaskInventoryItem item in items)
1964 {
1965 cmd.Parameters.Clear();
1966  
1967 FillItemCommand(cmd, item);
1968  
1969 ExecuteNonQuery(cmd);
1970 }
1971 }
1972 }
1973 }
1974 }
1975  
1976 private void LoadSpawnPoints(RegionSettings rs)
1977 {
1978 rs.ClearSpawnPoints();
1979  
1980 lock (m_dbLock)
1981 {
1982 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
1983 {
1984 dbcon.Open();
1985  
1986 using (MySqlCommand cmd = dbcon.CreateCommand())
1987 {
1988 cmd.CommandText = "select Yaw, Pitch, Distance from spawn_points where RegionID = ?RegionID";
1989 cmd.Parameters.AddWithValue("?RegionID", rs.RegionUUID.ToString());
1990  
1991 using (IDataReader r = cmd.ExecuteReader())
1992 {
1993 while (r.Read())
1994 {
1995 SpawnPoint sp = new SpawnPoint();
1996  
1997 sp.Yaw = (float)r["Yaw"];
1998 sp.Pitch = (float)r["Pitch"];
1999 sp.Distance = (float)r["Distance"];
2000  
2001 rs.AddSpawnPoint(sp);
2002 }
2003 }
2004 }
2005 }
2006 }
2007 }
2008  
2009 private void SaveSpawnPoints(RegionSettings rs)
2010 {
2011 lock (m_dbLock)
2012 {
2013 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
2014 {
2015 dbcon.Open();
2016  
2017 using (MySqlCommand cmd = dbcon.CreateCommand())
2018 {
2019 cmd.CommandText = "delete from spawn_points where RegionID = ?RegionID";
2020 cmd.Parameters.AddWithValue("?RegionID", rs.RegionUUID.ToString());
2021  
2022 cmd.ExecuteNonQuery();
2023  
2024 cmd.Parameters.Clear();
2025  
2026 cmd.CommandText = "insert into spawn_points (RegionID, Yaw, Pitch, Distance) values ( ?RegionID, ?Yaw, ?Pitch, ?Distance)";
2027  
2028 foreach (SpawnPoint p in rs.SpawnPoints())
2029 {
2030 cmd.Parameters.AddWithValue("?RegionID", rs.RegionUUID.ToString());
2031 cmd.Parameters.AddWithValue("?Yaw", p.Yaw);
2032 cmd.Parameters.AddWithValue("?Pitch", p.Pitch);
2033 cmd.Parameters.AddWithValue("?Distance", p.Distance);
2034  
2035 cmd.ExecuteNonQuery();
2036 cmd.Parameters.Clear();
2037 }
2038 }
2039 }
2040 }
2041 }
2042  
2043 public void SaveExtra(UUID regionID, string name, string val)
2044 {
2045 lock (m_dbLock)
2046 {
2047 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
2048 {
2049 dbcon.Open();
2050  
2051 using (MySqlCommand cmd = dbcon.CreateCommand())
2052 {
2053 cmd.CommandText = "replace into regionextra values (?RegionID, ?Name, ?value)";
2054 cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
2055 cmd.Parameters.AddWithValue("?Name", name);
2056 cmd.Parameters.AddWithValue("?value", val);
2057  
2058 cmd.ExecuteNonQuery();
2059 }
2060 }
2061 }
2062 }
2063  
2064 public void RemoveExtra(UUID regionID, string name)
2065 {
2066 lock (m_dbLock)
2067 {
2068 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
2069 {
2070 dbcon.Open();
2071  
2072 using (MySqlCommand cmd = dbcon.CreateCommand())
2073 {
2074 cmd.CommandText = "delete from regionextra where RegionID=?RegionID and Name=?Name";
2075 cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
2076 cmd.Parameters.AddWithValue("?Name", name);
2077  
2078 cmd.ExecuteNonQuery();
2079 }
2080 }
2081 }
2082 }
2083  
2084 public Dictionary<string, string> GetExtra(UUID regionID)
2085 {
2086 Dictionary<string, string> ret = new Dictionary<string, string>();
2087  
2088 lock (m_dbLock)
2089 {
2090 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
2091 {
2092 dbcon.Open();
2093  
2094 using (MySqlCommand cmd = dbcon.CreateCommand())
2095 {
2096 cmd.CommandText = "select * from regionextra where RegionID=?RegionID";
2097 cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
2098 using (IDataReader r = cmd.ExecuteReader())
2099 {
2100 while (r.Read())
2101 {
2102 ret[r["Name"].ToString()] = r["value"].ToString();
2103 }
2104 }
2105 }
2106 }
2107 }
2108  
2109 return ret;
2110 }
2111 }
2112 }