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