clockwerk-opensim – Blame information for rev 1

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