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