clockwerk-opensim-stable – Blame information for rev 1

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