aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Data/PGSQL/PGSQLSimulationData.cs
diff options
context:
space:
mode:
authorDavid Walter Seikel2016-11-03 21:44:39 +1000
committerDavid Walter Seikel2016-11-03 21:44:39 +1000
commit134f86e8d5c414409631b25b8c6f0ee45fbd8631 (patch)
tree216b89d3fb89acfb81be1e440c25c41ab09fa96d /OpenSim/Data/PGSQL/PGSQLSimulationData.cs
parentMore changing to production grid. Double oops. (diff)
downloadopensim-SC_OLD-134f86e8d5c414409631b25b8c6f0ee45fbd8631.zip
opensim-SC_OLD-134f86e8d5c414409631b25b8c6f0ee45fbd8631.tar.gz
opensim-SC_OLD-134f86e8d5c414409631b25b8c6f0ee45fbd8631.tar.bz2
opensim-SC_OLD-134f86e8d5c414409631b25b8c6f0ee45fbd8631.tar.xz
Initial update to OpenSim 0.8.2.1 source code.
Diffstat (limited to 'OpenSim/Data/PGSQL/PGSQLSimulationData.cs')
-rw-r--r--OpenSim/Data/PGSQL/PGSQLSimulationData.cs2243
1 files changed, 2243 insertions, 0 deletions
diff --git a/OpenSim/Data/PGSQL/PGSQLSimulationData.cs b/OpenSim/Data/PGSQL/PGSQLSimulationData.cs
new file mode 100644
index 0000000..77d87d4
--- /dev/null
+++ b/OpenSim/Data/PGSQL/PGSQLSimulationData.cs
@@ -0,0 +1,2243 @@
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
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Drawing;
32using System.IO;
33using System.Reflection;
34using log4net;
35using OpenMetaverse;
36using OpenSim.Framework;
37using OpenSim.Region.Framework.Interfaces;
38using OpenSim.Region.Framework.Scenes;
39using Npgsql;
40
41namespace 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}