aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Client/Linden/LLProxyLoginModule.cs4
-rw-r--r--OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs39
-rw-r--r--OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs1531
-rw-r--r--OpenSim/Data/MSSQL/MSSQLRegionData.cs1616
-rw-r--r--OpenSim/Data/MSSQL/MSSQLUserAccountData.cs38
-rw-r--r--OpenSim/Data/MSSQL/Resources/006_GridStore.sql8
-rw-r--r--OpenSim/Data/MySQL/MySQLAuthenticationData.cs8
-rw-r--r--OpenSim/Data/MySQL/MySQLFramework.cs14
-rw-r--r--OpenSim/Data/MySQL/MySQLRegionData.cs2
-rw-r--r--OpenSim/Data/MySQL/MySQLUserAccountData.cs8
-rw-r--r--OpenSim/Framework/Servers/BaseOpenSimServer.cs8
-rw-r--r--OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs16
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs42
-rw-r--r--OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs12
-rw-r--r--OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs2
-rw-r--r--OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs5
-rw-r--r--OpenSim/Region/CoreModules/Asset/GlynnTuckerAssetCache.cs2
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs14
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs14
-rw-r--r--OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs13
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs2
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs12
-rw-r--r--OpenSim/Region/Physics/Manager/IMesher.cs2
-rw-r--r--OpenSim/Region/Physics/Meshing/Mesh.cs166
-rw-r--r--OpenSim/Region/Physics/Meshing/Meshmerizer.cs12
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs13
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs7
-rw-r--r--OpenSim/Server/Base/ServerUtils.cs2
-rw-r--r--OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs75
-rw-r--r--OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs4
-rw-r--r--OpenSim/Services/Connectors/Grid/GridServiceConnector.cs7
-rw-r--r--OpenSim/Services/GridService/GridService.cs26
-rw-r--r--bin/OpenSim.ini.example4
-rw-r--r--bin/config-include/GridCommon.ini.example4
34 files changed, 2111 insertions, 1621 deletions
diff --git a/OpenSim/Client/Linden/LLProxyLoginModule.cs b/OpenSim/Client/Linden/LLProxyLoginModule.cs
index 195feaf..f9cb3a9 100644
--- a/OpenSim/Client/Linden/LLProxyLoginModule.cs
+++ b/OpenSim/Client/Linden/LLProxyLoginModule.cs
@@ -148,8 +148,8 @@ namespace OpenSim.Client.Linden
148 protected void AddHttpHandlers() 148 protected void AddHttpHandlers()
149 { 149 {
150 //we will add our handlers to the first scene we received, as all scenes share a http server. But will this ever change? 150 //we will add our handlers to the first scene we received, as all scenes share a http server. But will this ever change?
151 MainServer.Instance.AddXmlRPCHandler("expect_user", ExpectUser); 151 MainServer.Instance.AddXmlRPCHandler("expect_user", ExpectUser, false);
152 MainServer.Instance.AddXmlRPCHandler("logoff_user", LogOffUser); 152 MainServer.Instance.AddXmlRPCHandler("logoff_user", LogOffUser, false);
153 } 153 }
154 154
155 protected void AddScene(Scene scene) 155 protected void AddScene(Scene scene)
diff --git a/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs b/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs
index 099faea..9a17e47 100644
--- a/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs
@@ -43,6 +43,7 @@ namespace OpenSim.Data.MSSQL
43 private List<string> m_ColumnNames = null; 43 private List<string> m_ColumnNames = null;
44 private int m_LastExpire = 0; 44 private int m_LastExpire = 0;
45 private string m_ConnectionString; 45 private string m_ConnectionString;
46 private MSSQLManager m_database;
46 47
47 public MSSQLAuthenticationData(string connectionString, string realm) 48 public MSSQLAuthenticationData(string connectionString, string realm)
48 { 49 {
@@ -61,12 +62,12 @@ namespace OpenSim.Data.MSSQL
61 AuthenticationData ret = new AuthenticationData(); 62 AuthenticationData ret = new AuthenticationData();
62 ret.Data = new Dictionary<string, object>(); 63 ret.Data = new Dictionary<string, object>();
63 64
64 string sql = string.Format("select * from '{0}' where UUID = @principalID", m_Realm); 65 string sql = string.Format("select * from {0} where UUID = @principalID", m_Realm);
65 66
66 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 67 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
67 using (SqlCommand cmd = new SqlCommand(sql, conn)) 68 using (SqlCommand cmd = new SqlCommand(sql, conn))
68 { 69 {
69 cmd.Parameters.AddWithValue("@principalID", principalID.ToString()); 70 cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID));
70 conn.Open(); 71 conn.Open();
71 using (SqlDataReader result = cmd.ExecuteReader()) 72 using (SqlDataReader result = cmd.ExecuteReader())
72 { 73 {
@@ -108,34 +109,33 @@ namespace OpenSim.Data.MSSQL
108 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 109 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
109 using (SqlCommand cmd = new SqlCommand()) 110 using (SqlCommand cmd = new SqlCommand())
110 { 111 {
111 updateBuilder.AppendFormat("update '{0}' set ", m_Realm); 112 updateBuilder.AppendFormat("update {0} set ", m_Realm);
112 113
113 bool first = true; 114 bool first = true;
114 foreach (string field in fields) 115 foreach (string field in fields)
115 { 116 {
116 if (!first) 117 if (!first)
117 updateBuilder.Append(", "); 118 updateBuilder.Append(", ");
118 updateBuilder.AppendFormat("'{0}' = @{0}",field); 119 updateBuilder.AppendFormat("{0} = @{0}",field);
119 120
120 first = false; 121 first = false;
121 122 cmd.Parameters.Add(m_database.CreateParameter("@" + field, data.Data[field]));
122 cmd.Parameters.AddWithValue("@" + field, data.Data[field]);
123 } 123 }
124 124
125 updateBuilder.Append(" where UUID = @principalID"); 125 updateBuilder.Append(" where UUID = @principalID");
126 126
127 cmd.CommandText = updateBuilder.ToString(); 127 cmd.CommandText = updateBuilder.ToString();
128 cmd.Connection = conn; 128 cmd.Connection = conn;
129 129 cmd.Parameters.Add(m_database.CreateParameter("@principalID", data.PrincipalID));
130 cmd.Parameters.AddWithValue("@principalID", data.PrincipalID.ToString()); 130
131 conn.Open(); 131 conn.Open();
132 if (cmd.ExecuteNonQuery() < 1) 132 if (cmd.ExecuteNonQuery() < 1)
133 { 133 {
134 StringBuilder insertBuilder = new StringBuilder(); 134 StringBuilder insertBuilder = new StringBuilder();
135 135
136 insertBuilder.AppendFormat("insert into '{0}' ('UUID', '", m_Realm); 136 insertBuilder.AppendFormat("insert into {0} (UUID, ", m_Realm);
137 insertBuilder.Append(String.Join("', '", fields)); 137 insertBuilder.Append(String.Join(", ", fields));
138 insertBuilder.Append("') values (@principalID, @"); 138 insertBuilder.Append(") values ( @principalID, @");
139 insertBuilder.Append(String.Join(", @", fields)); 139 insertBuilder.Append(String.Join(", @", fields));
140 insertBuilder.Append(")"); 140 insertBuilder.Append(")");
141 141
@@ -152,12 +152,11 @@ namespace OpenSim.Data.MSSQL
152 152
153 public bool SetDataItem(UUID principalID, string item, string value) 153 public bool SetDataItem(UUID principalID, string item, string value)
154 { 154 {
155 string sql = string.Format("update '{0}' set '{1}' = @{1} where UUID = @UUID", m_Realm, item); 155 string sql = string.Format("update {0} set {1} = @{1} where UUID = @UUID", m_Realm, item);
156 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 156 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
157 using (SqlCommand cmd = new SqlCommand(sql, conn)) 157 using (SqlCommand cmd = new SqlCommand(sql, conn))
158 { 158 {
159 cmd.Parameters.AddWithValue("@" + item, value); 159 cmd.Parameters.Add(m_database.CreateParameter("@" + item, value));
160 cmd.Parameters.AddWithValue("@UUID", principalID.ToString());
161 conn.Open(); 160 conn.Open();
162 if (cmd.ExecuteNonQuery() > 0) 161 if (cmd.ExecuteNonQuery() > 0)
163 return true; 162 return true;
@@ -173,9 +172,9 @@ namespace OpenSim.Data.MSSQL
173 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 172 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
174 using (SqlCommand cmd = new SqlCommand(sql, conn)) 173 using (SqlCommand cmd = new SqlCommand(sql, conn))
175 { 174 {
176 cmd.Parameters.AddWithValue("@principalID", principalID.ToString()); 175 cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID));
177 cmd.Parameters.AddWithValue("@token", token); 176 cmd.Parameters.Add(m_database.CreateParameter("@token", token));
178 cmd.Parameters.AddWithValue("@lifetime", lifetime.ToString()); 177 cmd.Parameters.Add(m_database.CreateParameter("@lifetime", lifetime));
179 conn.Open(); 178 conn.Open();
180 179
181 if (cmd.ExecuteNonQuery() > 0) 180 if (cmd.ExecuteNonQuery() > 0)
@@ -194,9 +193,9 @@ namespace OpenSim.Data.MSSQL
194 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 193 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
195 using (SqlCommand cmd = new SqlCommand(sql, conn)) 194 using (SqlCommand cmd = new SqlCommand(sql, conn))
196 { 195 {
197 cmd.Parameters.AddWithValue("@principalID", principalID.ToString()); 196 cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID));
198 cmd.Parameters.AddWithValue("@token", token); 197 cmd.Parameters.Add(m_database.CreateParameter("@token", token));
199 cmd.Parameters.AddWithValue("@lifetime", lifetime.ToString()); 198 cmd.Parameters.Add(m_database.CreateParameter("@lifetime", lifetime));
200 conn.Open(); 199 conn.Open();
201 200
202 if (cmd.ExecuteNonQuery() > 0) 201 if (cmd.ExecuteNonQuery() > 0)
diff --git a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs b/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
new file mode 100644
index 0000000..e2ae5cb
--- /dev/null
+++ b/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
@@ -0,0 +1,1531 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Data.SqlClient;
32using System.Drawing;
33using System.IO;
34using System.Reflection;
35using log4net;
36using OpenMetaverse;
37using OpenSim.Framework;
38using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes;
40
41namespace OpenSim.Data.MSSQL
42{
43 /// <summary>
44 /// A MSSQL Interface for the Region Server.
45 /// </summary>
46 public class MSSQLRegionDataStore : IRegionDataStore
47 {
48 private const string _migrationStore = "RegionStore";
49
50 // private static FileSystemDataStore Instance = new FileSystemDataStore();
51 private static readonly ILog _Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52
53 /// <summary>
54 /// The database manager
55 /// </summary>
56 private MSSQLManager _Database;
57
58 /// <summary>
59 /// Initialises the region datastore
60 /// </summary>
61 /// <param name="connectionString">The connection string.</param>
62 public void Initialise(string connectionString)
63 {
64 if (!string.IsNullOrEmpty(connectionString))
65 {
66 _Database = new MSSQLManager(connectionString);
67 }
68 else
69 {
70 IniFile iniFile = new IniFile("mssql_connection.ini");
71 string settingDataSource = iniFile.ParseFileReadValue("data_source");
72 string settingInitialCatalog = iniFile.ParseFileReadValue("initial_catalog");
73 string settingPersistSecurityInfo = iniFile.ParseFileReadValue("persist_security_info");
74 string settingUserId = iniFile.ParseFileReadValue("user_id");
75 string settingPassword = iniFile.ParseFileReadValue("password");
76
77 _Database = new MSSQLManager(settingDataSource, settingInitialCatalog, settingPersistSecurityInfo, settingUserId, settingPassword);
78 }
79
80 //Migration settings
81 _Database.CheckMigration(_migrationStore);
82 }
83
84 /// <summary>
85 /// Dispose the database
86 /// </summary>
87 public void Dispose() { }
88
89 #region SceneObjectGroup region for loading and Store of the scene.
90
91 /// <summary>
92 /// Loads the objects present in the region.
93 /// </summary>
94 /// <param name="regionUUID">The region UUID.</param>
95 /// <returns></returns>
96 public List<SceneObjectGroup> LoadObjects(UUID regionUUID)
97 {
98 UUID lastGroupID = UUID.Zero;
99
100 Dictionary<UUID, SceneObjectPart> prims = new Dictionary<UUID, SceneObjectPart>();
101 Dictionary<UUID, SceneObjectGroup> objects = new Dictionary<UUID, SceneObjectGroup>();
102 SceneObjectGroup grp = null;
103
104
105 string query = "SELECT *, " +
106 "sort = CASE WHEN prims.UUID = prims.SceneGroupID THEN 0 ELSE 1 END " +
107 "FROM prims " +
108 "LEFT JOIN primshapes ON prims.UUID = primshapes.UUID " +
109 "WHERE RegionUUID = @RegionUUID " +
110 "ORDER BY SceneGroupID asc, sort asc, LinkNumber asc";
111
112 using (AutoClosingSqlCommand command = _Database.Query(query))
113 {
114 command.Parameters.Add(_Database.CreateParameter("@regionUUID", regionUUID));
115
116 using (SqlDataReader reader = command.ExecuteReader())
117 {
118 while (reader.Read())
119 {
120 SceneObjectPart sceneObjectPart = BuildPrim(reader);
121 if (reader["Shape"] is DBNull)
122 sceneObjectPart.Shape = PrimitiveBaseShape.Default;
123 else
124 sceneObjectPart.Shape = BuildShape(reader);
125
126 prims[sceneObjectPart.UUID] = sceneObjectPart;
127
128 UUID groupID = new UUID((Guid)reader["SceneGroupID"]);
129
130 if (groupID != lastGroupID) // New SOG
131 {
132 if (grp != null)
133 objects[grp.UUID] = grp;
134
135 lastGroupID = groupID;
136
137 // There sometimes exist OpenSim bugs that 'orphan groups' so that none of the prims are
138 // recorded as the root prim (for which the UUID must equal the persisted group UUID). In
139 // this case, force the UUID to be the same as the group UUID so that at least these can be
140 // deleted (we need to change the UUID so that any other prims in the linkset can also be
141 // deleted).
142 if (sceneObjectPart.UUID != groupID && groupID != UUID.Zero)
143 {
144 _Log.WarnFormat(
145 "[REGION DB]: Found root prim {0} {1} at {2} where group was actually {3}. Forcing UUID to group UUID",
146 sceneObjectPart.Name, sceneObjectPart.UUID, sceneObjectPart.GroupPosition, groupID);
147
148 sceneObjectPart.UUID = groupID;
149 }
150
151 grp = new SceneObjectGroup(sceneObjectPart);
152 }
153 else
154 {
155 // Black magic to preserve link numbers
156 // Why is this needed, fix this in AddPart method.
157 int link = sceneObjectPart.LinkNum;
158
159 grp.AddPart(sceneObjectPart);
160
161 if (link != 0)
162 sceneObjectPart.LinkNum = link;
163 }
164 }
165 }
166 }
167
168 if (grp != null)
169 objects[grp.UUID] = grp;
170
171 // Instead of attempting to LoadItems on every prim,
172 // most of which probably have no items... get a
173 // list from DB of all prims which have items and
174 // LoadItems only on those
175 List<SceneObjectPart> primsWithInventory = new List<SceneObjectPart>();
176 string qry = "select distinct primID from primitems";
177 using (AutoClosingSqlCommand command = _Database.Query(qry))
178 {
179 using (SqlDataReader itemReader = command.ExecuteReader())
180 {
181 while (itemReader.Read())
182 {
183 if (!(itemReader["primID"] is DBNull))
184 {
185 UUID primID = new UUID(itemReader["primID"].ToString());
186 if (prims.ContainsKey(primID))
187 {
188 primsWithInventory.Add(prims[primID]);
189 }
190 }
191 }
192 }
193 }
194
195 LoadItems(primsWithInventory);
196
197 _Log.DebugFormat("[REGION DB]: Loaded {0} objects using {1} prims", objects.Count, prims.Count);
198
199 return new List<SceneObjectGroup>(objects.Values);
200 }
201
202 /// <summary>
203 /// Load in the prim's persisted inventory.
204 /// </summary>
205 /// <param name="allPrims">all prims with inventory on a region</param>
206 private void LoadItems(List<SceneObjectPart> allPrimsWithInventory)
207 {
208
209 using (AutoClosingSqlCommand command = _Database.Query("SELECT * FROM primitems WHERE PrimID = @PrimID"))
210 {
211 foreach (SceneObjectPart objectPart in allPrimsWithInventory)
212 {
213 command.Parameters.Clear();
214 command.Parameters.Add(_Database.CreateParameter("@PrimID", objectPart.UUID));
215
216 List<TaskInventoryItem> inventory = new List<TaskInventoryItem>();
217
218 using (SqlDataReader reader = command.ExecuteReader())
219 {
220 while (reader.Read())
221 {
222 TaskInventoryItem item = BuildItem(reader);
223
224 item.ParentID = objectPart.UUID; // Values in database are
225 // often wrong
226 inventory.Add(item);
227 }
228 }
229
230 objectPart.Inventory.RestoreInventoryItems(inventory);
231 }
232 }
233 }
234
235 /// <summary>
236 /// Stores all object's details apart from inventory
237 /// </summary>
238 /// <param name="obj"></param>
239 /// <param name="regionUUID"></param>
240 public void StoreObject(SceneObjectGroup obj, UUID regionUUID)
241 {
242 _Log.InfoFormat("[MSSQL]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Children.Count);
243
244 using (SqlConnection conn = _Database.DatabaseConnection())
245 {
246 SqlTransaction transaction = conn.BeginTransaction();
247
248 try
249 {
250 foreach (SceneObjectPart sceneObjectPart in obj.Children.Values)
251 {
252 //Update prim
253 using (SqlCommand sqlCommand = conn.CreateCommand())
254 {
255 sqlCommand.Transaction = transaction;
256 try
257 {
258 StoreSceneObjectPrim(sceneObjectPart, sqlCommand, obj.UUID, regionUUID);
259 }
260 catch (SqlException sqlEx)
261 {
262 _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrim SQL error: {0} at line {1}", sqlEx.Message, sqlEx.LineNumber);
263 throw;
264 }
265 }
266
267 //Update primshapes
268 using (SqlCommand sqlCommand = conn.CreateCommand())
269 {
270 sqlCommand.Transaction = transaction;
271 try
272 {
273 StoreSceneObjectPrimShapes(sceneObjectPart, sqlCommand, obj.UUID, regionUUID);
274 }
275 catch (SqlException sqlEx)
276 {
277 _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrimShapes SQL error: {0} at line {1}", sqlEx.Message, sqlEx.LineNumber);
278 throw;
279 }
280 }
281 }
282
283 transaction.Commit();
284 }
285 catch (Exception ex)
286 {
287 _Log.ErrorFormat("[REGION DB]: Store SceneObjectGroup error: {0}, Rolling back...", ex.Message);
288 try
289 {
290 transaction.Rollback();
291 }
292 catch (Exception ex2)
293 {
294 //Show error
295 _Log.InfoFormat("[REGION DB]: Rollback of SceneObjectGroup store transaction failed with error: {0}", ex2.Message);
296
297 }
298 }
299 }
300
301 }
302
303 /// <summary>
304 /// Stores the prim of the sceneobjectpart.
305 /// </summary>
306 /// <param name="sceneObjectPart">The sceneobjectpart or prim.</param>
307 /// <param name="sqlCommand">The SQL command with the transaction.</param>
308 /// <param name="sceneGroupID">The scenegroup UUID.</param>
309 /// <param name="regionUUID">The region UUID.</param>
310 private void StoreSceneObjectPrim(SceneObjectPart sceneObjectPart, SqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID)
311 {
312 //Big query to update or insert a new prim.
313 //Note for SQL Server 2008 this could be simplified
314 string queryPrims = @"
315IF EXISTS (SELECT UUID FROM prims WHERE UUID = @UUID)
316 BEGIN
317 UPDATE prims SET
318 CreationDate = @CreationDate, Name = @Name, Text = @Text, Description = @Description, SitName = @SitName,
319 TouchName = @TouchName, ObjectFlags = @ObjectFlags, OwnerMask = @OwnerMask, NextOwnerMask = @NextOwnerMask, GroupMask = @GroupMask,
320 EveryoneMask = @EveryoneMask, BaseMask = @BaseMask, PositionX = @PositionX, PositionY = @PositionY, PositionZ = @PositionZ,
321 GroupPositionX = @GroupPositionX, GroupPositionY = @GroupPositionY, GroupPositionZ = @GroupPositionZ, VelocityX = @VelocityX,
322 VelocityY = @VelocityY, VelocityZ = @VelocityZ, AngularVelocityX = @AngularVelocityX, AngularVelocityY = @AngularVelocityY,
323 AngularVelocityZ = @AngularVelocityZ, AccelerationX = @AccelerationX, AccelerationY = @AccelerationY,
324 AccelerationZ = @AccelerationZ, RotationX = @RotationX, RotationY = @RotationY, RotationZ = @RotationZ, RotationW = @RotationW,
325 SitTargetOffsetX = @SitTargetOffsetX, SitTargetOffsetY = @SitTargetOffsetY, SitTargetOffsetZ = @SitTargetOffsetZ,
326 SitTargetOrientW = @SitTargetOrientW, SitTargetOrientX = @SitTargetOrientX, SitTargetOrientY = @SitTargetOrientY,
327 SitTargetOrientZ = @SitTargetOrientZ, RegionUUID = @RegionUUID, CreatorID = @CreatorID, OwnerID = @OwnerID, GroupID = @GroupID,
328 LastOwnerID = @LastOwnerID, SceneGroupID = @SceneGroupID, PayPrice = @PayPrice, PayButton1 = @PayButton1, PayButton2 = @PayButton2,
329 PayButton3 = @PayButton3, PayButton4 = @PayButton4, LoopedSound = @LoopedSound, LoopedSoundGain = @LoopedSoundGain,
330 TextureAnimation = @TextureAnimation, OmegaX = @OmegaX, OmegaY = @OmegaY, OmegaZ = @OmegaZ, CameraEyeOffsetX = @CameraEyeOffsetX,
331 CameraEyeOffsetY = @CameraEyeOffsetY, CameraEyeOffsetZ = @CameraEyeOffsetZ, CameraAtOffsetX = @CameraAtOffsetX,
332 CameraAtOffsetY = @CameraAtOffsetY, CameraAtOffsetZ = @CameraAtOffsetZ, ForceMouselook = @ForceMouselook,
333 ScriptAccessPin = @ScriptAccessPin, AllowedDrop = @AllowedDrop, DieAtEdge = @DieAtEdge, SalePrice = @SalePrice,
334 SaleType = @SaleType, ColorR = @ColorR, ColorG = @ColorG, ColorB = @ColorB, ColorA = @ColorA, ParticleSystem = @ParticleSystem,
335 ClickAction = @ClickAction, Material = @Material, CollisionSound = @CollisionSound, CollisionSoundVolume = @CollisionSoundVolume, PassTouches = @PassTouches,
336 LinkNumber = @LinkNumber
337 WHERE UUID = @UUID
338 END
339ELSE
340 BEGIN
341 INSERT INTO
342 prims (
343 UUID, CreationDate, Name, Text, Description, SitName, TouchName, ObjectFlags, OwnerMask, NextOwnerMask, GroupMask,
344 EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX,
345 VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ,
346 RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW,
347 SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, RegionUUID, CreatorID, OwnerID, GroupID, LastOwnerID, SceneGroupID,
348 PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX,
349 OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ,
350 ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA,
351 ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, PassTouches, LinkNumber
352 ) VALUES (
353 @UUID, @CreationDate, @Name, @Text, @Description, @SitName, @TouchName, @ObjectFlags, @OwnerMask, @NextOwnerMask, @GroupMask,
354 @EveryoneMask, @BaseMask, @PositionX, @PositionY, @PositionZ, @GroupPositionX, @GroupPositionY, @GroupPositionZ, @VelocityX,
355 @VelocityY, @VelocityZ, @AngularVelocityX, @AngularVelocityY, @AngularVelocityZ, @AccelerationX, @AccelerationY, @AccelerationZ,
356 @RotationX, @RotationY, @RotationZ, @RotationW, @SitTargetOffsetX, @SitTargetOffsetY, @SitTargetOffsetZ, @SitTargetOrientW,
357 @SitTargetOrientX, @SitTargetOrientY, @SitTargetOrientZ, @RegionUUID, @CreatorID, @OwnerID, @GroupID, @LastOwnerID, @SceneGroupID,
358 @PayPrice, @PayButton1, @PayButton2, @PayButton3, @PayButton4, @LoopedSound, @LoopedSoundGain, @TextureAnimation, @OmegaX,
359 @OmegaY, @OmegaZ, @CameraEyeOffsetX, @CameraEyeOffsetY, @CameraEyeOffsetZ, @CameraAtOffsetX, @CameraAtOffsetY, @CameraAtOffsetZ,
360 @ForceMouselook, @ScriptAccessPin, @AllowedDrop, @DieAtEdge, @SalePrice, @SaleType, @ColorR, @ColorG, @ColorB, @ColorA,
361 @ParticleSystem, @ClickAction, @Material, @CollisionSound, @CollisionSoundVolume, @PassTouches, @LinkNumber
362 )
363 END";
364
365 //Set commandtext.
366 sqlCommand.CommandText = queryPrims;
367 //Add parameters
368 sqlCommand.Parameters.AddRange(CreatePrimParameters(sceneObjectPart, sceneGroupID, regionUUID));
369
370 //Execute the query. If it fails then error is trapped in calling function
371 sqlCommand.ExecuteNonQuery();
372 }
373
374 /// <summary>
375 /// Stores the scene object prim shapes.
376 /// </summary>
377 /// <param name="sceneObjectPart">The sceneobjectpart containing prim shape.</param>
378 /// <param name="sqlCommand">The SQL command with the transaction.</param>
379 /// <param name="sceneGroupID">The scenegroup UUID.</param>
380 /// <param name="regionUUID">The region UUID.</param>
381 private void StoreSceneObjectPrimShapes(SceneObjectPart sceneObjectPart, SqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID)
382 {
383 //Big query to or insert or update primshapes
384 //Note for SQL Server 2008 this can be simplified
385 string queryPrimShapes = @"
386IF EXISTS (SELECT UUID FROM primshapes WHERE UUID = @UUID)
387 BEGIN
388 UPDATE primshapes SET
389 Shape = @Shape, ScaleX = @ScaleX, ScaleY = @ScaleY, ScaleZ = @ScaleZ, PCode = @PCode, PathBegin = @PathBegin,
390 PathEnd = @PathEnd, PathScaleX = @PathScaleX, PathScaleY = @PathScaleY, PathShearX = @PathShearX, PathShearY = @PathShearY,
391 PathSkew = @PathSkew, PathCurve = @PathCurve, PathRadiusOffset = @PathRadiusOffset, PathRevolutions = @PathRevolutions,
392 PathTaperX = @PathTaperX, PathTaperY = @PathTaperY, PathTwist = @PathTwist, PathTwistBegin = @PathTwistBegin,
393 ProfileBegin = @ProfileBegin, ProfileEnd = @ProfileEnd, ProfileCurve = @ProfileCurve, ProfileHollow = @ProfileHollow,
394 Texture = @Texture, ExtraParams = @ExtraParams, State = @State
395 WHERE UUID = @UUID
396 END
397ELSE
398 BEGIN
399 INSERT INTO
400 primshapes (
401 UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY,
402 PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin,
403 ProfileEnd, ProfileCurve, ProfileHollow, Texture, ExtraParams, State
404 ) VALUES (
405 @UUID, @Shape, @ScaleX, @ScaleY, @ScaleZ, @PCode, @PathBegin, @PathEnd, @PathScaleX, @PathScaleY, @PathShearX, @PathShearY,
406 @PathSkew, @PathCurve, @PathRadiusOffset, @PathRevolutions, @PathTaperX, @PathTaperY, @PathTwist, @PathTwistBegin, @ProfileBegin,
407 @ProfileEnd, @ProfileCurve, @ProfileHollow, @Texture, @ExtraParams, @State
408 )
409 END";
410
411 //Set commandtext.
412 sqlCommand.CommandText = queryPrimShapes;
413
414 //Add parameters
415 sqlCommand.Parameters.AddRange(CreatePrimShapeParameters(sceneObjectPart, sceneGroupID, regionUUID));
416
417 //Execute the query. If it fails then error is trapped in calling function
418 sqlCommand.ExecuteNonQuery();
419
420 }
421
422 /// <summary>
423 /// Removes a object from the database.
424 /// Meaning removing it from tables Prims, PrimShapes and PrimItems
425 /// </summary>
426 /// <param name="objectID">id of scenegroup</param>
427 /// <param name="regionUUID">regionUUID (is this used anyway</param>
428 public void RemoveObject(UUID objectID, UUID regionUUID)
429 {
430 _Log.InfoFormat("[MSSQL]: Removing obj: {0} from region: {1}", objectID, regionUUID);
431
432 //Remove from prims and primsitem table
433 string sqlPrims = "DELETE FROM PRIMS WHERE SceneGroupID = @objectID";
434 string sqlPrimItems = "DELETE FROM PRIMITEMS WHERE primID in (SELECT UUID FROM PRIMS WHERE SceneGroupID = @objectID)";
435 string sqlPrimShapes = "DELETE FROM PRIMSHAPES WHERE uuid in (SELECT UUID FROM PRIMS WHERE SceneGroupID = @objectID)";
436
437 lock (_Database)
438 {
439 //Using the non transaction mode.
440 using (AutoClosingSqlCommand cmd = _Database.Query(sqlPrimShapes))
441 {
442 cmd.Parameters.Add(_Database.CreateParameter("objectID", objectID));
443 cmd.ExecuteNonQuery();
444
445 cmd.CommandText = sqlPrimItems;
446 cmd.ExecuteNonQuery();
447
448 cmd.CommandText = sqlPrims;
449 cmd.ExecuteNonQuery();
450 }
451 }
452 }
453
454 /// <summary>
455 /// Store the inventory of a prim. Warning deletes everything first and then adds all again.
456 /// </summary>
457 /// <param name="primID"></param>
458 /// <param name="items"></param>
459 public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items)
460 {
461 //_Log.InfoFormat("[REGION DB: Persisting Prim Inventory with prim ID {0}", primID);
462
463 //Statement from MySQL section!
464 // For now, we're just going to crudely remove all the previous inventory items
465 // no matter whether they have changed or not, and replace them with the current set.
466
467 //Delete everything from PrimID
468 //TODO add index on PrimID in DB, if not already exist
469 using (AutoClosingSqlCommand cmd = _Database.Query("DELETE PRIMITEMS WHERE primID = @primID"))
470 {
471 cmd.Parameters.Add(_Database.CreateParameter("@primID", primID));
472 cmd.ExecuteNonQuery();
473 }
474
475 string sql =
476 @"INSERT INTO primitems (
477 itemID,primID,assetID,parentFolderID,invType,assetType,name,description,creationDate,creatorID,ownerID,lastOwnerID,groupID,
478 nextPermissions,currentPermissions,basePermissions,everyonePermissions,groupPermissions,flags)
479 VALUES (@itemID,@primID,@assetID,@parentFolderID,@invType,@assetType,@name,@description,@creationDate,@creatorID,@ownerID,
480 @lastOwnerID,@groupID,@nextPermissions,@currentPermissions,@basePermissions,@everyonePermissions,@groupPermissions,@flags)";
481
482 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
483 {
484 foreach (TaskInventoryItem taskItem in items)
485 {
486 cmd.Parameters.AddRange(CreatePrimInventoryParameters(taskItem));
487 cmd.ExecuteNonQuery();
488
489 cmd.Parameters.Clear();
490 }
491 }
492 }
493
494 #endregion
495
496 /// <summary>
497 /// Loads the terrain map.
498 /// </summary>
499 /// <param name="regionID">regionID.</param>
500 /// <returns></returns>
501 public double[,] LoadTerrain(UUID regionID)
502 {
503 double[,] terrain = new double[(int)Constants.RegionSize, (int)Constants.RegionSize];
504 terrain.Initialize();
505
506 string sql = "select top 1 RegionUUID, Revision, Heightfield from terrain where RegionUUID = @RegionUUID order by Revision desc";
507
508 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
509 {
510 // MySqlParameter param = new MySqlParameter();
511 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
512
513 using (SqlDataReader reader = cmd.ExecuteReader())
514 {
515 int rev;
516 if (reader.Read())
517 {
518 MemoryStream str = new MemoryStream((byte[])reader["Heightfield"]);
519 BinaryReader br = new BinaryReader(str);
520 for (int x = 0; x < (int)Constants.RegionSize; x++)
521 {
522 for (int y = 0; y < (int)Constants.RegionSize; y++)
523 {
524 terrain[x, y] = br.ReadDouble();
525 }
526 }
527 rev = (int)reader["Revision"];
528 }
529 else
530 {
531 _Log.Info("[REGION DB]: No terrain found for region");
532 return null;
533 }
534 _Log.Info("[REGION DB]: Loaded terrain revision r" + rev);
535 }
536 }
537
538 return terrain;
539 }
540
541 /// <summary>
542 /// Stores the terrain map to DB.
543 /// </summary>
544 /// <param name="terrain">terrain map data.</param>
545 /// <param name="regionID">regionID.</param>
546 public void StoreTerrain(double[,] terrain, UUID regionID)
547 {
548 int revision = Util.UnixTimeSinceEpoch();
549
550 //Delete old terrain map
551 string sql = "delete from terrain where RegionUUID=@RegionUUID";
552 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
553 {
554 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
555 cmd.ExecuteNonQuery();
556 }
557
558 sql = "insert into terrain(RegionUUID, Revision, Heightfield) values(@RegionUUID, @Revision, @Heightfield)";
559
560 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
561 {
562 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
563 cmd.Parameters.Add(_Database.CreateParameter("@Revision", revision));
564 cmd.Parameters.Add(_Database.CreateParameter("@Heightfield", serializeTerrain(terrain)));
565 cmd.ExecuteNonQuery();
566 }
567
568 _Log.Info("[REGION DB]: Stored terrain revision r " + revision);
569 }
570
571 /// <summary>
572 /// Loads all the land objects of a region.
573 /// </summary>
574 /// <param name="regionUUID">The region UUID.</param>
575 /// <returns></returns>
576 public List<LandData> LoadLandObjects(UUID regionUUID)
577 {
578 List<LandData> LandDataForRegion = new List<LandData>();
579
580 string sql = "select * from land where RegionUUID = @RegionUUID";
581
582 //Retrieve all land data from region
583 using (AutoClosingSqlCommand cmdLandData = _Database.Query(sql))
584 {
585 cmdLandData.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionUUID));
586
587 using (SqlDataReader readerLandData = cmdLandData.ExecuteReader())
588 {
589 while (readerLandData.Read())
590 {
591 LandDataForRegion.Add(BuildLandData(readerLandData));
592 }
593 }
594 }
595
596 //Retrieve all accesslist data for all landdata
597 foreach (LandData LandData in LandDataForRegion)
598 {
599 sql = "select * from landaccesslist where LandUUID = @LandUUID";
600 using (AutoClosingSqlCommand cmdAccessList = _Database.Query(sql))
601 {
602 cmdAccessList.Parameters.Add(_Database.CreateParameter("@LandUUID", LandData.GlobalID));
603 using (SqlDataReader readerAccessList = cmdAccessList.ExecuteReader())
604 {
605 while (readerAccessList.Read())
606 {
607 LandData.ParcelAccessList.Add(BuildLandAccessData(readerAccessList));
608 }
609 }
610 }
611 }
612
613 //Return data
614 return LandDataForRegion;
615 }
616
617 /// <summary>
618 /// Stores land object with landaccess list.
619 /// </summary>
620 /// <param name="parcel">parcel data.</param>
621 public void StoreLandObject(ILandObject parcel)
622 {
623 //As this is only one record in land table I just delete all and then add a new record.
624 //As the delete landaccess is already in the mysql code
625
626 //Delete old values
627 RemoveLandObject(parcel.LandData.GlobalID);
628
629 //Insert new values
630 string sql = @"INSERT INTO [land]
631([UUID],[RegionUUID],[LocalLandID],[Bitmap],[Name],[Description],[OwnerUUID],[IsGroupOwned],[Area],[AuctionID],[Category],[ClaimDate],[ClaimPrice],[GroupUUID],[SalePrice],[LandStatus],[LandFlags],[LandingType],[MediaAutoScale],[MediaTextureUUID],[MediaURL],[MusicURL],[PassHours],[PassPrice],[SnapshotUUID],[UserLocationX],[UserLocationY],[UserLocationZ],[UserLookAtX],[UserLookAtY],[UserLookAtZ],[AuthbuyerID],[OtherCleanTime],[Dwell])
632VALUES
633(@UUID,@RegionUUID,@LocalLandID,@Bitmap,@Name,@Description,@OwnerUUID,@IsGroupOwned,@Area,@AuctionID,@Category,@ClaimDate,@ClaimPrice,@GroupUUID,@SalePrice,@LandStatus,@LandFlags,@LandingType,@MediaAutoScale,@MediaTextureUUID,@MediaURL,@MusicURL,@PassHours,@PassPrice,@SnapshotUUID,@UserLocationX,@UserLocationY,@UserLocationZ,@UserLookAtX,@UserLookAtY,@UserLookAtZ,@AuthbuyerID,@OtherCleanTime,@Dwell)";
634
635 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
636 {
637 cmd.Parameters.AddRange(CreateLandParameters(parcel.LandData, parcel.RegionUUID));
638
639 cmd.ExecuteNonQuery();
640 }
641
642 sql = "INSERT INTO [landaccesslist] ([LandUUID],[AccessUUID],[Flags]) VALUES (@LandUUID,@AccessUUID,@Flags)";
643
644 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
645 {
646 foreach (ParcelManager.ParcelAccessEntry parcelAccessEntry in parcel.LandData.ParcelAccessList)
647 {
648 cmd.Parameters.AddRange(CreateLandAccessParameters(parcelAccessEntry, parcel.RegionUUID));
649
650 cmd.ExecuteNonQuery();
651 cmd.Parameters.Clear();
652 }
653 }
654 }
655
656 /// <summary>
657 /// Removes a land object from DB.
658 /// </summary>
659 /// <param name="globalID">UUID of landobject</param>
660 public void RemoveLandObject(UUID globalID)
661 {
662 using (AutoClosingSqlCommand cmd = _Database.Query("delete from land where UUID=@UUID"))
663 {
664 cmd.Parameters.Add(_Database.CreateParameter("@UUID", globalID));
665 cmd.ExecuteNonQuery();
666 }
667
668 using (AutoClosingSqlCommand cmd = _Database.Query("delete from landaccesslist where LandUUID=@UUID"))
669 {
670 cmd.Parameters.Add(_Database.CreateParameter("@UUID", globalID));
671 cmd.ExecuteNonQuery();
672 }
673 }
674
675 /// <summary>
676 /// Loads the settings of a region.
677 /// </summary>
678 /// <param name="regionUUID">The region UUID.</param>
679 /// <returns></returns>
680 public RegionSettings LoadRegionSettings(UUID regionUUID)
681 {
682 string sql = "select * from regionsettings where regionUUID = @regionUUID";
683 RegionSettings regionSettings;
684 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
685 {
686 cmd.Parameters.Add(_Database.CreateParameter("@regionUUID", regionUUID));
687 using (SqlDataReader reader = cmd.ExecuteReader())
688 {
689 if (reader.Read())
690 {
691 regionSettings = BuildRegionSettings(reader);
692 regionSettings.OnSave += StoreRegionSettings;
693
694 return regionSettings;
695 }
696 }
697 }
698
699 //If comes here then there is now region setting for that region
700 regionSettings = new RegionSettings();
701 regionSettings.RegionUUID = regionUUID;
702 regionSettings.OnSave += StoreRegionSettings;
703
704 //Store new values
705 StoreNewRegionSettings(regionSettings);
706
707 return regionSettings;
708 }
709
710 /// <summary>
711 /// Store region settings, need to check if the check is really necesary. If we can make something for creating new region.
712 /// </summary>
713 /// <param name="regionSettings">region settings.</param>
714 public void StoreRegionSettings(RegionSettings regionSettings)
715 {
716 //Little check if regionUUID already exist in DB
717 string regionUUID;
718 using (AutoClosingSqlCommand cmd = _Database.Query("SELECT regionUUID FROM regionsettings WHERE regionUUID = @regionUUID"))
719 {
720 cmd.Parameters.Add(_Database.CreateParameter("@regionUUID", regionSettings.RegionUUID));
721 regionUUID = cmd.ExecuteScalar().ToString();
722 }
723
724 if (string.IsNullOrEmpty(regionUUID))
725 {
726 StoreNewRegionSettings(regionSettings);
727 }
728 else
729 {
730 //This method only updates region settings!!! First call LoadRegionSettings to create new region settings in DB
731 string sql =
732 @"UPDATE [regionsettings] SET [block_terraform] = @block_terraform ,[block_fly] = @block_fly ,[allow_damage] = @allow_damage
733,[restrict_pushing] = @restrict_pushing ,[allow_land_resell] = @allow_land_resell ,[allow_land_join_divide] = @allow_land_join_divide
734,[block_show_in_search] = @block_show_in_search ,[agent_limit] = @agent_limit ,[object_bonus] = @object_bonus ,[maturity] = @maturity
735,[disable_scripts] = @disable_scripts ,[disable_collisions] = @disable_collisions ,[disable_physics] = @disable_physics
736,[terrain_texture_1] = @terrain_texture_1 ,[terrain_texture_2] = @terrain_texture_2 ,[terrain_texture_3] = @terrain_texture_3
737,[terrain_texture_4] = @terrain_texture_4 ,[elevation_1_nw] = @elevation_1_nw ,[elevation_2_nw] = @elevation_2_nw
738,[elevation_1_ne] = @elevation_1_ne ,[elevation_2_ne] = @elevation_2_ne ,[elevation_1_se] = @elevation_1_se ,[elevation_2_se] = @elevation_2_se
739,[elevation_1_sw] = @elevation_1_sw ,[elevation_2_sw] = @elevation_2_sw ,[water_height] = @water_height ,[terrain_raise_limit] = @terrain_raise_limit
740,[terrain_lower_limit] = @terrain_lower_limit ,[use_estate_sun] = @use_estate_sun ,[fixed_sun] = @fixed_sun ,[sun_position] = @sun_position
741,[covenant] = @covenant , [sunvectorx] = @sunvectorx, [sunvectory] = @sunvectory, [sunvectorz] = @sunvectorz, [Sandbox] = @Sandbox, [loaded_creation_datetime] = @loaded_creation_datetime, [loaded_creation_id] = @loaded_creation_id
742 WHERE [regionUUID] = @regionUUID";
743
744 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
745 {
746 cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
747
748 cmd.ExecuteNonQuery();
749 }
750 }
751 }
752
753 public void Shutdown()
754 {
755 //Not used??
756 }
757
758 #region Private Methods
759
760 /// <summary>
761 /// Serializes the terrain data for storage in DB.
762 /// </summary>
763 /// <param name="val">terrain data</param>
764 /// <returns></returns>
765 private static Array serializeTerrain(double[,] val)
766 {
767 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) * sizeof(double));
768 BinaryWriter bw = new BinaryWriter(str);
769
770 // TODO: COMPATIBILITY - Add byte-order conversions
771 for (int x = 0; x < (int)Constants.RegionSize; x++)
772 for (int y = 0; y < (int)Constants.RegionSize; y++)
773 {
774 double height = val[x, y];
775 if (height == 0.0)
776 height = double.Epsilon;
777
778 bw.Write(height);
779 }
780
781 return str.ToArray();
782 }
783
784 /// <summary>
785 /// Stores new regionsettings.
786 /// </summary>
787 /// <param name="regionSettings">The region settings.</param>
788 private void StoreNewRegionSettings(RegionSettings regionSettings)
789 {
790 string sql = @"INSERT INTO [regionsettings]
791 ([regionUUID],[block_terraform],[block_fly],[allow_damage],[restrict_pushing],[allow_land_resell],[allow_land_join_divide],
792 [block_show_in_search],[agent_limit],[object_bonus],[maturity],[disable_scripts],[disable_collisions],[disable_physics],
793 [terrain_texture_1],[terrain_texture_2],[terrain_texture_3],[terrain_texture_4],[elevation_1_nw],[elevation_2_nw],[elevation_1_ne],
794 [elevation_2_ne],[elevation_1_se],[elevation_2_se],[elevation_1_sw],[elevation_2_sw],[water_height],[terrain_raise_limit],
795 [terrain_lower_limit],[use_estate_sun],[fixed_sun],[sun_position],[covenant],[sunvectorx], [sunvectory], [sunvectorz],[Sandbox], [loaded_creation_datetime], [loaded_creation_id]
796 )
797 VALUES
798 (@regionUUID,@block_terraform,@block_fly,@allow_damage,@restrict_pushing,@allow_land_resell,@allow_land_join_divide,
799 @block_show_in_search,@agent_limit,@object_bonus,@maturity,@disable_scripts,@disable_collisions,@disable_physics,
800 @terrain_texture_1,@terrain_texture_2,@terrain_texture_3,@terrain_texture_4,@elevation_1_nw,@elevation_2_nw,@elevation_1_ne,
801 @elevation_2_ne,@elevation_1_se,@elevation_2_se,@elevation_1_sw,@elevation_2_sw,@water_height,@terrain_raise_limit,
802 @terrain_lower_limit,@use_estate_sun,@fixed_sun,@sun_position,@covenant,@sunvectorx,@sunvectory, @sunvectorz, @Sandbox, @loaded_creation_datetime, @loaded_creation_id)";
803
804 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
805 {
806 cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
807 cmd.ExecuteNonQuery();
808 }
809 }
810
811 #region Private DataRecord conversion methods
812
813 /// <summary>
814 /// Builds the region settings from a datarecod.
815 /// </summary>
816 /// <param name="row">datarecord with regionsettings.</param>
817 /// <returns></returns>
818 private static RegionSettings BuildRegionSettings(IDataRecord row)
819 {
820 //TODO change this is some more generic code so we doesnt have to change it every time a new field is added?
821 RegionSettings newSettings = new RegionSettings();
822
823 newSettings.RegionUUID = new UUID((Guid)row["regionUUID"]);
824 newSettings.BlockTerraform = Convert.ToBoolean(row["block_terraform"]);
825 newSettings.AllowDamage = Convert.ToBoolean(row["allow_damage"]);
826 newSettings.BlockFly = Convert.ToBoolean(row["block_fly"]);
827 newSettings.RestrictPushing = Convert.ToBoolean(row["restrict_pushing"]);
828 newSettings.AllowLandResell = Convert.ToBoolean(row["allow_land_resell"]);
829 newSettings.AllowLandJoinDivide = Convert.ToBoolean(row["allow_land_join_divide"]);
830 newSettings.BlockShowInSearch = Convert.ToBoolean(row["block_show_in_search"]);
831 newSettings.AgentLimit = Convert.ToInt32(row["agent_limit"]);
832 newSettings.ObjectBonus = Convert.ToDouble(row["object_bonus"]);
833 newSettings.Maturity = Convert.ToInt32(row["maturity"]);
834 newSettings.DisableScripts = Convert.ToBoolean(row["disable_scripts"]);
835 newSettings.DisableCollisions = Convert.ToBoolean(row["disable_collisions"]);
836 newSettings.DisablePhysics = Convert.ToBoolean(row["disable_physics"]);
837 newSettings.TerrainTexture1 = new UUID((Guid)row["terrain_texture_1"]);
838 newSettings.TerrainTexture2 = new UUID((Guid)row["terrain_texture_2"]);
839 newSettings.TerrainTexture3 = new UUID((Guid)row["terrain_texture_3"]);
840 newSettings.TerrainTexture4 = new UUID((Guid)row["terrain_texture_4"]);
841 newSettings.Elevation1NW = Convert.ToDouble(row["elevation_1_nw"]);
842 newSettings.Elevation2NW = Convert.ToDouble(row["elevation_2_nw"]);
843 newSettings.Elevation1NE = Convert.ToDouble(row["elevation_1_ne"]);
844 newSettings.Elevation2NE = Convert.ToDouble(row["elevation_2_ne"]);
845 newSettings.Elevation1SE = Convert.ToDouble(row["elevation_1_se"]);
846 newSettings.Elevation2SE = Convert.ToDouble(row["elevation_2_se"]);
847 newSettings.Elevation1SW = Convert.ToDouble(row["elevation_1_sw"]);
848 newSettings.Elevation2SW = Convert.ToDouble(row["elevation_2_sw"]);
849 newSettings.WaterHeight = Convert.ToDouble(row["water_height"]);
850 newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]);
851 newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]);
852 newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]);
853 newSettings.Sandbox = Convert.ToBoolean(row["sandbox"]);
854 newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]);
855 newSettings.SunPosition = Convert.ToDouble(row["sun_position"]);
856 newSettings.SunVector = new Vector3(
857 Convert.ToSingle(row["sunvectorx"]),
858 Convert.ToSingle(row["sunvectory"]),
859 Convert.ToSingle(row["sunvectorz"])
860 );
861 newSettings.Covenant = new UUID((Guid)row["covenant"]);
862
863 newSettings.LoadedCreationDateTime = Convert.ToInt32(row["loaded_creation_datetime"]);
864
865 if (row["loaded_creation_id"] is DBNull)
866 newSettings.LoadedCreationID = "";
867 else
868 newSettings.LoadedCreationID = (String)row["loaded_creation_id"];
869 return newSettings;
870 }
871
872 /// <summary>
873 /// Builds the land data from a datarecord.
874 /// </summary>
875 /// <param name="row">datarecord with land data</param>
876 /// <returns></returns>
877 private static LandData BuildLandData(IDataRecord row)
878 {
879 LandData newData = new LandData();
880
881 newData.GlobalID = new UUID((Guid)row["UUID"]);
882 newData.LocalID = Convert.ToInt32(row["LocalLandID"]);
883
884 // Bitmap is a byte[512]
885 newData.Bitmap = (Byte[])row["Bitmap"];
886
887 newData.Name = (string)row["Name"];
888 newData.Description = (string)row["Description"];
889 newData.OwnerID = new UUID((Guid)row["OwnerUUID"]);
890 newData.IsGroupOwned = Convert.ToBoolean(row["IsGroupOwned"]);
891 newData.Area = Convert.ToInt32(row["Area"]);
892 newData.AuctionID = Convert.ToUInt32(row["AuctionID"]); //Unemplemented
893 newData.Category = (ParcelCategory)Convert.ToInt32(row["Category"]);
894 //Enum libsecondlife.Parcel.ParcelCategory
895 newData.ClaimDate = Convert.ToInt32(row["ClaimDate"]);
896 newData.ClaimPrice = Convert.ToInt32(row["ClaimPrice"]);
897 newData.GroupID = new UUID((Guid)row["GroupUUID"]);
898 newData.SalePrice = Convert.ToInt32(row["SalePrice"]);
899 newData.Status = (ParcelStatus)Convert.ToInt32(row["LandStatus"]);
900 //Enum. libsecondlife.Parcel.ParcelStatus
901 newData.Flags = Convert.ToUInt32(row["LandFlags"]);
902 newData.LandingType = Convert.ToByte(row["LandingType"]);
903 newData.MediaAutoScale = Convert.ToByte(row["MediaAutoScale"]);
904 newData.MediaID = new UUID((Guid)row["MediaTextureUUID"]);
905 newData.MediaURL = (string)row["MediaURL"];
906 newData.MusicURL = (string)row["MusicURL"];
907 newData.PassHours = Convert.ToSingle(row["PassHours"]);
908 newData.PassPrice = Convert.ToInt32(row["PassPrice"]);
909
910// UUID authedbuyer;
911// UUID snapshotID;
912//
913// if (UUID.TryParse((string)row["AuthBuyerID"], out authedbuyer))
914// newData.AuthBuyerID = authedbuyer;
915//
916// if (UUID.TryParse((string)row["SnapshotUUID"], out snapshotID))
917// newData.SnapshotID = snapshotID;
918 newData.AuthBuyerID = new UUID((Guid) row["AuthBuyerID"]);
919 newData.SnapshotID = new UUID((Guid)row["SnapshotUUID"]);
920
921 newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]);
922 newData.Dwell = Convert.ToInt32(row["Dwell"]);
923
924 try
925 {
926 newData.UserLocation =
927 new Vector3(Convert.ToSingle(row["UserLocationX"]), Convert.ToSingle(row["UserLocationY"]),
928 Convert.ToSingle(row["UserLocationZ"]));
929 newData.UserLookAt =
930 new Vector3(Convert.ToSingle(row["UserLookAtX"]), Convert.ToSingle(row["UserLookAtY"]),
931 Convert.ToSingle(row["UserLookAtZ"]));
932 }
933 catch (InvalidCastException)
934 {
935 newData.UserLocation = Vector3.Zero;
936 newData.UserLookAt = Vector3.Zero;
937 _Log.ErrorFormat("[PARCEL]: unable to get parcel telehub settings for {1}", newData.Name);
938 }
939
940 newData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
941
942 return newData;
943 }
944
945 /// <summary>
946 /// Builds the landaccess data from a data record.
947 /// </summary>
948 /// <param name="row">datarecord with landaccess data</param>
949 /// <returns></returns>
950 private static ParcelManager.ParcelAccessEntry BuildLandAccessData(IDataRecord row)
951 {
952 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
953 entry.AgentID = new UUID((Guid)row["AccessUUID"]);
954 entry.Flags = (AccessList)Convert.ToInt32(row["Flags"]);
955 entry.Time = new DateTime();
956 return entry;
957 }
958
959 /// <summary>
960 /// Builds the prim from a datarecord.
961 /// </summary>
962 /// <param name="primRow">datarecord</param>
963 /// <returns></returns>
964 private static SceneObjectPart BuildPrim(IDataRecord primRow)
965 {
966 SceneObjectPart prim = new SceneObjectPart();
967
968 prim.UUID = new UUID((Guid)primRow["UUID"]);
969 // explicit conversion of integers is required, which sort
970 // of sucks. No idea if there is a shortcut here or not.
971 prim.CreationDate = Convert.ToInt32(primRow["CreationDate"]);
972 prim.Name = (string)primRow["Name"];
973 // various text fields
974 prim.Text = (string)primRow["Text"];
975 prim.Color = Color.FromArgb(Convert.ToInt32(primRow["ColorA"]),
976 Convert.ToInt32(primRow["ColorR"]),
977 Convert.ToInt32(primRow["ColorG"]),
978 Convert.ToInt32(primRow["ColorB"]));
979 prim.Description = (string)primRow["Description"];
980 prim.SitName = (string)primRow["SitName"];
981 prim.TouchName = (string)primRow["TouchName"];
982 // permissions
983 prim.ObjectFlags = Convert.ToUInt32(primRow["ObjectFlags"]);
984 prim.CreatorID = new UUID((Guid)primRow["CreatorID"]);
985 prim.OwnerID = new UUID((Guid)primRow["OwnerID"]);
986 prim.GroupID = new UUID((Guid)primRow["GroupID"]);
987 prim.LastOwnerID = new UUID((Guid)primRow["LastOwnerID"]);
988 prim.OwnerMask = Convert.ToUInt32(primRow["OwnerMask"]);
989 prim.NextOwnerMask = Convert.ToUInt32(primRow["NextOwnerMask"]);
990 prim.GroupMask = Convert.ToUInt32(primRow["GroupMask"]);
991 prim.EveryoneMask = Convert.ToUInt32(primRow["EveryoneMask"]);
992 prim.BaseMask = Convert.ToUInt32(primRow["BaseMask"]);
993 // vectors
994 prim.OffsetPosition = new Vector3(
995 Convert.ToSingle(primRow["PositionX"]),
996 Convert.ToSingle(primRow["PositionY"]),
997 Convert.ToSingle(primRow["PositionZ"]));
998
999 prim.GroupPosition = new Vector3(
1000 Convert.ToSingle(primRow["GroupPositionX"]),
1001 Convert.ToSingle(primRow["GroupPositionY"]),
1002 Convert.ToSingle(primRow["GroupPositionZ"]));
1003
1004 prim.Velocity = new Vector3(
1005 Convert.ToSingle(primRow["VelocityX"]),
1006 Convert.ToSingle(primRow["VelocityY"]),
1007 Convert.ToSingle(primRow["VelocityZ"]));
1008
1009 prim.AngularVelocity = new Vector3(
1010 Convert.ToSingle(primRow["AngularVelocityX"]),
1011 Convert.ToSingle(primRow["AngularVelocityY"]),
1012 Convert.ToSingle(primRow["AngularVelocityZ"]));
1013
1014 prim.Acceleration = new Vector3(
1015 Convert.ToSingle(primRow["AccelerationX"]),
1016 Convert.ToSingle(primRow["AccelerationY"]),
1017 Convert.ToSingle(primRow["AccelerationZ"]));
1018
1019 // quaternions
1020 prim.RotationOffset = new Quaternion(
1021 Convert.ToSingle(primRow["RotationX"]),
1022 Convert.ToSingle(primRow["RotationY"]),
1023 Convert.ToSingle(primRow["RotationZ"]),
1024 Convert.ToSingle(primRow["RotationW"]));
1025
1026 prim.SitTargetPositionLL = new Vector3(
1027 Convert.ToSingle(primRow["SitTargetOffsetX"]),
1028 Convert.ToSingle(primRow["SitTargetOffsetY"]),
1029 Convert.ToSingle(primRow["SitTargetOffsetZ"]));
1030
1031 prim.SitTargetOrientationLL = new Quaternion(
1032 Convert.ToSingle(primRow["SitTargetOrientX"]),
1033 Convert.ToSingle(primRow["SitTargetOrientY"]),
1034 Convert.ToSingle(primRow["SitTargetOrientZ"]),
1035 Convert.ToSingle(primRow["SitTargetOrientW"]));
1036
1037 prim.PayPrice[0] = Convert.ToInt32(primRow["PayPrice"]);
1038 prim.PayPrice[1] = Convert.ToInt32(primRow["PayButton1"]);
1039 prim.PayPrice[2] = Convert.ToInt32(primRow["PayButton2"]);
1040 prim.PayPrice[3] = Convert.ToInt32(primRow["PayButton3"]);
1041 prim.PayPrice[4] = Convert.ToInt32(primRow["PayButton4"]);
1042
1043 prim.Sound = new UUID((Guid)primRow["LoopedSound"]);
1044 prim.SoundGain = Convert.ToSingle(primRow["LoopedSoundGain"]);
1045 prim.SoundFlags = 1; // If it's persisted at all, it's looped
1046
1047 if (!(primRow["TextureAnimation"] is DBNull))
1048 prim.TextureAnimation = (Byte[])primRow["TextureAnimation"];
1049 if (!(primRow["ParticleSystem"] is DBNull))
1050 prim.ParticleSystem = (Byte[])primRow["ParticleSystem"];
1051
1052 prim.RotationalVelocity = new Vector3(
1053 Convert.ToSingle(primRow["OmegaX"]),
1054 Convert.ToSingle(primRow["OmegaY"]),
1055 Convert.ToSingle(primRow["OmegaZ"]));
1056
1057 prim.SetCameraEyeOffset(new Vector3(
1058 Convert.ToSingle(primRow["CameraEyeOffsetX"]),
1059 Convert.ToSingle(primRow["CameraEyeOffsetY"]),
1060 Convert.ToSingle(primRow["CameraEyeOffsetZ"])
1061 ));
1062
1063 prim.SetCameraAtOffset(new Vector3(
1064 Convert.ToSingle(primRow["CameraAtOffsetX"]),
1065 Convert.ToSingle(primRow["CameraAtOffsetY"]),
1066 Convert.ToSingle(primRow["CameraAtOffsetZ"])
1067 ));
1068
1069 if (Convert.ToInt16(primRow["ForceMouselook"]) != 0)
1070 prim.SetForceMouselook(true);
1071
1072 prim.ScriptAccessPin = Convert.ToInt32(primRow["ScriptAccessPin"]);
1073
1074 if (Convert.ToInt16(primRow["AllowedDrop"]) != 0)
1075 prim.AllowedDrop = true;
1076
1077 if (Convert.ToInt16(primRow["DieAtEdge"]) != 0)
1078 prim.DIE_AT_EDGE = true;
1079
1080 prim.SalePrice = Convert.ToInt32(primRow["SalePrice"]);
1081 prim.ObjectSaleType = Convert.ToByte(primRow["SaleType"]);
1082
1083 prim.Material = Convert.ToByte(primRow["Material"]);
1084
1085 if (!(primRow["ClickAction"] is DBNull))
1086 prim.ClickAction = Convert.ToByte(primRow["ClickAction"]);
1087
1088 prim.CollisionSound = new UUID((Guid)primRow["CollisionSound"]);
1089 prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]);
1090 if (Convert.ToInt16(primRow["PassTouches"]) != 0)
1091 prim.PassTouches = true;
1092 prim.LinkNum = Convert.ToInt32(primRow["LinkNumber"]);
1093
1094 return prim;
1095 }
1096
1097 /// <summary>
1098 /// Builds the prim shape from a datarecord.
1099 /// </summary>
1100 /// <param name="shapeRow">The row.</param>
1101 /// <returns></returns>
1102 private static PrimitiveBaseShape BuildShape(IDataRecord shapeRow)
1103 {
1104 PrimitiveBaseShape baseShape = new PrimitiveBaseShape();
1105
1106 baseShape.Scale = new Vector3(
1107 Convert.ToSingle(shapeRow["ScaleX"]),
1108 Convert.ToSingle(shapeRow["ScaleY"]),
1109 Convert.ToSingle(shapeRow["ScaleZ"]));
1110
1111 // paths
1112 baseShape.PCode = Convert.ToByte(shapeRow["PCode"]);
1113 baseShape.PathBegin = Convert.ToUInt16(shapeRow["PathBegin"]);
1114 baseShape.PathEnd = Convert.ToUInt16(shapeRow["PathEnd"]);
1115 baseShape.PathScaleX = Convert.ToByte(shapeRow["PathScaleX"]);
1116 baseShape.PathScaleY = Convert.ToByte(shapeRow["PathScaleY"]);
1117 baseShape.PathShearX = Convert.ToByte(shapeRow["PathShearX"]);
1118 baseShape.PathShearY = Convert.ToByte(shapeRow["PathShearY"]);
1119 baseShape.PathSkew = Convert.ToSByte(shapeRow["PathSkew"]);
1120 baseShape.PathCurve = Convert.ToByte(shapeRow["PathCurve"]);
1121 baseShape.PathRadiusOffset = Convert.ToSByte(shapeRow["PathRadiusOffset"]);
1122 baseShape.PathRevolutions = Convert.ToByte(shapeRow["PathRevolutions"]);
1123 baseShape.PathTaperX = Convert.ToSByte(shapeRow["PathTaperX"]);
1124 baseShape.PathTaperY = Convert.ToSByte(shapeRow["PathTaperY"]);
1125 baseShape.PathTwist = Convert.ToSByte(shapeRow["PathTwist"]);
1126 baseShape.PathTwistBegin = Convert.ToSByte(shapeRow["PathTwistBegin"]);
1127 // profile
1128 baseShape.ProfileBegin = Convert.ToUInt16(shapeRow["ProfileBegin"]);
1129 baseShape.ProfileEnd = Convert.ToUInt16(shapeRow["ProfileEnd"]);
1130 baseShape.ProfileCurve = Convert.ToByte(shapeRow["ProfileCurve"]);
1131 baseShape.ProfileHollow = Convert.ToUInt16(shapeRow["ProfileHollow"]);
1132
1133 byte[] textureEntry = (byte[])shapeRow["Texture"];
1134 baseShape.TextureEntry = textureEntry;
1135
1136 baseShape.ExtraParams = (byte[])shapeRow["ExtraParams"];
1137
1138 try
1139 {
1140 baseShape.State = Convert.ToByte(shapeRow["State"]);
1141 }
1142 catch (InvalidCastException)
1143 {
1144 }
1145
1146 return baseShape;
1147 }
1148
1149 /// <summary>
1150 /// Build a prim inventory item from the persisted data.
1151 /// </summary>
1152 /// <param name="inventoryRow"></param>
1153 /// <returns></returns>
1154 private static TaskInventoryItem BuildItem(IDataRecord inventoryRow)
1155 {
1156 TaskInventoryItem taskItem = new TaskInventoryItem();
1157
1158 taskItem.ItemID = new UUID((Guid)inventoryRow["itemID"]);
1159 taskItem.ParentPartID = new UUID((Guid)inventoryRow["primID"]);
1160 taskItem.AssetID = new UUID((Guid)inventoryRow["assetID"]);
1161 taskItem.ParentID = new UUID((Guid)inventoryRow["parentFolderID"]);
1162
1163 taskItem.InvType = Convert.ToInt32(inventoryRow["invType"]);
1164 taskItem.Type = Convert.ToInt32(inventoryRow["assetType"]);
1165
1166 taskItem.Name = (string)inventoryRow["name"];
1167 taskItem.Description = (string)inventoryRow["description"];
1168 taskItem.CreationDate = Convert.ToUInt32(inventoryRow["creationDate"]);
1169 taskItem.CreatorID = new UUID((Guid)inventoryRow["creatorID"]);
1170 taskItem.OwnerID = new UUID((Guid)inventoryRow["ownerID"]);
1171 taskItem.LastOwnerID = new UUID((Guid)inventoryRow["lastOwnerID"]);
1172 taskItem.GroupID = new UUID((Guid)inventoryRow["groupID"]);
1173
1174 taskItem.NextPermissions = Convert.ToUInt32(inventoryRow["nextPermissions"]);
1175 taskItem.CurrentPermissions = Convert.ToUInt32(inventoryRow["currentPermissions"]);
1176 taskItem.BasePermissions = Convert.ToUInt32(inventoryRow["basePermissions"]);
1177 taskItem.EveryonePermissions = Convert.ToUInt32(inventoryRow["everyonePermissions"]);
1178 taskItem.GroupPermissions = Convert.ToUInt32(inventoryRow["groupPermissions"]);
1179 taskItem.Flags = Convert.ToUInt32(inventoryRow["flags"]);
1180
1181 return taskItem;
1182 }
1183
1184 #endregion
1185
1186 #region Create parameters methods
1187
1188 /// <summary>
1189 /// Creates the prim inventory parameters.
1190 /// </summary>
1191 /// <param name="taskItem">item in inventory.</param>
1192 /// <returns></returns>
1193 private SqlParameter[] CreatePrimInventoryParameters(TaskInventoryItem taskItem)
1194 {
1195 List<SqlParameter> parameters = new List<SqlParameter>();
1196
1197 parameters.Add(_Database.CreateParameter("itemID", taskItem.ItemID));
1198 parameters.Add(_Database.CreateParameter("primID", taskItem.ParentPartID));
1199 parameters.Add(_Database.CreateParameter("assetID", taskItem.AssetID));
1200 parameters.Add(_Database.CreateParameter("parentFolderID", taskItem.ParentID));
1201 parameters.Add(_Database.CreateParameter("invType", taskItem.InvType));
1202 parameters.Add(_Database.CreateParameter("assetType", taskItem.Type));
1203
1204 parameters.Add(_Database.CreateParameter("name", taskItem.Name));
1205 parameters.Add(_Database.CreateParameter("description", taskItem.Description));
1206 parameters.Add(_Database.CreateParameter("creationDate", taskItem.CreationDate));
1207 parameters.Add(_Database.CreateParameter("creatorID", taskItem.CreatorID));
1208 parameters.Add(_Database.CreateParameter("ownerID", taskItem.OwnerID));
1209 parameters.Add(_Database.CreateParameter("lastOwnerID", taskItem.LastOwnerID));
1210 parameters.Add(_Database.CreateParameter("groupID", taskItem.GroupID));
1211 parameters.Add(_Database.CreateParameter("nextPermissions", taskItem.NextPermissions));
1212 parameters.Add(_Database.CreateParameter("currentPermissions", taskItem.CurrentPermissions));
1213 parameters.Add(_Database.CreateParameter("basePermissions", taskItem.BasePermissions));
1214 parameters.Add(_Database.CreateParameter("everyonePermissions", taskItem.EveryonePermissions));
1215 parameters.Add(_Database.CreateParameter("groupPermissions", taskItem.GroupPermissions));
1216 parameters.Add(_Database.CreateParameter("flags", taskItem.Flags));
1217
1218 return parameters.ToArray();
1219 }
1220
1221 /// <summary>
1222 /// Creates the region setting parameters.
1223 /// </summary>
1224 /// <param name="settings">regionsettings.</param>
1225 /// <returns></returns>
1226 private SqlParameter[] CreateRegionSettingParameters(RegionSettings settings)
1227 {
1228 List<SqlParameter> parameters = new List<SqlParameter>();
1229
1230 parameters.Add(_Database.CreateParameter("regionUUID", settings.RegionUUID));
1231 parameters.Add(_Database.CreateParameter("block_terraform", settings.BlockTerraform));
1232 parameters.Add(_Database.CreateParameter("block_fly", settings.BlockFly));
1233 parameters.Add(_Database.CreateParameter("allow_damage", settings.AllowDamage));
1234 parameters.Add(_Database.CreateParameter("restrict_pushing", settings.RestrictPushing));
1235 parameters.Add(_Database.CreateParameter("allow_land_resell", settings.AllowLandResell));
1236 parameters.Add(_Database.CreateParameter("allow_land_join_divide", settings.AllowLandJoinDivide));
1237 parameters.Add(_Database.CreateParameter("block_show_in_search", settings.BlockShowInSearch));
1238 parameters.Add(_Database.CreateParameter("agent_limit", settings.AgentLimit));
1239 parameters.Add(_Database.CreateParameter("object_bonus", settings.ObjectBonus));
1240 parameters.Add(_Database.CreateParameter("maturity", settings.Maturity));
1241 parameters.Add(_Database.CreateParameter("disable_scripts", settings.DisableScripts));
1242 parameters.Add(_Database.CreateParameter("disable_collisions", settings.DisableCollisions));
1243 parameters.Add(_Database.CreateParameter("disable_physics", settings.DisablePhysics));
1244 parameters.Add(_Database.CreateParameter("terrain_texture_1", settings.TerrainTexture1));
1245 parameters.Add(_Database.CreateParameter("terrain_texture_2", settings.TerrainTexture2));
1246 parameters.Add(_Database.CreateParameter("terrain_texture_3", settings.TerrainTexture3));
1247 parameters.Add(_Database.CreateParameter("terrain_texture_4", settings.TerrainTexture4));
1248 parameters.Add(_Database.CreateParameter("elevation_1_nw", settings.Elevation1NW));
1249 parameters.Add(_Database.CreateParameter("elevation_2_nw", settings.Elevation2NW));
1250 parameters.Add(_Database.CreateParameter("elevation_1_ne", settings.Elevation1NE));
1251 parameters.Add(_Database.CreateParameter("elevation_2_ne", settings.Elevation2NE));
1252 parameters.Add(_Database.CreateParameter("elevation_1_se", settings.Elevation1SE));
1253 parameters.Add(_Database.CreateParameter("elevation_2_se", settings.Elevation2SE));
1254 parameters.Add(_Database.CreateParameter("elevation_1_sw", settings.Elevation1SW));
1255 parameters.Add(_Database.CreateParameter("elevation_2_sw", settings.Elevation2SW));
1256 parameters.Add(_Database.CreateParameter("water_height", settings.WaterHeight));
1257 parameters.Add(_Database.CreateParameter("terrain_raise_limit", settings.TerrainRaiseLimit));
1258 parameters.Add(_Database.CreateParameter("terrain_lower_limit", settings.TerrainLowerLimit));
1259 parameters.Add(_Database.CreateParameter("use_estate_sun", settings.UseEstateSun));
1260 parameters.Add(_Database.CreateParameter("sandbox", settings.Sandbox));
1261 parameters.Add(_Database.CreateParameter("fixed_sun", settings.FixedSun));
1262 parameters.Add(_Database.CreateParameter("sun_position", settings.SunPosition));
1263 parameters.Add(_Database.CreateParameter("sunvectorx", settings.SunVector.X));
1264 parameters.Add(_Database.CreateParameter("sunvectory", settings.SunVector.Y));
1265 parameters.Add(_Database.CreateParameter("sunvectorz", settings.SunVector.Z));
1266 parameters.Add(_Database.CreateParameter("covenant", settings.Covenant));
1267 parameters.Add(_Database.CreateParameter("Loaded_Creation_DateTime", settings.LoadedCreationDateTime));
1268 parameters.Add(_Database.CreateParameter("Loaded_Creation_ID", settings.LoadedCreationID));
1269
1270 return parameters.ToArray();
1271 }
1272
1273 /// <summary>
1274 /// Creates the land parameters.
1275 /// </summary>
1276 /// <param name="land">land parameters.</param>
1277 /// <param name="regionUUID">region UUID.</param>
1278 /// <returns></returns>
1279 private SqlParameter[] CreateLandParameters(LandData land, UUID regionUUID)
1280 {
1281 List<SqlParameter> parameters = new List<SqlParameter>();
1282
1283 parameters.Add(_Database.CreateParameter("UUID", land.GlobalID));
1284 parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID));
1285 parameters.Add(_Database.CreateParameter("LocalLandID", land.LocalID));
1286
1287 // Bitmap is a byte[512]
1288 parameters.Add(_Database.CreateParameter("Bitmap", land.Bitmap));
1289
1290 parameters.Add(_Database.CreateParameter("Name", land.Name));
1291 parameters.Add(_Database.CreateParameter("Description", land.Description));
1292 parameters.Add(_Database.CreateParameter("OwnerUUID", land.OwnerID));
1293 parameters.Add(_Database.CreateParameter("IsGroupOwned", land.IsGroupOwned));
1294 parameters.Add(_Database.CreateParameter("Area", land.Area));
1295 parameters.Add(_Database.CreateParameter("AuctionID", land.AuctionID)); //Unemplemented
1296 parameters.Add(_Database.CreateParameter("Category", (int)land.Category)); //Enum libsecondlife.Parcel.ParcelCategory
1297 parameters.Add(_Database.CreateParameter("ClaimDate", land.ClaimDate));
1298 parameters.Add(_Database.CreateParameter("ClaimPrice", land.ClaimPrice));
1299 parameters.Add(_Database.CreateParameter("GroupUUID", land.GroupID));
1300 parameters.Add(_Database.CreateParameter("SalePrice", land.SalePrice));
1301 parameters.Add(_Database.CreateParameter("LandStatus", (int)land.Status)); //Enum. libsecondlife.Parcel.ParcelStatus
1302 parameters.Add(_Database.CreateParameter("LandFlags", land.Flags));
1303 parameters.Add(_Database.CreateParameter("LandingType", land.LandingType));
1304 parameters.Add(_Database.CreateParameter("MediaAutoScale", land.MediaAutoScale));
1305 parameters.Add(_Database.CreateParameter("MediaTextureUUID", land.MediaID));
1306 parameters.Add(_Database.CreateParameter("MediaURL", land.MediaURL));
1307 parameters.Add(_Database.CreateParameter("MusicURL", land.MusicURL));
1308 parameters.Add(_Database.CreateParameter("PassHours", land.PassHours));
1309 parameters.Add(_Database.CreateParameter("PassPrice", land.PassPrice));
1310 parameters.Add(_Database.CreateParameter("SnapshotUUID", land.SnapshotID));
1311 parameters.Add(_Database.CreateParameter("UserLocationX", land.UserLocation.X));
1312 parameters.Add(_Database.CreateParameter("UserLocationY", land.UserLocation.Y));
1313 parameters.Add(_Database.CreateParameter("UserLocationZ", land.UserLocation.Z));
1314 parameters.Add(_Database.CreateParameter("UserLookAtX", land.UserLookAt.X));
1315 parameters.Add(_Database.CreateParameter("UserLookAtY", land.UserLookAt.Y));
1316 parameters.Add(_Database.CreateParameter("UserLookAtZ", land.UserLookAt.Z));
1317 parameters.Add(_Database.CreateParameter("AuthBuyerID", land.AuthBuyerID));
1318 parameters.Add(_Database.CreateParameter("OtherCleanTime", land.OtherCleanTime));
1319 parameters.Add(_Database.CreateParameter("Dwell", land.Dwell));
1320
1321 return parameters.ToArray();
1322 }
1323
1324 /// <summary>
1325 /// Creates the land access parameters.
1326 /// </summary>
1327 /// <param name="parcelAccessEntry">parcel access entry.</param>
1328 /// <param name="parcelID">parcel ID.</param>
1329 /// <returns></returns>
1330 private SqlParameter[] CreateLandAccessParameters(ParcelManager.ParcelAccessEntry parcelAccessEntry, UUID parcelID)
1331 {
1332 List<SqlParameter> parameters = new List<SqlParameter>();
1333
1334 parameters.Add(_Database.CreateParameter("LandUUID", parcelID));
1335 parameters.Add(_Database.CreateParameter("AccessUUID", parcelAccessEntry.AgentID));
1336 parameters.Add(_Database.CreateParameter("Flags", parcelAccessEntry.Flags));
1337
1338 return parameters.ToArray();
1339 }
1340
1341 /// <summary>
1342 /// Creates the prim parameters for storing in DB.
1343 /// </summary>
1344 /// <param name="prim">Basic data of SceneObjectpart prim.</param>
1345 /// <param name="sceneGroupID">The scenegroup ID.</param>
1346 /// <param name="regionUUID">The region ID.</param>
1347 /// <returns></returns>
1348 private SqlParameter[] CreatePrimParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
1349 {
1350 List<SqlParameter> parameters = new List<SqlParameter>();
1351
1352 parameters.Add(_Database.CreateParameter("UUID", prim.UUID));
1353 parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID));
1354 parameters.Add(_Database.CreateParameter("CreationDate", prim.CreationDate));
1355 parameters.Add(_Database.CreateParameter("Name", prim.Name));
1356 parameters.Add(_Database.CreateParameter("SceneGroupID", sceneGroupID));
1357 // the UUID of the root part for this SceneObjectGroup
1358 // various text fields
1359 parameters.Add(_Database.CreateParameter("Text", prim.Text));
1360 parameters.Add(_Database.CreateParameter("ColorR", prim.Color.R));
1361 parameters.Add(_Database.CreateParameter("ColorG", prim.Color.G));
1362 parameters.Add(_Database.CreateParameter("ColorB", prim.Color.B));
1363 parameters.Add(_Database.CreateParameter("ColorA", prim.Color.A));
1364 parameters.Add(_Database.CreateParameter("Description", prim.Description));
1365 parameters.Add(_Database.CreateParameter("SitName", prim.SitName));
1366 parameters.Add(_Database.CreateParameter("TouchName", prim.TouchName));
1367 // permissions
1368 parameters.Add(_Database.CreateParameter("ObjectFlags", prim.ObjectFlags));
1369 parameters.Add(_Database.CreateParameter("CreatorID", prim.CreatorID));
1370 parameters.Add(_Database.CreateParameter("OwnerID", prim.OwnerID));
1371 parameters.Add(_Database.CreateParameter("GroupID", prim.GroupID));
1372 parameters.Add(_Database.CreateParameter("LastOwnerID", prim.LastOwnerID));
1373 parameters.Add(_Database.CreateParameter("OwnerMask", prim.OwnerMask));
1374 parameters.Add(_Database.CreateParameter("NextOwnerMask", prim.NextOwnerMask));
1375 parameters.Add(_Database.CreateParameter("GroupMask", prim.GroupMask));
1376 parameters.Add(_Database.CreateParameter("EveryoneMask", prim.EveryoneMask));
1377 parameters.Add(_Database.CreateParameter("BaseMask", prim.BaseMask));
1378 // vectors
1379 parameters.Add(_Database.CreateParameter("PositionX", prim.OffsetPosition.X));
1380 parameters.Add(_Database.CreateParameter("PositionY", prim.OffsetPosition.Y));
1381 parameters.Add(_Database.CreateParameter("PositionZ", prim.OffsetPosition.Z));
1382 parameters.Add(_Database.CreateParameter("GroupPositionX", prim.GroupPosition.X));
1383 parameters.Add(_Database.CreateParameter("GroupPositionY", prim.GroupPosition.Y));
1384 parameters.Add(_Database.CreateParameter("GroupPositionZ", prim.GroupPosition.Z));
1385 parameters.Add(_Database.CreateParameter("VelocityX", prim.Velocity.X));
1386 parameters.Add(_Database.CreateParameter("VelocityY", prim.Velocity.Y));
1387 parameters.Add(_Database.CreateParameter("VelocityZ", prim.Velocity.Z));
1388 parameters.Add(_Database.CreateParameter("AngularVelocityX", prim.AngularVelocity.X));
1389 parameters.Add(_Database.CreateParameter("AngularVelocityY", prim.AngularVelocity.Y));
1390 parameters.Add(_Database.CreateParameter("AngularVelocityZ", prim.AngularVelocity.Z));
1391 parameters.Add(_Database.CreateParameter("AccelerationX", prim.Acceleration.X));
1392 parameters.Add(_Database.CreateParameter("AccelerationY", prim.Acceleration.Y));
1393 parameters.Add(_Database.CreateParameter("AccelerationZ", prim.Acceleration.Z));
1394 // quaternions
1395 parameters.Add(_Database.CreateParameter("RotationX", prim.RotationOffset.X));
1396 parameters.Add(_Database.CreateParameter("RotationY", prim.RotationOffset.Y));
1397 parameters.Add(_Database.CreateParameter("RotationZ", prim.RotationOffset.Z));
1398 parameters.Add(_Database.CreateParameter("RotationW", prim.RotationOffset.W));
1399
1400 // Sit target
1401 Vector3 sitTargetPos = prim.SitTargetPositionLL;
1402 parameters.Add(_Database.CreateParameter("SitTargetOffsetX", sitTargetPos.X));
1403 parameters.Add(_Database.CreateParameter("SitTargetOffsetY", sitTargetPos.Y));
1404 parameters.Add(_Database.CreateParameter("SitTargetOffsetZ", sitTargetPos.Z));
1405
1406 Quaternion sitTargetOrient = prim.SitTargetOrientationLL;
1407 parameters.Add(_Database.CreateParameter("SitTargetOrientW", sitTargetOrient.W));
1408 parameters.Add(_Database.CreateParameter("SitTargetOrientX", sitTargetOrient.X));
1409 parameters.Add(_Database.CreateParameter("SitTargetOrientY", sitTargetOrient.Y));
1410 parameters.Add(_Database.CreateParameter("SitTargetOrientZ", sitTargetOrient.Z));
1411
1412 parameters.Add(_Database.CreateParameter("PayPrice", prim.PayPrice[0]));
1413 parameters.Add(_Database.CreateParameter("PayButton1", prim.PayPrice[1]));
1414 parameters.Add(_Database.CreateParameter("PayButton2", prim.PayPrice[2]));
1415 parameters.Add(_Database.CreateParameter("PayButton3", prim.PayPrice[3]));
1416 parameters.Add(_Database.CreateParameter("PayButton4", prim.PayPrice[4]));
1417
1418 if ((prim.SoundFlags & 1) != 0) // Looped
1419 {
1420 parameters.Add(_Database.CreateParameter("LoopedSound", prim.Sound));
1421 parameters.Add(_Database.CreateParameter("LoopedSoundGain", prim.SoundGain));
1422 }
1423 else
1424 {
1425 parameters.Add(_Database.CreateParameter("LoopedSound", UUID.Zero));
1426 parameters.Add(_Database.CreateParameter("LoopedSoundGain", 0.0f));
1427 }
1428
1429 parameters.Add(_Database.CreateParameter("TextureAnimation", prim.TextureAnimation));
1430 parameters.Add(_Database.CreateParameter("ParticleSystem", prim.ParticleSystem));
1431
1432 parameters.Add(_Database.CreateParameter("OmegaX", prim.RotationalVelocity.X));
1433 parameters.Add(_Database.CreateParameter("OmegaY", prim.RotationalVelocity.Y));
1434 parameters.Add(_Database.CreateParameter("OmegaZ", prim.RotationalVelocity.Z));
1435
1436 parameters.Add(_Database.CreateParameter("CameraEyeOffsetX", prim.GetCameraEyeOffset().X));
1437 parameters.Add(_Database.CreateParameter("CameraEyeOffsetY", prim.GetCameraEyeOffset().Y));
1438 parameters.Add(_Database.CreateParameter("CameraEyeOffsetZ", prim.GetCameraEyeOffset().Z));
1439
1440 parameters.Add(_Database.CreateParameter("CameraAtOffsetX", prim.GetCameraAtOffset().X));
1441 parameters.Add(_Database.CreateParameter("CameraAtOffsetY", prim.GetCameraAtOffset().Y));
1442 parameters.Add(_Database.CreateParameter("CameraAtOffsetZ", prim.GetCameraAtOffset().Z));
1443
1444 if (prim.GetForceMouselook())
1445 parameters.Add(_Database.CreateParameter("ForceMouselook", 1));
1446 else
1447 parameters.Add(_Database.CreateParameter("ForceMouselook", 0));
1448
1449 parameters.Add(_Database.CreateParameter("ScriptAccessPin", prim.ScriptAccessPin));
1450
1451 if (prim.AllowedDrop)
1452 parameters.Add(_Database.CreateParameter("AllowedDrop", 1));
1453 else
1454 parameters.Add(_Database.CreateParameter("AllowedDrop", 0));
1455
1456 if (prim.DIE_AT_EDGE)
1457 parameters.Add(_Database.CreateParameter("DieAtEdge", 1));
1458 else
1459 parameters.Add(_Database.CreateParameter("DieAtEdge", 0));
1460
1461 parameters.Add(_Database.CreateParameter("SalePrice", prim.SalePrice));
1462 parameters.Add(_Database.CreateParameter("SaleType", prim.ObjectSaleType));
1463
1464 byte clickAction = prim.ClickAction;
1465 parameters.Add(_Database.CreateParameter("ClickAction", clickAction));
1466
1467 parameters.Add(_Database.CreateParameter("Material", prim.Material));
1468
1469 parameters.Add(_Database.CreateParameter("CollisionSound", prim.CollisionSound));
1470 parameters.Add(_Database.CreateParameter("CollisionSoundVolume", prim.CollisionSoundVolume));
1471 if (prim.PassTouches)
1472 parameters.Add(_Database.CreateParameter("PassTouches", 1));
1473 else
1474 parameters.Add(_Database.CreateParameter("PassTouches", 0));
1475 parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum));
1476
1477 return parameters.ToArray();
1478 }
1479
1480 /// <summary>
1481 /// Creates the primshape parameters for stroing in DB.
1482 /// </summary>
1483 /// <param name="prim">Basic data of SceneObjectpart prim.</param>
1484 /// <param name="sceneGroupID">The scene group ID.</param>
1485 /// <param name="regionUUID">The region UUID.</param>
1486 /// <returns></returns>
1487 private SqlParameter[] CreatePrimShapeParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
1488 {
1489 List<SqlParameter> parameters = new List<SqlParameter>();
1490
1491 PrimitiveBaseShape s = prim.Shape;
1492 parameters.Add(_Database.CreateParameter("UUID", prim.UUID));
1493 // shape is an enum
1494 parameters.Add(_Database.CreateParameter("Shape", 0));
1495 // vectors
1496 parameters.Add(_Database.CreateParameter("ScaleX", s.Scale.X));
1497 parameters.Add(_Database.CreateParameter("ScaleY", s.Scale.Y));
1498 parameters.Add(_Database.CreateParameter("ScaleZ", s.Scale.Z));
1499 // paths
1500 parameters.Add(_Database.CreateParameter("PCode", s.PCode));
1501 parameters.Add(_Database.CreateParameter("PathBegin", s.PathBegin));
1502 parameters.Add(_Database.CreateParameter("PathEnd", s.PathEnd));
1503 parameters.Add(_Database.CreateParameter("PathScaleX", s.PathScaleX));
1504 parameters.Add(_Database.CreateParameter("PathScaleY", s.PathScaleY));
1505 parameters.Add(_Database.CreateParameter("PathShearX", s.PathShearX));
1506 parameters.Add(_Database.CreateParameter("PathShearY", s.PathShearY));
1507 parameters.Add(_Database.CreateParameter("PathSkew", s.PathSkew));
1508 parameters.Add(_Database.CreateParameter("PathCurve", s.PathCurve));
1509 parameters.Add(_Database.CreateParameter("PathRadiusOffset", s.PathRadiusOffset));
1510 parameters.Add(_Database.CreateParameter("PathRevolutions", s.PathRevolutions));
1511 parameters.Add(_Database.CreateParameter("PathTaperX", s.PathTaperX));
1512 parameters.Add(_Database.CreateParameter("PathTaperY", s.PathTaperY));
1513 parameters.Add(_Database.CreateParameter("PathTwist", s.PathTwist));
1514 parameters.Add(_Database.CreateParameter("PathTwistBegin", s.PathTwistBegin));
1515 // profile
1516 parameters.Add(_Database.CreateParameter("ProfileBegin", s.ProfileBegin));
1517 parameters.Add(_Database.CreateParameter("ProfileEnd", s.ProfileEnd));
1518 parameters.Add(_Database.CreateParameter("ProfileCurve", s.ProfileCurve));
1519 parameters.Add(_Database.CreateParameter("ProfileHollow", s.ProfileHollow));
1520 parameters.Add(_Database.CreateParameter("Texture", s.TextureEntry));
1521 parameters.Add(_Database.CreateParameter("ExtraParams", s.ExtraParams));
1522 parameters.Add(_Database.CreateParameter("State", s.State));
1523
1524 return parameters.ToArray();
1525 }
1526
1527 #endregion
1528
1529 #endregion
1530 }
1531}
diff --git a/OpenSim/Data/MSSQL/MSSQLRegionData.cs b/OpenSim/Data/MSSQL/MSSQLRegionData.cs
index 6318c09..78d7fd0 100644
--- a/OpenSim/Data/MSSQL/MSSQLRegionData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLRegionData.cs
@@ -13,7 +13,7 @@
13 * names of its contributors may be used to endorse or promote products 13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission. 14 * derived from this software without specific prior written permission.
15 * 15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY 16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ''AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY 19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
@@ -43,1489 +43,269 @@ namespace OpenSim.Data.MSSQL
43 /// <summary> 43 /// <summary>
44 /// A MSSQL Interface for the Region Server. 44 /// A MSSQL Interface for the Region Server.
45 /// </summary> 45 /// </summary>
46 public class MSSQLRegionDataStore : IRegionDataStore 46 public class MSSQLRegionData : IRegionData
47 { 47 {
48 private const string _migrationStore = "RegionStore"; 48 private string m_Realm;
49 private List<string> m_ColumnNames = null;
50 private string m_ConnectionString;
51 private MSSQLManager m_database;
52 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49 53
50 // private static FileSystemDataStore Instance = new FileSystemDataStore(); 54 public MSSQLRegionData(string connectionString, string realm)
51 private static readonly ILog _Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52
53 /// <summary>
54 /// The database manager
55 /// </summary>
56 private MSSQLManager _Database;
57
58 /// <summary>
59 /// Initialises the region datastore
60 /// </summary>
61 /// <param name="connectionString">The connection string.</param>
62 public void Initialise(string connectionString)
63 { 55 {
64 if (!string.IsNullOrEmpty(connectionString)) 56 m_Realm = realm;
65 { 57 m_ConnectionString = connectionString;
66 _Database = new MSSQLManager(connectionString); 58 m_database = new MSSQLManager(connectionString);
67 }
68 else
69 {
70 IniFile iniFile = new IniFile("mssql_connection.ini");
71 string settingDataSource = iniFile.ParseFileReadValue("data_source");
72 string settingInitialCatalog = iniFile.ParseFileReadValue("initial_catalog");
73 string settingPersistSecurityInfo = iniFile.ParseFileReadValue("persist_security_info");
74 string settingUserId = iniFile.ParseFileReadValue("user_id");
75 string settingPassword = iniFile.ParseFileReadValue("password");
76
77 _Database = new MSSQLManager(settingDataSource, settingInitialCatalog, settingPersistSecurityInfo, settingUserId, settingPassword);
78 }
79
80 //Migration settings
81 _Database.CheckMigration(_migrationStore);
82 }
83
84 /// <summary>
85 /// Dispose the database
86 /// </summary>
87 public void Dispose() { }
88
89 #region SceneObjectGroup region for loading and Store of the scene.
90
91 /// <summary>
92 /// Loads the objects present in the region.
93 /// </summary>
94 /// <param name="regionUUID">The region UUID.</param>
95 /// <returns></returns>
96 public List<SceneObjectGroup> LoadObjects(UUID regionUUID)
97 {
98 UUID lastGroupID = UUID.Zero;
99
100 Dictionary<UUID, SceneObjectPart> prims = new Dictionary<UUID, SceneObjectPart>();
101 Dictionary<UUID, SceneObjectGroup> objects = new Dictionary<UUID, SceneObjectGroup>();
102 SceneObjectGroup grp = null;
103
104
105 string query = "SELECT *, " +
106 "sort = CASE WHEN prims.UUID = prims.SceneGroupID THEN 0 ELSE 1 END " +
107 "FROM prims " +
108 "LEFT JOIN primshapes ON prims.UUID = primshapes.UUID " +
109 "WHERE RegionUUID = @RegionUUID " +
110 "ORDER BY SceneGroupID asc, sort asc, LinkNumber asc";
111
112 using (AutoClosingSqlCommand command = _Database.Query(query))
113 {
114 command.Parameters.Add(_Database.CreateParameter("@regionUUID", regionUUID));
115
116 using (SqlDataReader reader = command.ExecuteReader())
117 {
118 while (reader.Read())
119 {
120 SceneObjectPart sceneObjectPart = BuildPrim(reader);
121 if (reader["Shape"] is DBNull)
122 sceneObjectPart.Shape = PrimitiveBaseShape.Default;
123 else
124 sceneObjectPart.Shape = BuildShape(reader);
125
126 prims[sceneObjectPart.UUID] = sceneObjectPart;
127
128 UUID groupID = new UUID((Guid)reader["SceneGroupID"]);
129 59
130 if (groupID != lastGroupID) // New SOG 60 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
131 {
132 if (grp != null)
133 objects[grp.UUID] = grp;
134
135 lastGroupID = groupID;
136
137 // There sometimes exist OpenSim bugs that 'orphan groups' so that none of the prims are
138 // recorded as the root prim (for which the UUID must equal the persisted group UUID). In
139 // this case, force the UUID to be the same as the group UUID so that at least these can be
140 // deleted (we need to change the UUID so that any other prims in the linkset can also be
141 // deleted).
142 if (sceneObjectPart.UUID != groupID && groupID != UUID.Zero)
143 {
144 _Log.WarnFormat(
145 "[REGION DB]: Found root prim {0} {1} at {2} where group was actually {3}. Forcing UUID to group UUID",
146 sceneObjectPart.Name, sceneObjectPart.UUID, sceneObjectPart.GroupPosition, groupID);
147
148 sceneObjectPart.UUID = groupID;
149 }
150
151 grp = new SceneObjectGroup(sceneObjectPart);
152 }
153 else
154 {
155 // Black magic to preserve link numbers
156 // Why is this needed, fix this in AddPart method.
157 int link = sceneObjectPart.LinkNum;
158
159 grp.AddPart(sceneObjectPart);
160
161 if (link != 0)
162 sceneObjectPart.LinkNum = link;
163 }
164 }
165 }
166 }
167
168 if (grp != null)
169 objects[grp.UUID] = grp;
170
171 // Instead of attempting to LoadItems on every prim,
172 // most of which probably have no items... get a
173 // list from DB of all prims which have items and
174 // LoadItems only on those
175 List<SceneObjectPart> primsWithInventory = new List<SceneObjectPart>();
176 string qry = "select distinct primID from primitems";
177 using (AutoClosingSqlCommand command = _Database.Query(qry))
178 { 61 {
179 using (SqlDataReader itemReader = command.ExecuteReader()) 62 conn.Open();
180 { 63 Migration m = new Migration(conn, GetType().Assembly, "GridStore");
181 while (itemReader.Read()) 64 m.Update();
182 { 65 }
183 if (!(itemReader["primID"] is DBNull)) 66 }
184 {
185 UUID primID = new UUID(itemReader["primID"].ToString());
186 if (prims.ContainsKey(primID))
187 {
188 primsWithInventory.Add(prims[primID]);
189 }
190 }
191 }
192 }
193 }
194
195 LoadItems(primsWithInventory);
196
197 _Log.DebugFormat("[REGION DB]: Loaded {0} objects using {1} prims", objects.Count, prims.Count);
198 67
199 return new List<SceneObjectGroup>(objects.Values); 68 public List<RegionData> Get(string regionName, UUID scopeID)
200 }
201
202 /// <summary>
203 /// Load in the prim's persisted inventory.
204 /// </summary>
205 /// <param name="allPrims">all prims with inventory on a region</param>
206 private void LoadItems(List<SceneObjectPart> allPrimsWithInventory)
207 { 69 {
208 70 string sql = "select * from ["+m_Realm+"] where regionName like @regionName";
209 using (AutoClosingSqlCommand command = _Database.Query("SELECT * FROM primitems WHERE PrimID = @PrimID")) 71 if (scopeID != UUID.Zero)
72 sql += " and ScopeID = @scopeID";
73 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
74 using (SqlCommand cmd = new SqlCommand(sql, conn))
210 { 75 {
211 foreach (SceneObjectPart objectPart in allPrimsWithInventory) 76 cmd.Parameters.Add(m_database.CreateParameter("@regionName", regionName));
212 { 77 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
213 command.Parameters.Clear(); 78 conn.Open();
214 command.Parameters.Add(_Database.CreateParameter("@PrimID", objectPart.UUID)); 79 return RunCommand(cmd);
215
216 List<TaskInventoryItem> inventory = new List<TaskInventoryItem>();
217
218 using (SqlDataReader reader = command.ExecuteReader())
219 {
220 while (reader.Read())
221 {
222 TaskInventoryItem item = BuildItem(reader);
223
224 item.ParentID = objectPart.UUID; // Values in database are
225 // often wrong
226 inventory.Add(item);
227 }
228 }
229
230 objectPart.Inventory.RestoreInventoryItems(inventory);
231 }
232 } 80 }
233 } 81 }
234 82
235 /// <summary> 83 public RegionData Get(int posX, int posY, UUID scopeID)
236 /// Stores all object's details apart from inventory
237 /// </summary>
238 /// <param name="obj"></param>
239 /// <param name="regionUUID"></param>
240 public void StoreObject(SceneObjectGroup obj, UUID regionUUID)
241 { 84 {
242 _Log.InfoFormat("[MSSQL]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Children.Count); 85 string sql = "select * from ["+m_Realm+"] where locX = @posX and locY = @posY";
86 if (scopeID != UUID.Zero)
87 sql += " and ScopeID = @scopeID";
243 88
244 using (SqlConnection conn = _Database.DatabaseConnection()) 89 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
90 using (SqlCommand cmd = new SqlCommand(sql, conn))
245 { 91 {
246 SqlTransaction transaction = conn.BeginTransaction(); 92 cmd.Parameters.Add(m_database.CreateParameter("@posX", posX.ToString()));
247 93 cmd.Parameters.Add(m_database.CreateParameter("@posY", posY.ToString()));
248 try 94 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
249 { 95 conn.Open();
250 foreach (SceneObjectPart sceneObjectPart in obj.Children.Values) 96 List<RegionData> ret = RunCommand(cmd);
251 { 97 if (ret.Count == 0)
252 //Update prim 98 return null;
253 using (SqlCommand sqlCommand = conn.CreateCommand()) 99
254 { 100 return ret[0];
255 sqlCommand.Transaction = transaction; 101 }
256 try
257 {
258 StoreSceneObjectPrim(sceneObjectPart, sqlCommand, obj.UUID, regionUUID);
259 }
260 catch (SqlException sqlEx)
261 {
262 _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrim SQL error: {0} at line {1}", sqlEx.Message, sqlEx.LineNumber);
263 throw;
264 }
265 }
266
267 //Update primshapes
268 using (SqlCommand sqlCommand = conn.CreateCommand())
269 {
270 sqlCommand.Transaction = transaction;
271 try
272 {
273 StoreSceneObjectPrimShapes(sceneObjectPart, sqlCommand, obj.UUID, regionUUID);
274 }
275 catch (SqlException sqlEx)
276 {
277 _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrimShapes SQL error: {0} at line {1}", sqlEx.Message, sqlEx.LineNumber);
278 throw;
279 }
280 }
281 }
282
283 transaction.Commit();
284 }
285 catch (Exception ex)
286 {
287 _Log.ErrorFormat("[REGION DB]: Store SceneObjectGroup error: {0}, Rolling back...", ex.Message);
288 try
289 {
290 transaction.Rollback();
291 }
292 catch (Exception ex2)
293 {
294 //Show error
295 _Log.InfoFormat("[REGION DB]: Rollback of SceneObjectGroup store transaction failed with error: {0}", ex2.Message);
296
297 }
298 }
299 }
300
301 } 102 }
302 103
303 /// <summary> 104 public RegionData Get(UUID regionID, UUID scopeID)
304 /// Stores the prim of the sceneobjectpart.
305 /// </summary>
306 /// <param name="sceneObjectPart">The sceneobjectpart or prim.</param>
307 /// <param name="sqlCommand">The SQL command with the transaction.</param>
308 /// <param name="sceneGroupID">The scenegroup UUID.</param>
309 /// <param name="regionUUID">The region UUID.</param>
310 private void StoreSceneObjectPrim(SceneObjectPart sceneObjectPart, SqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID)
311 { 105 {
312 //Big query to update or insert a new prim. 106 string sql = "select * from ["+m_Realm+"] where uuid = @regionID";
313 //Note for SQL Server 2008 this could be simplified 107 if (scopeID != UUID.Zero)
314 string queryPrims = @" 108 sql += " and ScopeID = @scopeID";
315IF EXISTS (SELECT UUID FROM prims WHERE UUID = @UUID) 109 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
316 BEGIN 110 using (SqlCommand cmd = new SqlCommand(sql, conn))
317 UPDATE prims SET
318 CreationDate = @CreationDate, Name = @Name, Text = @Text, Description = @Description, SitName = @SitName,
319 TouchName = @TouchName, ObjectFlags = @ObjectFlags, OwnerMask = @OwnerMask, NextOwnerMask = @NextOwnerMask, GroupMask = @GroupMask,
320 EveryoneMask = @EveryoneMask, BaseMask = @BaseMask, PositionX = @PositionX, PositionY = @PositionY, PositionZ = @PositionZ,
321 GroupPositionX = @GroupPositionX, GroupPositionY = @GroupPositionY, GroupPositionZ = @GroupPositionZ, VelocityX = @VelocityX,
322 VelocityY = @VelocityY, VelocityZ = @VelocityZ, AngularVelocityX = @AngularVelocityX, AngularVelocityY = @AngularVelocityY,
323 AngularVelocityZ = @AngularVelocityZ, AccelerationX = @AccelerationX, AccelerationY = @AccelerationY,
324 AccelerationZ = @AccelerationZ, RotationX = @RotationX, RotationY = @RotationY, RotationZ = @RotationZ, RotationW = @RotationW,
325 SitTargetOffsetX = @SitTargetOffsetX, SitTargetOffsetY = @SitTargetOffsetY, SitTargetOffsetZ = @SitTargetOffsetZ,
326 SitTargetOrientW = @SitTargetOrientW, SitTargetOrientX = @SitTargetOrientX, SitTargetOrientY = @SitTargetOrientY,
327 SitTargetOrientZ = @SitTargetOrientZ, RegionUUID = @RegionUUID, CreatorID = @CreatorID, OwnerID = @OwnerID, GroupID = @GroupID,
328 LastOwnerID = @LastOwnerID, SceneGroupID = @SceneGroupID, PayPrice = @PayPrice, PayButton1 = @PayButton1, PayButton2 = @PayButton2,
329 PayButton3 = @PayButton3, PayButton4 = @PayButton4, LoopedSound = @LoopedSound, LoopedSoundGain = @LoopedSoundGain,
330 TextureAnimation = @TextureAnimation, OmegaX = @OmegaX, OmegaY = @OmegaY, OmegaZ = @OmegaZ, CameraEyeOffsetX = @CameraEyeOffsetX,
331 CameraEyeOffsetY = @CameraEyeOffsetY, CameraEyeOffsetZ = @CameraEyeOffsetZ, CameraAtOffsetX = @CameraAtOffsetX,
332 CameraAtOffsetY = @CameraAtOffsetY, CameraAtOffsetZ = @CameraAtOffsetZ, ForceMouselook = @ForceMouselook,
333 ScriptAccessPin = @ScriptAccessPin, AllowedDrop = @AllowedDrop, DieAtEdge = @DieAtEdge, SalePrice = @SalePrice,
334 SaleType = @SaleType, ColorR = @ColorR, ColorG = @ColorG, ColorB = @ColorB, ColorA = @ColorA, ParticleSystem = @ParticleSystem,
335 ClickAction = @ClickAction, Material = @Material, CollisionSound = @CollisionSound, CollisionSoundVolume = @CollisionSoundVolume, PassTouches = @PassTouches,
336 LinkNumber = @LinkNumber
337 WHERE UUID = @UUID
338 END
339ELSE
340 BEGIN
341 INSERT INTO
342 prims (
343 UUID, CreationDate, Name, Text, Description, SitName, TouchName, ObjectFlags, OwnerMask, NextOwnerMask, GroupMask,
344 EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX,
345 VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ,
346 RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW,
347 SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, RegionUUID, CreatorID, OwnerID, GroupID, LastOwnerID, SceneGroupID,
348 PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX,
349 OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ,
350 ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA,
351 ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, PassTouches, LinkNumber
352 ) VALUES (
353 @UUID, @CreationDate, @Name, @Text, @Description, @SitName, @TouchName, @ObjectFlags, @OwnerMask, @NextOwnerMask, @GroupMask,
354 @EveryoneMask, @BaseMask, @PositionX, @PositionY, @PositionZ, @GroupPositionX, @GroupPositionY, @GroupPositionZ, @VelocityX,
355 @VelocityY, @VelocityZ, @AngularVelocityX, @AngularVelocityY, @AngularVelocityZ, @AccelerationX, @AccelerationY, @AccelerationZ,
356 @RotationX, @RotationY, @RotationZ, @RotationW, @SitTargetOffsetX, @SitTargetOffsetY, @SitTargetOffsetZ, @SitTargetOrientW,
357 @SitTargetOrientX, @SitTargetOrientY, @SitTargetOrientZ, @RegionUUID, @CreatorID, @OwnerID, @GroupID, @LastOwnerID, @SceneGroupID,
358 @PayPrice, @PayButton1, @PayButton2, @PayButton3, @PayButton4, @LoopedSound, @LoopedSoundGain, @TextureAnimation, @OmegaX,
359 @OmegaY, @OmegaZ, @CameraEyeOffsetX, @CameraEyeOffsetY, @CameraEyeOffsetZ, @CameraAtOffsetX, @CameraAtOffsetY, @CameraAtOffsetZ,
360 @ForceMouselook, @ScriptAccessPin, @AllowedDrop, @DieAtEdge, @SalePrice, @SaleType, @ColorR, @ColorG, @ColorB, @ColorA,
361 @ParticleSystem, @ClickAction, @Material, @CollisionSound, @CollisionSoundVolume, @PassTouches, @LinkNumber
362 )
363 END";
364
365 //Set commandtext.
366 sqlCommand.CommandText = queryPrims;
367 //Add parameters
368 sqlCommand.Parameters.AddRange(CreatePrimParameters(sceneObjectPart, sceneGroupID, regionUUID));
369
370 //Execute the query. If it fails then error is trapped in calling function
371 sqlCommand.ExecuteNonQuery();
372 }
373
374 /// <summary>
375 /// Stores the scene object prim shapes.
376 /// </summary>
377 /// <param name="sceneObjectPart">The sceneobjectpart containing prim shape.</param>
378 /// <param name="sqlCommand">The SQL command with the transaction.</param>
379 /// <param name="sceneGroupID">The scenegroup UUID.</param>
380 /// <param name="regionUUID">The region UUID.</param>
381 private void StoreSceneObjectPrimShapes(SceneObjectPart sceneObjectPart, SqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID)
382 {
383 //Big query to or insert or update primshapes
384 //Note for SQL Server 2008 this can be simplified
385 string queryPrimShapes = @"
386IF EXISTS (SELECT UUID FROM primshapes WHERE UUID = @UUID)
387 BEGIN
388 UPDATE primshapes SET
389 Shape = @Shape, ScaleX = @ScaleX, ScaleY = @ScaleY, ScaleZ = @ScaleZ, PCode = @PCode, PathBegin = @PathBegin,
390 PathEnd = @PathEnd, PathScaleX = @PathScaleX, PathScaleY = @PathScaleY, PathShearX = @PathShearX, PathShearY = @PathShearY,
391 PathSkew = @PathSkew, PathCurve = @PathCurve, PathRadiusOffset = @PathRadiusOffset, PathRevolutions = @PathRevolutions,
392 PathTaperX = @PathTaperX, PathTaperY = @PathTaperY, PathTwist = @PathTwist, PathTwistBegin = @PathTwistBegin,
393 ProfileBegin = @ProfileBegin, ProfileEnd = @ProfileEnd, ProfileCurve = @ProfileCurve, ProfileHollow = @ProfileHollow,
394 Texture = @Texture, ExtraParams = @ExtraParams, State = @State
395 WHERE UUID = @UUID
396 END
397ELSE
398 BEGIN
399 INSERT INTO
400 primshapes (
401 UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY,
402 PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin,
403 ProfileEnd, ProfileCurve, ProfileHollow, Texture, ExtraParams, State
404 ) VALUES (
405 @UUID, @Shape, @ScaleX, @ScaleY, @ScaleZ, @PCode, @PathBegin, @PathEnd, @PathScaleX, @PathScaleY, @PathShearX, @PathShearY,
406 @PathSkew, @PathCurve, @PathRadiusOffset, @PathRevolutions, @PathTaperX, @PathTaperY, @PathTwist, @PathTwistBegin, @ProfileBegin,
407 @ProfileEnd, @ProfileCurve, @ProfileHollow, @Texture, @ExtraParams, @State
408 )
409 END";
410
411 //Set commandtext.
412 sqlCommand.CommandText = queryPrimShapes;
413
414 //Add parameters
415 sqlCommand.Parameters.AddRange(CreatePrimShapeParameters(sceneObjectPart, sceneGroupID, regionUUID));
416
417 //Execute the query. If it fails then error is trapped in calling function
418 sqlCommand.ExecuteNonQuery();
419
420 }
421
422 /// <summary>
423 /// Removes a object from the database.
424 /// Meaning removing it from tables Prims, PrimShapes and PrimItems
425 /// </summary>
426 /// <param name="objectID">id of scenegroup</param>
427 /// <param name="regionUUID">regionUUID (is this used anyway</param>
428 public void RemoveObject(UUID objectID, UUID regionUUID)
429 {
430 _Log.InfoFormat("[MSSQL]: Removing obj: {0} from region: {1}", objectID, regionUUID);
431
432 //Remove from prims and primsitem table
433 string sqlPrims = "DELETE FROM PRIMS WHERE SceneGroupID = @objectID";
434 string sqlPrimItems = "DELETE FROM PRIMITEMS WHERE primID in (SELECT UUID FROM PRIMS WHERE SceneGroupID = @objectID)";
435 string sqlPrimShapes = "DELETE FROM PRIMSHAPES WHERE uuid in (SELECT UUID FROM PRIMS WHERE SceneGroupID = @objectID)";
436
437 lock (_Database)
438 { 111 {
439 //Using the non transaction mode. 112 cmd.Parameters.Add(m_database.CreateParameter("@regionID", regionID));
440 using (AutoClosingSqlCommand cmd = _Database.Query(sqlPrimShapes)) 113 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
441 { 114 conn.Open();
442 cmd.Parameters.Add(_Database.CreateParameter("objectID", objectID)); 115 List<RegionData> ret = RunCommand(cmd);
443 cmd.ExecuteNonQuery(); 116 if (ret.Count == 0)
444 117 return null;
445 cmd.CommandText = sqlPrimItems; 118
446 cmd.ExecuteNonQuery(); 119 return ret[0];
447
448 cmd.CommandText = sqlPrims;
449 cmd.ExecuteNonQuery();
450 }
451 } 120 }
452 } 121 }
453 122
454 /// <summary> 123 public List<RegionData> Get(int startX, int startY, int endX, int endY, UUID scopeID)
455 /// Store the inventory of a prim. Warning deletes everything first and then adds all again.
456 /// </summary>
457 /// <param name="primID"></param>
458 /// <param name="items"></param>
459 public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items)
460 { 124 {
461 //_Log.InfoFormat("[REGION DB: Persisting Prim Inventory with prim ID {0}", primID); 125 string sql = "select * from ["+m_Realm+"] where locX between @startX and @endX and locY between @startY and @endY";
462 126 if (scopeID != UUID.Zero)
463 //Statement from MySQL section! 127 sql += " and ScopeID = @scopeID";
464 // For now, we're just going to crudely remove all the previous inventory items
465 // no matter whether they have changed or not, and replace them with the current set.
466 128
467 //Delete everything from PrimID 129 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
468 //TODO add index on PrimID in DB, if not already exist 130 using (SqlCommand cmd = new SqlCommand(sql, conn))
469 using (AutoClosingSqlCommand cmd = _Database.Query("DELETE PRIMITEMS WHERE primID = @primID"))
470 { 131 {
471 cmd.Parameters.Add(_Database.CreateParameter("@primID", primID)); 132 cmd.Parameters.Add(m_database.CreateParameter("@startX", startX.ToString()));
472 cmd.ExecuteNonQuery(); 133 cmd.Parameters.Add(m_database.CreateParameter("@startY", startY.ToString()));
473 } 134 cmd.Parameters.Add(m_database.CreateParameter("@endX", endX.ToString()));
474 135 cmd.Parameters.Add(m_database.CreateParameter("@endY", endY.ToString()));
475 string sql = 136 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
476 @"INSERT INTO primitems ( 137 conn.Open();
477 itemID,primID,assetID,parentFolderID,invType,assetType,name,description,creationDate,creatorID,ownerID,lastOwnerID,groupID, 138 return RunCommand(cmd);
478 nextPermissions,currentPermissions,basePermissions,everyonePermissions,groupPermissions,flags)
479 VALUES (@itemID,@primID,@assetID,@parentFolderID,@invType,@assetType,@name,@description,@creationDate,@creatorID,@ownerID,
480 @lastOwnerID,@groupID,@nextPermissions,@currentPermissions,@basePermissions,@everyonePermissions,@groupPermissions,@flags)";
481
482 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
483 {
484 foreach (TaskInventoryItem taskItem in items)
485 {
486 cmd.Parameters.AddRange(CreatePrimInventoryParameters(taskItem));
487 cmd.ExecuteNonQuery();
488
489 cmd.Parameters.Clear();
490 }
491 } 139 }
492 } 140 }
493 141
494 #endregion 142 public List<RegionData> RunCommand(SqlCommand cmd)
495
496 /// <summary>
497 /// Loads the terrain map.
498 /// </summary>
499 /// <param name="regionID">regionID.</param>
500 /// <returns></returns>
501 public double[,] LoadTerrain(UUID regionID)
502 { 143 {
503 double[,] terrain = new double[(int)Constants.RegionSize, (int)Constants.RegionSize]; 144 List<RegionData> retList = new List<RegionData>();
504 terrain.Initialize();
505 145
506 string sql = "select top 1 RegionUUID, Revision, Heightfield from terrain where RegionUUID = @RegionUUID order by Revision desc"; 146 SqlDataReader result = cmd.ExecuteReader();
507 147
508 using (AutoClosingSqlCommand cmd = _Database.Query(sql)) 148 while (result.Read())
509 { 149 {
510 // MySqlParameter param = new MySqlParameter(); 150 RegionData ret = new RegionData();
511 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID)); 151 ret.Data = new Dictionary<string, object>();
512 152
513 using (SqlDataReader reader = cmd.ExecuteReader()) 153 UUID regionID;
154 UUID.TryParse(result["uuid"].ToString(), out regionID);
155 ret.RegionID = regionID;
156 UUID scope;
157 UUID.TryParse(result["ScopeID"].ToString(), out scope);
158 ret.ScopeID = scope;
159 ret.RegionName = result["regionName"].ToString();
160 ret.posX = Convert.ToInt32(result["locX"]);
161 ret.posY = Convert.ToInt32(result["locY"]);
162 ret.sizeX = Convert.ToInt32(result["sizeX"]);
163 ret.sizeY = Convert.ToInt32(result["sizeY"]);
164
165 if (m_ColumnNames == null)
514 { 166 {
515 int rev; 167 m_ColumnNames = new List<string>();
516 if (reader.Read())
517 {
518 MemoryStream str = new MemoryStream((byte[])reader["Heightfield"]);
519 BinaryReader br = new BinaryReader(str);
520 for (int x = 0; x < (int)Constants.RegionSize; x++)
521 {
522 for (int y = 0; y < (int)Constants.RegionSize; y++)
523 {
524 terrain[x, y] = br.ReadDouble();
525 }
526 }
527 rev = (int)reader["Revision"];
528 }
529 else
530 {
531 _Log.Info("[REGION DB]: No terrain found for region");
532 return null;
533 }
534 _Log.Info("[REGION DB]: Loaded terrain revision r" + rev);
535 }
536 }
537
538 return terrain;
539 }
540 168
541 /// <summary> 169 DataTable schemaTable = result.GetSchemaTable();
542 /// Stores the terrain map to DB. 170 foreach (DataRow row in schemaTable.Rows)
543 /// </summary> 171 m_ColumnNames.Add(row["ColumnName"].ToString());
544 /// <param name="terrain">terrain map data.</param>
545 /// <param name="regionID">regionID.</param>
546 public void StoreTerrain(double[,] terrain, UUID regionID)
547 {
548 int revision = Util.UnixTimeSinceEpoch();
549
550 //Delete old terrain map
551 string sql = "delete from terrain where RegionUUID=@RegionUUID";
552 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
553 {
554 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
555 cmd.ExecuteNonQuery();
556 }
557
558 sql = "insert into terrain(RegionUUID, Revision, Heightfield) values(@RegionUUID, @Revision, @Heightfield)";
559
560 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
561 {
562 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
563 cmd.Parameters.Add(_Database.CreateParameter("@Revision", revision));
564 cmd.Parameters.Add(_Database.CreateParameter("@Heightfield", serializeTerrain(terrain)));
565 cmd.ExecuteNonQuery();
566 }
567
568 _Log.Info("[REGION DB]: Stored terrain revision r " + revision);
569 }
570
571 /// <summary>
572 /// Loads all the land objects of a region.
573 /// </summary>
574 /// <param name="regionUUID">The region UUID.</param>
575 /// <returns></returns>
576 public List<LandData> LoadLandObjects(UUID regionUUID)
577 {
578 List<LandData> landDataForRegion = new List<LandData>();
579
580 string sql = "select * from land where RegionUUID = @RegionUUID";
581
582 //Retrieve all land data from region
583 using (AutoClosingSqlCommand cmdLandData = _Database.Query(sql))
584 {
585 cmdLandData.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionUUID));
586
587 using (SqlDataReader readerLandData = cmdLandData.ExecuteReader())
588 {
589 while (readerLandData.Read())
590 {
591 landDataForRegion.Add(BuildLandData(readerLandData));
592 }
593 } 172 }
594 }
595 173
596 //Retrieve all accesslist data for all landdata 174 foreach (string s in m_ColumnNames)
597 foreach (LandData landData in landDataForRegion)
598 {
599 sql = "select * from landaccesslist where LandUUID = @LandUUID";
600 using (AutoClosingSqlCommand cmdAccessList = _Database.Query(sql))
601 { 175 {
602 cmdAccessList.Parameters.Add(_Database.CreateParameter("@LandUUID", landData.GlobalID)); 176 if (s == "uuid")
603 using (SqlDataReader readerAccessList = cmdAccessList.ExecuteReader()) 177 continue;
604 { 178 if (s == "ScopeID")
605 while (readerAccessList.Read()) 179 continue;
606 { 180 if (s == "regionName")
607 landData.ParcelAccessList.Add(BuildLandAccessData(readerAccessList)); 181 continue;
608 } 182 if (s == "locX")
609 } 183 continue;
184 if (s == "locY")
185 continue;
186
187 ret.Data[s] = result[s].ToString();
610 } 188 }
611 }
612 189
613 //Return data 190 retList.Add(ret);
614 return landDataForRegion; 191 }
192 return retList;
615 } 193 }
616 194
617 /// <summary> 195 public bool Store(RegionData data)
618 /// Stores land object with landaccess list.
619 /// </summary>
620 /// <param name="parcel">parcel data.</param>
621 public void StoreLandObject(ILandObject parcel)
622 { 196 {
623 //As this is only one record in land table I just delete all and then add a new record. 197 if (data.Data.ContainsKey("uuid"))
624 //As the delete landaccess is already in the mysql code 198 data.Data.Remove("uuid");
625 199 if (data.Data.ContainsKey("ScopeID"))
626 //Delete old values 200 data.Data.Remove("ScopeID");
627 RemoveLandObject(parcel.LandData.GlobalID); 201 if (data.Data.ContainsKey("regionName"))
628 202 data.Data.Remove("regionName");
629 //Insert new values 203 if (data.Data.ContainsKey("posX"))
630 string sql = @"INSERT INTO [land] 204 data.Data.Remove("posX");
631([UUID],[RegionUUID],[LocalLandID],[Bitmap],[Name],[Description],[OwnerUUID],[IsGroupOwned],[Area],[AuctionID],[Category],[ClaimDate],[ClaimPrice],[GroupUUID],[SalePrice],[LandStatus],[LandFlags],[LandingType],[MediaAutoScale],[MediaTextureUUID],[MediaURL],[MusicURL],[PassHours],[PassPrice],[SnapshotUUID],[UserLocationX],[UserLocationY],[UserLocationZ],[UserLookAtX],[UserLookAtY],[UserLookAtZ],[AuthbuyerID],[OtherCleanTime],[Dwell]) 205 if (data.Data.ContainsKey("posY"))
632VALUES 206 data.Data.Remove("posY");
633(@UUID,@RegionUUID,@LocalLandID,@Bitmap,@Name,@Description,@OwnerUUID,@IsGroupOwned,@Area,@AuctionID,@Category,@ClaimDate,@ClaimPrice,@GroupUUID,@SalePrice,@LandStatus,@LandFlags,@LandingType,@MediaAutoScale,@MediaTextureUUID,@MediaURL,@MusicURL,@PassHours,@PassPrice,@SnapshotUUID,@UserLocationX,@UserLocationY,@UserLocationZ,@UserLookAtX,@UserLookAtY,@UserLookAtZ,@AuthbuyerID,@OtherCleanTime,@Dwell)"; 207 if (data.Data.ContainsKey("sizeX"))
634 208 data.Data.Remove("sizeX");
635 using (AutoClosingSqlCommand cmd = _Database.Query(sql)) 209 if (data.Data.ContainsKey("sizeY"))
210 data.Data.Remove("sizeY");
211 if (data.Data.ContainsKey("locX"))
212 data.Data.Remove("locX");
213 if (data.Data.ContainsKey("locY"))
214 data.Data.Remove("locY");
215
216 string[] fields = new List<string>(data.Data.Keys).ToArray();
217
218 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
219 using (SqlCommand cmd = new SqlCommand())
636 { 220 {
637 cmd.Parameters.AddRange(CreateLandParameters(parcel.LandData, parcel.RegionUUID));
638
639 cmd.ExecuteNonQuery();
640 }
641
642 sql = "INSERT INTO [landaccesslist] ([LandUUID],[AccessUUID],[Flags]) VALUES (@LandUUID,@AccessUUID,@Flags)";
643 221
644 using (AutoClosingSqlCommand cmd = _Database.Query(sql)) 222 string update = "update [" + m_Realm + "] set locX=@posX, locY=@posY, sizeX=@sizeX, sizeY=@sizeY ";
645 { 223
646 foreach (ParcelManager.ParcelAccessEntry parcelAccessEntry in parcel.LandData.ParcelAccessList) 224 foreach (string field in fields)
647 { 225 {
648 cmd.Parameters.AddRange(CreateLandAccessParameters(parcelAccessEntry, parcel.RegionUUID));
649
650 cmd.ExecuteNonQuery();
651 cmd.Parameters.Clear();
652 }
653 }
654 }
655 226
656 /// <summary> 227 update += ", ";
657 /// Removes a land object from DB. 228 update += "[" + field + "] = @" + field;
658 /// </summary>
659 /// <param name="globalID">UUID of landobject</param>
660 public void RemoveLandObject(UUID globalID)
661 {
662 using (AutoClosingSqlCommand cmd = _Database.Query("delete from land where UUID=@UUID"))
663 {
664 cmd.Parameters.Add(_Database.CreateParameter("@UUID", globalID));
665 cmd.ExecuteNonQuery();
666 }
667 229
668 using (AutoClosingSqlCommand cmd = _Database.Query("delete from landaccesslist where LandUUID=@UUID")) 230 cmd.Parameters.Add(m_database.CreateParameter("@" + field, data.Data[field]));
669 { 231 }
670 cmd.Parameters.Add(_Database.CreateParameter("@UUID", globalID));
671 cmd.ExecuteNonQuery();
672 }
673 }
674 232
675 /// <summary> 233 update += " where uuid = @regionID";
676 /// Loads the settings of a region. 234
677 /// </summary> 235 if (data.ScopeID != UUID.Zero)
678 /// <param name="regionUUID">The region UUID.</param> 236 update += " and ScopeID = @scopeID";
679 /// <returns></returns> 237
680 public RegionSettings LoadRegionSettings(UUID regionUUID) 238 cmd.CommandText = update;
681 { 239 cmd.Connection = conn;
682 string sql = "select * from regionsettings where regionUUID = @regionUUID"; 240 cmd.Parameters.Add(m_database.CreateParameter("@regionID", data.RegionID));
683 RegionSettings regionSettings; 241 cmd.Parameters.Add(m_database.CreateParameter("@regionName", data.RegionName));
684 using (AutoClosingSqlCommand cmd = _Database.Query(sql)) 242 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", data.ScopeID));
685 { 243 cmd.Parameters.Add(m_database.CreateParameter("@posX", data.posX));
686 cmd.Parameters.Add(_Database.CreateParameter("@regionUUID", regionUUID)); 244 cmd.Parameters.Add(m_database.CreateParameter("@posY", data.posY));
687 using (SqlDataReader reader = cmd.ExecuteReader()) 245 cmd.Parameters.Add(m_database.CreateParameter("@sizeX", data.sizeX));
246 cmd.Parameters.Add(m_database.CreateParameter("@sizeY", data.sizeY));
247 conn.Open();
248 try
688 { 249 {
689 if (reader.Read()) 250 if (cmd.ExecuteNonQuery() < 1)
690 { 251 {
691 regionSettings = BuildRegionSettings(reader); 252 string insert = "insert into [" + m_Realm + "] ([uuid], [ScopeID], [locX], [locY], [sizeX], [sizeY], [regionName], [" +
692 regionSettings.OnSave += StoreRegionSettings; 253 String.Join("], [", fields) +
254 "]) values ( @regionID, @scopeID, @posX, @posY, @sizeX, @sizeY, @regionName, @" + String.Join(", @", fields) + ")";
255
256 cmd.CommandText = insert;
693 257
694 return regionSettings; 258 try
259 {
260 if (cmd.ExecuteNonQuery() < 1)
261 {
262 return false;
263 }
264 }
265 catch (Exception ex)
266 {
267 m_log.Warn("[MSSQL Grid]: Error inserting into Regions table: " + ex.Message + ", INSERT sql: " + insert);
268 }
695 } 269 }
696 } 270 }
697 } 271 catch (Exception ex)
698
699 //If comes here then there is now region setting for that region
700 regionSettings = new RegionSettings();
701 regionSettings.RegionUUID = regionUUID;
702 regionSettings.OnSave += StoreRegionSettings;
703
704 //Store new values
705 StoreNewRegionSettings(regionSettings);
706
707 return regionSettings;
708 }
709
710 /// <summary>
711 /// Store region settings, need to check if the check is really necesary. If we can make something for creating new region.
712 /// </summary>
713 /// <param name="regionSettings">region settings.</param>
714 public void StoreRegionSettings(RegionSettings regionSettings)
715 {
716 //Little check if regionUUID already exist in DB
717 string regionUUID;
718 using (AutoClosingSqlCommand cmd = _Database.Query("SELECT regionUUID FROM regionsettings WHERE regionUUID = @regionUUID"))
719 {
720 cmd.Parameters.Add(_Database.CreateParameter("@regionUUID", regionSettings.RegionUUID));
721 regionUUID = cmd.ExecuteScalar().ToString();
722 }
723
724 if (string.IsNullOrEmpty(regionUUID))
725 {
726 StoreNewRegionSettings(regionSettings);
727 }
728 else
729 {
730 //This method only updates region settings!!! First call LoadRegionSettings to create new region settings in DB
731 string sql =
732 @"UPDATE [regionsettings] SET [block_terraform] = @block_terraform ,[block_fly] = @block_fly ,[allow_damage] = @allow_damage
733,[restrict_pushing] = @restrict_pushing ,[allow_land_resell] = @allow_land_resell ,[allow_land_join_divide] = @allow_land_join_divide
734,[block_show_in_search] = @block_show_in_search ,[agent_limit] = @agent_limit ,[object_bonus] = @object_bonus ,[maturity] = @maturity
735,[disable_scripts] = @disable_scripts ,[disable_collisions] = @disable_collisions ,[disable_physics] = @disable_physics
736,[terrain_texture_1] = @terrain_texture_1 ,[terrain_texture_2] = @terrain_texture_2 ,[terrain_texture_3] = @terrain_texture_3
737,[terrain_texture_4] = @terrain_texture_4 ,[elevation_1_nw] = @elevation_1_nw ,[elevation_2_nw] = @elevation_2_nw
738,[elevation_1_ne] = @elevation_1_ne ,[elevation_2_ne] = @elevation_2_ne ,[elevation_1_se] = @elevation_1_se ,[elevation_2_se] = @elevation_2_se
739,[elevation_1_sw] = @elevation_1_sw ,[elevation_2_sw] = @elevation_2_sw ,[water_height] = @water_height ,[terrain_raise_limit] = @terrain_raise_limit
740,[terrain_lower_limit] = @terrain_lower_limit ,[use_estate_sun] = @use_estate_sun ,[fixed_sun] = @fixed_sun ,[sun_position] = @sun_position
741,[covenant] = @covenant , [sunvectorx] = @sunvectorx, [sunvectory] = @sunvectory, [sunvectorz] = @sunvectorz, [Sandbox] = @Sandbox, [loaded_creation_datetime] = @loaded_creation_datetime, [loaded_creation_id] = @loaded_creation_id
742 WHERE [regionUUID] = @regionUUID";
743
744 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
745 { 272 {
746 cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings)); 273 m_log.Warn("[MSSQL Grid]: Error updating Regions table: " + ex.Message + ", UPDATE sql: " + update);
747
748 cmd.ExecuteNonQuery();
749 } 274 }
750 } 275 }
751 }
752
753 public void Shutdown()
754 {
755 //Not used??
756 }
757
758 #region Private Methods
759
760 /// <summary>
761 /// Serializes the terrain data for storage in DB.
762 /// </summary>
763 /// <param name="val">terrain data</param>
764 /// <returns></returns>
765 private static Array serializeTerrain(double[,] val)
766 {
767 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) * sizeof(double));
768 BinaryWriter bw = new BinaryWriter(str);
769
770 // TODO: COMPATIBILITY - Add byte-order conversions
771 for (int x = 0; x < (int)Constants.RegionSize; x++)
772 for (int y = 0; y < (int)Constants.RegionSize; y++)
773 {
774 double height = val[x, y];
775 if (height == 0.0)
776 height = double.Epsilon;
777 276
778 bw.Write(height); 277 return true;
779 }
780
781 return str.ToArray();
782 } 278 }
783 279
784 /// <summary> 280 public bool SetDataItem(UUID regionID, string item, string value)
785 /// Stores new regionsettings.
786 /// </summary>
787 /// <param name="regionSettings">The region settings.</param>
788 private void StoreNewRegionSettings(RegionSettings regionSettings)
789 { 281 {
790 string sql = @"INSERT INTO [regionsettings] 282 string sql = "update [" + m_Realm +
791 ([regionUUID],[block_terraform],[block_fly],[allow_damage],[restrict_pushing],[allow_land_resell],[allow_land_join_divide], 283 "] set [" + item + "] = @" + item + " where uuid = @UUID";
792 [block_show_in_search],[agent_limit],[object_bonus],[maturity],[disable_scripts],[disable_collisions],[disable_physics], 284 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
793 [terrain_texture_1],[terrain_texture_2],[terrain_texture_3],[terrain_texture_4],[elevation_1_nw],[elevation_2_nw],[elevation_1_ne], 285 using (SqlCommand cmd = new SqlCommand(sql, conn))
794 [elevation_2_ne],[elevation_1_se],[elevation_2_se],[elevation_1_sw],[elevation_2_sw],[water_height],[terrain_raise_limit],
795 [terrain_lower_limit],[use_estate_sun],[fixed_sun],[sun_position],[covenant],[sunvectorx], [sunvectory], [sunvectorz],[Sandbox], [loaded_creation_datetime], [loaded_creation_id]
796 )
797 VALUES
798 (@regionUUID,@block_terraform,@block_fly,@allow_damage,@restrict_pushing,@allow_land_resell,@allow_land_join_divide,
799 @block_show_in_search,@agent_limit,@object_bonus,@maturity,@disable_scripts,@disable_collisions,@disable_physics,
800 @terrain_texture_1,@terrain_texture_2,@terrain_texture_3,@terrain_texture_4,@elevation_1_nw,@elevation_2_nw,@elevation_1_ne,
801 @elevation_2_ne,@elevation_1_se,@elevation_2_se,@elevation_1_sw,@elevation_2_sw,@water_height,@terrain_raise_limit,
802 @terrain_lower_limit,@use_estate_sun,@fixed_sun,@sun_position,@covenant,@sunvectorx,@sunvectory, @sunvectorz, @Sandbox, @loaded_creation_datetime, @loaded_creation_id)";
803
804 using (AutoClosingSqlCommand cmd = _Database.Query(sql))
805 { 286 {
806 cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings)); 287 cmd.Parameters.Add(m_database.CreateParameter("@" + item, value));
807 cmd.ExecuteNonQuery(); 288 cmd.Parameters.Add(m_database.CreateParameter("@UUID", regionID));
289 conn.Open();
290 if (cmd.ExecuteNonQuery() > 0)
291 return true;
808 } 292 }
293 return false;
809 } 294 }
810 295
811 #region Private DataRecord conversion methods 296 public bool Delete(UUID regionID)
812
813 /// <summary>
814 /// Builds the region settings from a datarecod.
815 /// </summary>
816 /// <param name="row">datarecord with regionsettings.</param>
817 /// <returns></returns>
818 private static RegionSettings BuildRegionSettings(IDataRecord row)
819 { 297 {
820 //TODO change this is some more generic code so we doesnt have to change it every time a new field is added? 298 string sql = "delete from [" + m_Realm +
821 RegionSettings newSettings = new RegionSettings(); 299 "] where uuid = @UUID";
822 300 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
823 newSettings.RegionUUID = new UUID((Guid)row["regionUUID"]); 301 using (SqlCommand cmd = new SqlCommand(sql, conn))
824 newSettings.BlockTerraform = Convert.ToBoolean(row["block_terraform"]);
825 newSettings.AllowDamage = Convert.ToBoolean(row["allow_damage"]);
826 newSettings.BlockFly = Convert.ToBoolean(row["block_fly"]);
827 newSettings.RestrictPushing = Convert.ToBoolean(row["restrict_pushing"]);
828 newSettings.AllowLandResell = Convert.ToBoolean(row["allow_land_resell"]);
829 newSettings.AllowLandJoinDivide = Convert.ToBoolean(row["allow_land_join_divide"]);
830 newSettings.BlockShowInSearch = Convert.ToBoolean(row["block_show_in_search"]);
831 newSettings.AgentLimit = Convert.ToInt32(row["agent_limit"]);
832 newSettings.ObjectBonus = Convert.ToDouble(row["object_bonus"]);
833 newSettings.Maturity = Convert.ToInt32(row["maturity"]);
834 newSettings.DisableScripts = Convert.ToBoolean(row["disable_scripts"]);
835 newSettings.DisableCollisions = Convert.ToBoolean(row["disable_collisions"]);
836 newSettings.DisablePhysics = Convert.ToBoolean(row["disable_physics"]);
837 newSettings.TerrainTexture1 = new UUID((Guid)row["terrain_texture_1"]);
838 newSettings.TerrainTexture2 = new UUID((Guid)row["terrain_texture_2"]);
839 newSettings.TerrainTexture3 = new UUID((Guid)row["terrain_texture_3"]);
840 newSettings.TerrainTexture4 = new UUID((Guid)row["terrain_texture_4"]);
841 newSettings.Elevation1NW = Convert.ToDouble(row["elevation_1_nw"]);
842 newSettings.Elevation2NW = Convert.ToDouble(row["elevation_2_nw"]);
843 newSettings.Elevation1NE = Convert.ToDouble(row["elevation_1_ne"]);
844 newSettings.Elevation2NE = Convert.ToDouble(row["elevation_2_ne"]);
845 newSettings.Elevation1SE = Convert.ToDouble(row["elevation_1_se"]);
846 newSettings.Elevation2SE = Convert.ToDouble(row["elevation_2_se"]);
847 newSettings.Elevation1SW = Convert.ToDouble(row["elevation_1_sw"]);
848 newSettings.Elevation2SW = Convert.ToDouble(row["elevation_2_sw"]);
849 newSettings.WaterHeight = Convert.ToDouble(row["water_height"]);
850 newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]);
851 newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]);
852 newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]);
853 newSettings.Sandbox = Convert.ToBoolean(row["sandbox"]);
854 newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]);
855 newSettings.SunPosition = Convert.ToDouble(row["sun_position"]);
856 newSettings.SunVector = new Vector3(
857 Convert.ToSingle(row["sunvectorx"]),
858 Convert.ToSingle(row["sunvectory"]),
859 Convert.ToSingle(row["sunvectorz"])
860 );
861 newSettings.Covenant = new UUID((Guid)row["covenant"]);
862
863 newSettings.LoadedCreationDateTime = Convert.ToInt32(row["loaded_creation_datetime"]);
864
865 if (row["loaded_creation_id"] is DBNull)
866 newSettings.LoadedCreationID = "";
867 else
868 newSettings.LoadedCreationID = (String)row["loaded_creation_id"];
869 return newSettings;
870 }
871
872 /// <summary>
873 /// Builds the land data from a datarecord.
874 /// </summary>
875 /// <param name="row">datarecord with land data</param>
876 /// <returns></returns>
877 private static LandData BuildLandData(IDataRecord row)
878 {
879 LandData newData = new LandData();
880
881 newData.GlobalID = new UUID((Guid)row["UUID"]);
882 newData.LocalID = Convert.ToInt32(row["LocalLandID"]);
883
884 // Bitmap is a byte[512]
885 newData.Bitmap = (Byte[])row["Bitmap"];
886
887 newData.Name = (string)row["Name"];
888 newData.Description = (string)row["Description"];
889 newData.OwnerID = new UUID((Guid)row["OwnerUUID"]);
890 newData.IsGroupOwned = Convert.ToBoolean(row["IsGroupOwned"]);
891 newData.Area = Convert.ToInt32(row["Area"]);
892 newData.AuctionID = Convert.ToUInt32(row["AuctionID"]); //Unemplemented
893 newData.Category = (ParcelCategory)Convert.ToInt32(row["Category"]);
894 //Enum libsecondlife.Parcel.ParcelCategory
895 newData.ClaimDate = Convert.ToInt32(row["ClaimDate"]);
896 newData.ClaimPrice = Convert.ToInt32(row["ClaimPrice"]);
897 newData.GroupID = new UUID((Guid)row["GroupUUID"]);
898 newData.SalePrice = Convert.ToInt32(row["SalePrice"]);
899 newData.Status = (ParcelStatus)Convert.ToInt32(row["LandStatus"]);
900 //Enum. libsecondlife.Parcel.ParcelStatus
901 newData.Flags = Convert.ToUInt32(row["LandFlags"]);
902 newData.LandingType = Convert.ToByte(row["LandingType"]);
903 newData.MediaAutoScale = Convert.ToByte(row["MediaAutoScale"]);
904 newData.MediaID = new UUID((Guid)row["MediaTextureUUID"]);
905 newData.MediaURL = (string)row["MediaURL"];
906 newData.MusicURL = (string)row["MusicURL"];
907 newData.PassHours = Convert.ToSingle(row["PassHours"]);
908 newData.PassPrice = Convert.ToInt32(row["PassPrice"]);
909
910// UUID authedbuyer;
911// UUID snapshotID;
912//
913// if (UUID.TryParse((string)row["AuthBuyerID"], out authedbuyer))
914// newData.AuthBuyerID = authedbuyer;
915//
916// if (UUID.TryParse((string)row["SnapshotUUID"], out snapshotID))
917// newData.SnapshotID = snapshotID;
918 newData.AuthBuyerID = new UUID((Guid) row["AuthBuyerID"]);
919 newData.SnapshotID = new UUID((Guid)row["SnapshotUUID"]);
920
921 newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]);
922 newData.Dwell = Convert.ToInt32(row["Dwell"]);
923
924 try
925 { 302 {
926 newData.UserLocation = 303 cmd.Parameters.Add(m_database.CreateParameter("@UUID", regionID));
927 new Vector3(Convert.ToSingle(row["UserLocationX"]), Convert.ToSingle(row["UserLocationY"]), 304 conn.Open();
928 Convert.ToSingle(row["UserLocationZ"])); 305 if (cmd.ExecuteNonQuery() > 0)
929 newData.UserLookAt = 306 return true;
930 new Vector3(Convert.ToSingle(row["UserLookAtX"]), Convert.ToSingle(row["UserLookAtY"]),
931 Convert.ToSingle(row["UserLookAtZ"]));
932 } 307 }
933 catch (InvalidCastException) 308 return false;
934 {
935 newData.UserLocation = Vector3.Zero;
936 newData.UserLookAt = Vector3.Zero;
937 _Log.ErrorFormat("[PARCEL]: unable to get parcel telehub settings for {1}", newData.Name);
938 }
939
940 newData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
941
942 return newData;
943 }
944
945 /// <summary>
946 /// Builds the landaccess data from a data record.
947 /// </summary>
948 /// <param name="row">datarecord with landaccess data</param>
949 /// <returns></returns>
950 private static ParcelManager.ParcelAccessEntry BuildLandAccessData(IDataRecord row)
951 {
952 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
953 entry.AgentID = new UUID((Guid)row["AccessUUID"]);
954 entry.Flags = (AccessList)Convert.ToInt32(row["Flags"]);
955 entry.Time = new DateTime();
956 return entry;
957 } 309 }
958
959 /// <summary>
960 /// Builds the prim from a datarecord.
961 /// </summary>
962 /// <param name="primRow">datarecord</param>
963 /// <returns></returns>
964 private static SceneObjectPart BuildPrim(IDataRecord primRow)
965 {
966 SceneObjectPart prim = new SceneObjectPart();
967
968 prim.UUID = new UUID((Guid)primRow["UUID"]);
969 // explicit conversion of integers is required, which sort
970 // of sucks. No idea if there is a shortcut here or not.
971 prim.CreationDate = Convert.ToInt32(primRow["CreationDate"]);
972 prim.Name = (string)primRow["Name"];
973 // various text fields
974 prim.Text = (string)primRow["Text"];
975 prim.Color = Color.FromArgb(Convert.ToInt32(primRow["ColorA"]),
976 Convert.ToInt32(primRow["ColorR"]),
977 Convert.ToInt32(primRow["ColorG"]),
978 Convert.ToInt32(primRow["ColorB"]));
979 prim.Description = (string)primRow["Description"];
980 prim.SitName = (string)primRow["SitName"];
981 prim.TouchName = (string)primRow["TouchName"];
982 // permissions
983 prim.ObjectFlags = Convert.ToUInt32(primRow["ObjectFlags"]);
984 prim.CreatorID = new UUID((Guid)primRow["CreatorID"]);
985 prim.OwnerID = new UUID((Guid)primRow["OwnerID"]);
986 prim.GroupID = new UUID((Guid)primRow["GroupID"]);
987 prim.LastOwnerID = new UUID((Guid)primRow["LastOwnerID"]);
988 prim.OwnerMask = Convert.ToUInt32(primRow["OwnerMask"]);
989 prim.NextOwnerMask = Convert.ToUInt32(primRow["NextOwnerMask"]);
990 prim.GroupMask = Convert.ToUInt32(primRow["GroupMask"]);
991 prim.EveryoneMask = Convert.ToUInt32(primRow["EveryoneMask"]);
992 prim.BaseMask = Convert.ToUInt32(primRow["BaseMask"]);
993 // vectors
994 prim.OffsetPosition = new Vector3(
995 Convert.ToSingle(primRow["PositionX"]),
996 Convert.ToSingle(primRow["PositionY"]),
997 Convert.ToSingle(primRow["PositionZ"]));
998
999 prim.GroupPosition = new Vector3(
1000 Convert.ToSingle(primRow["GroupPositionX"]),
1001 Convert.ToSingle(primRow["GroupPositionY"]),
1002 Convert.ToSingle(primRow["GroupPositionZ"]));
1003
1004 prim.Velocity = new Vector3(
1005 Convert.ToSingle(primRow["VelocityX"]),
1006 Convert.ToSingle(primRow["VelocityY"]),
1007 Convert.ToSingle(primRow["VelocityZ"]));
1008
1009 prim.AngularVelocity = new Vector3(
1010 Convert.ToSingle(primRow["AngularVelocityX"]),
1011 Convert.ToSingle(primRow["AngularVelocityY"]),
1012 Convert.ToSingle(primRow["AngularVelocityZ"]));
1013
1014 prim.Acceleration = new Vector3(
1015 Convert.ToSingle(primRow["AccelerationX"]),
1016 Convert.ToSingle(primRow["AccelerationY"]),
1017 Convert.ToSingle(primRow["AccelerationZ"]));
1018
1019 // quaternions
1020 prim.RotationOffset = new Quaternion(
1021 Convert.ToSingle(primRow["RotationX"]),
1022 Convert.ToSingle(primRow["RotationY"]),
1023 Convert.ToSingle(primRow["RotationZ"]),
1024 Convert.ToSingle(primRow["RotationW"]));
1025
1026 prim.SitTargetPositionLL = new Vector3(
1027 Convert.ToSingle(primRow["SitTargetOffsetX"]),
1028 Convert.ToSingle(primRow["SitTargetOffsetY"]),
1029 Convert.ToSingle(primRow["SitTargetOffsetZ"]));
1030
1031 prim.SitTargetOrientationLL = new Quaternion(
1032 Convert.ToSingle(primRow["SitTargetOrientX"]),
1033 Convert.ToSingle(primRow["SitTargetOrientY"]),
1034 Convert.ToSingle(primRow["SitTargetOrientZ"]),
1035 Convert.ToSingle(primRow["SitTargetOrientW"]));
1036
1037 prim.PayPrice[0] = Convert.ToInt32(primRow["PayPrice"]);
1038 prim.PayPrice[1] = Convert.ToInt32(primRow["PayButton1"]);
1039 prim.PayPrice[2] = Convert.ToInt32(primRow["PayButton2"]);
1040 prim.PayPrice[3] = Convert.ToInt32(primRow["PayButton3"]);
1041 prim.PayPrice[4] = Convert.ToInt32(primRow["PayButton4"]);
1042
1043 prim.Sound = new UUID((Guid)primRow["LoopedSound"]);
1044 prim.SoundGain = Convert.ToSingle(primRow["LoopedSoundGain"]);
1045 prim.SoundFlags = 1; // If it's persisted at all, it's looped
1046
1047 if (!(primRow["TextureAnimation"] is DBNull))
1048 prim.TextureAnimation = (Byte[])primRow["TextureAnimation"];
1049 if (!(primRow["ParticleSystem"] is DBNull))
1050 prim.ParticleSystem = (Byte[])primRow["ParticleSystem"];
1051
1052 prim.RotationalVelocity = new Vector3(
1053 Convert.ToSingle(primRow["OmegaX"]),
1054 Convert.ToSingle(primRow["OmegaY"]),
1055 Convert.ToSingle(primRow["OmegaZ"]));
1056
1057 prim.SetCameraEyeOffset(new Vector3(
1058 Convert.ToSingle(primRow["CameraEyeOffsetX"]),
1059 Convert.ToSingle(primRow["CameraEyeOffsetY"]),
1060 Convert.ToSingle(primRow["CameraEyeOffsetZ"])
1061 ));
1062
1063 prim.SetCameraAtOffset(new Vector3(
1064 Convert.ToSingle(primRow["CameraAtOffsetX"]),
1065 Convert.ToSingle(primRow["CameraAtOffsetY"]),
1066 Convert.ToSingle(primRow["CameraAtOffsetZ"])
1067 ));
1068
1069 if (Convert.ToInt16(primRow["ForceMouselook"]) != 0)
1070 prim.SetForceMouselook(true);
1071
1072 prim.ScriptAccessPin = Convert.ToInt32(primRow["ScriptAccessPin"]);
1073
1074 if (Convert.ToInt16(primRow["AllowedDrop"]) != 0)
1075 prim.AllowedDrop = true;
1076
1077 if (Convert.ToInt16(primRow["DieAtEdge"]) != 0)
1078 prim.DIE_AT_EDGE = true;
1079
1080 prim.SalePrice = Convert.ToInt32(primRow["SalePrice"]);
1081 prim.ObjectSaleType = Convert.ToByte(primRow["SaleType"]);
1082
1083 prim.Material = Convert.ToByte(primRow["Material"]);
1084
1085 if (!(primRow["ClickAction"] is DBNull))
1086 prim.ClickAction = Convert.ToByte(primRow["ClickAction"]);
1087
1088 prim.CollisionSound = new UUID((Guid)primRow["CollisionSound"]);
1089 prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]);
1090 if (Convert.ToInt16(primRow["PassTouches"]) != 0)
1091 prim.PassTouches = true;
1092 prim.LinkNum = Convert.ToInt32(primRow["LinkNumber"]);
1093
1094 return prim;
1095 }
1096
1097 /// <summary>
1098 /// Builds the prim shape from a datarecord.
1099 /// </summary>
1100 /// <param name="shapeRow">The row.</param>
1101 /// <returns></returns>
1102 private static PrimitiveBaseShape BuildShape(IDataRecord shapeRow)
1103 {
1104 PrimitiveBaseShape baseShape = new PrimitiveBaseShape();
1105
1106 baseShape.Scale = new Vector3(
1107 Convert.ToSingle(shapeRow["ScaleX"]),
1108 Convert.ToSingle(shapeRow["ScaleY"]),
1109 Convert.ToSingle(shapeRow["ScaleZ"]));
1110
1111 // paths
1112 baseShape.PCode = Convert.ToByte(shapeRow["PCode"]);
1113 baseShape.PathBegin = Convert.ToUInt16(shapeRow["PathBegin"]);
1114 baseShape.PathEnd = Convert.ToUInt16(shapeRow["PathEnd"]);
1115 baseShape.PathScaleX = Convert.ToByte(shapeRow["PathScaleX"]);
1116 baseShape.PathScaleY = Convert.ToByte(shapeRow["PathScaleY"]);
1117 baseShape.PathShearX = Convert.ToByte(shapeRow["PathShearX"]);
1118 baseShape.PathShearY = Convert.ToByte(shapeRow["PathShearY"]);
1119 baseShape.PathSkew = Convert.ToSByte(shapeRow["PathSkew"]);
1120 baseShape.PathCurve = Convert.ToByte(shapeRow["PathCurve"]);
1121 baseShape.PathRadiusOffset = Convert.ToSByte(shapeRow["PathRadiusOffset"]);
1122 baseShape.PathRevolutions = Convert.ToByte(shapeRow["PathRevolutions"]);
1123 baseShape.PathTaperX = Convert.ToSByte(shapeRow["PathTaperX"]);
1124 baseShape.PathTaperY = Convert.ToSByte(shapeRow["PathTaperY"]);
1125 baseShape.PathTwist = Convert.ToSByte(shapeRow["PathTwist"]);
1126 baseShape.PathTwistBegin = Convert.ToSByte(shapeRow["PathTwistBegin"]);
1127 // profile
1128 baseShape.ProfileBegin = Convert.ToUInt16(shapeRow["ProfileBegin"]);
1129 baseShape.ProfileEnd = Convert.ToUInt16(shapeRow["ProfileEnd"]);
1130 baseShape.ProfileCurve = Convert.ToByte(shapeRow["ProfileCurve"]);
1131 baseShape.ProfileHollow = Convert.ToUInt16(shapeRow["ProfileHollow"]);
1132
1133 byte[] textureEntry = (byte[])shapeRow["Texture"];
1134 baseShape.TextureEntry = textureEntry;
1135
1136 baseShape.ExtraParams = (byte[])shapeRow["ExtraParams"];
1137
1138 try
1139 {
1140 baseShape.State = Convert.ToByte(shapeRow["State"]);
1141 }
1142 catch (InvalidCastException)
1143 {
1144 }
1145
1146 return baseShape;
1147 }
1148
1149 /// <summary>
1150 /// Build a prim inventory item from the persisted data.
1151 /// </summary>
1152 /// <param name="inventoryRow"></param>
1153 /// <returns></returns>
1154 private static TaskInventoryItem BuildItem(IDataRecord inventoryRow)
1155 {
1156 TaskInventoryItem taskItem = new TaskInventoryItem();
1157
1158 taskItem.ItemID = new UUID((Guid)inventoryRow["itemID"]);
1159 taskItem.ParentPartID = new UUID((Guid)inventoryRow["primID"]);
1160 taskItem.AssetID = new UUID((Guid)inventoryRow["assetID"]);
1161 taskItem.ParentID = new UUID((Guid)inventoryRow["parentFolderID"]);
1162
1163 taskItem.InvType = Convert.ToInt32(inventoryRow["invType"]);
1164 taskItem.Type = Convert.ToInt32(inventoryRow["assetType"]);
1165
1166 taskItem.Name = (string)inventoryRow["name"];
1167 taskItem.Description = (string)inventoryRow["description"];
1168 taskItem.CreationDate = Convert.ToUInt32(inventoryRow["creationDate"]);
1169 taskItem.CreatorID = new UUID((Guid)inventoryRow["creatorID"]);
1170 taskItem.OwnerID = new UUID((Guid)inventoryRow["ownerID"]);
1171 taskItem.LastOwnerID = new UUID((Guid)inventoryRow["lastOwnerID"]);
1172 taskItem.GroupID = new UUID((Guid)inventoryRow["groupID"]);
1173
1174 taskItem.NextPermissions = Convert.ToUInt32(inventoryRow["nextPermissions"]);
1175 taskItem.CurrentPermissions = Convert.ToUInt32(inventoryRow["currentPermissions"]);
1176 taskItem.BasePermissions = Convert.ToUInt32(inventoryRow["basePermissions"]);
1177 taskItem.EveryonePermissions = Convert.ToUInt32(inventoryRow["everyonePermissions"]);
1178 taskItem.GroupPermissions = Convert.ToUInt32(inventoryRow["groupPermissions"]);
1179 taskItem.Flags = Convert.ToUInt32(inventoryRow["flags"]);
1180
1181 return taskItem;
1182 }
1183
1184 #endregion
1185
1186 #region Create parameters methods
1187
1188 /// <summary>
1189 /// Creates the prim inventory parameters.
1190 /// </summary>
1191 /// <param name="taskItem">item in inventory.</param>
1192 /// <returns></returns>
1193 private SqlParameter[] CreatePrimInventoryParameters(TaskInventoryItem taskItem)
1194 {
1195 List<SqlParameter> parameters = new List<SqlParameter>();
1196
1197 parameters.Add(_Database.CreateParameter("itemID", taskItem.ItemID));
1198 parameters.Add(_Database.CreateParameter("primID", taskItem.ParentPartID));
1199 parameters.Add(_Database.CreateParameter("assetID", taskItem.AssetID));
1200 parameters.Add(_Database.CreateParameter("parentFolderID", taskItem.ParentID));
1201 parameters.Add(_Database.CreateParameter("invType", taskItem.InvType));
1202 parameters.Add(_Database.CreateParameter("assetType", taskItem.Type));
1203
1204 parameters.Add(_Database.CreateParameter("name", taskItem.Name));
1205 parameters.Add(_Database.CreateParameter("description", taskItem.Description));
1206 parameters.Add(_Database.CreateParameter("creationDate", taskItem.CreationDate));
1207 parameters.Add(_Database.CreateParameter("creatorID", taskItem.CreatorID));
1208 parameters.Add(_Database.CreateParameter("ownerID", taskItem.OwnerID));
1209 parameters.Add(_Database.CreateParameter("lastOwnerID", taskItem.LastOwnerID));
1210 parameters.Add(_Database.CreateParameter("groupID", taskItem.GroupID));
1211 parameters.Add(_Database.CreateParameter("nextPermissions", taskItem.NextPermissions));
1212 parameters.Add(_Database.CreateParameter("currentPermissions", taskItem.CurrentPermissions));
1213 parameters.Add(_Database.CreateParameter("basePermissions", taskItem.BasePermissions));
1214 parameters.Add(_Database.CreateParameter("everyonePermissions", taskItem.EveryonePermissions));
1215 parameters.Add(_Database.CreateParameter("groupPermissions", taskItem.GroupPermissions));
1216 parameters.Add(_Database.CreateParameter("flags", taskItem.Flags));
1217
1218 return parameters.ToArray();
1219 }
1220
1221 /// <summary>
1222 /// Creates the region setting parameters.
1223 /// </summary>
1224 /// <param name="settings">regionsettings.</param>
1225 /// <returns></returns>
1226 private SqlParameter[] CreateRegionSettingParameters(RegionSettings settings)
1227 {
1228 List<SqlParameter> parameters = new List<SqlParameter>();
1229
1230 parameters.Add(_Database.CreateParameter("regionUUID", settings.RegionUUID));
1231 parameters.Add(_Database.CreateParameter("block_terraform", settings.BlockTerraform));
1232 parameters.Add(_Database.CreateParameter("block_fly", settings.BlockFly));
1233 parameters.Add(_Database.CreateParameter("allow_damage", settings.AllowDamage));
1234 parameters.Add(_Database.CreateParameter("restrict_pushing", settings.RestrictPushing));
1235 parameters.Add(_Database.CreateParameter("allow_land_resell", settings.AllowLandResell));
1236 parameters.Add(_Database.CreateParameter("allow_land_join_divide", settings.AllowLandJoinDivide));
1237 parameters.Add(_Database.CreateParameter("block_show_in_search", settings.BlockShowInSearch));
1238 parameters.Add(_Database.CreateParameter("agent_limit", settings.AgentLimit));
1239 parameters.Add(_Database.CreateParameter("object_bonus", settings.ObjectBonus));
1240 parameters.Add(_Database.CreateParameter("maturity", settings.Maturity));
1241 parameters.Add(_Database.CreateParameter("disable_scripts", settings.DisableScripts));
1242 parameters.Add(_Database.CreateParameter("disable_collisions", settings.DisableCollisions));
1243 parameters.Add(_Database.CreateParameter("disable_physics", settings.DisablePhysics));
1244 parameters.Add(_Database.CreateParameter("terrain_texture_1", settings.TerrainTexture1));
1245 parameters.Add(_Database.CreateParameter("terrain_texture_2", settings.TerrainTexture2));
1246 parameters.Add(_Database.CreateParameter("terrain_texture_3", settings.TerrainTexture3));
1247 parameters.Add(_Database.CreateParameter("terrain_texture_4", settings.TerrainTexture4));
1248 parameters.Add(_Database.CreateParameter("elevation_1_nw", settings.Elevation1NW));
1249 parameters.Add(_Database.CreateParameter("elevation_2_nw", settings.Elevation2NW));
1250 parameters.Add(_Database.CreateParameter("elevation_1_ne", settings.Elevation1NE));
1251 parameters.Add(_Database.CreateParameter("elevation_2_ne", settings.Elevation2NE));
1252 parameters.Add(_Database.CreateParameter("elevation_1_se", settings.Elevation1SE));
1253 parameters.Add(_Database.CreateParameter("elevation_2_se", settings.Elevation2SE));
1254 parameters.Add(_Database.CreateParameter("elevation_1_sw", settings.Elevation1SW));
1255 parameters.Add(_Database.CreateParameter("elevation_2_sw", settings.Elevation2SW));
1256 parameters.Add(_Database.CreateParameter("water_height", settings.WaterHeight));
1257 parameters.Add(_Database.CreateParameter("terrain_raise_limit", settings.TerrainRaiseLimit));
1258 parameters.Add(_Database.CreateParameter("terrain_lower_limit", settings.TerrainLowerLimit));
1259 parameters.Add(_Database.CreateParameter("use_estate_sun", settings.UseEstateSun));
1260 parameters.Add(_Database.CreateParameter("sandbox", settings.Sandbox));
1261 parameters.Add(_Database.CreateParameter("fixed_sun", settings.FixedSun));
1262 parameters.Add(_Database.CreateParameter("sun_position", settings.SunPosition));
1263 parameters.Add(_Database.CreateParameter("sunvectorx", settings.SunVector.X));
1264 parameters.Add(_Database.CreateParameter("sunvectory", settings.SunVector.Y));
1265 parameters.Add(_Database.CreateParameter("sunvectorz", settings.SunVector.Z));
1266 parameters.Add(_Database.CreateParameter("covenant", settings.Covenant));
1267 parameters.Add(_Database.CreateParameter("Loaded_Creation_DateTime", settings.LoadedCreationDateTime));
1268 parameters.Add(_Database.CreateParameter("Loaded_Creation_ID", settings.LoadedCreationID));
1269
1270 return parameters.ToArray();
1271 }
1272
1273 /// <summary>
1274 /// Creates the land parameters.
1275 /// </summary>
1276 /// <param name="land">land parameters.</param>
1277 /// <param name="regionUUID">region UUID.</param>
1278 /// <returns></returns>
1279 private SqlParameter[] CreateLandParameters(LandData land, UUID regionUUID)
1280 {
1281 List<SqlParameter> parameters = new List<SqlParameter>();
1282
1283 parameters.Add(_Database.CreateParameter("UUID", land.GlobalID));
1284 parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID));
1285 parameters.Add(_Database.CreateParameter("LocalLandID", land.LocalID));
1286
1287 // Bitmap is a byte[512]
1288 parameters.Add(_Database.CreateParameter("Bitmap", land.Bitmap));
1289
1290 parameters.Add(_Database.CreateParameter("Name", land.Name));
1291 parameters.Add(_Database.CreateParameter("Description", land.Description));
1292 parameters.Add(_Database.CreateParameter("OwnerUUID", land.OwnerID));
1293 parameters.Add(_Database.CreateParameter("IsGroupOwned", land.IsGroupOwned));
1294 parameters.Add(_Database.CreateParameter("Area", land.Area));
1295 parameters.Add(_Database.CreateParameter("AuctionID", land.AuctionID)); //Unemplemented
1296 parameters.Add(_Database.CreateParameter("Category", (int)land.Category)); //Enum libsecondlife.Parcel.ParcelCategory
1297 parameters.Add(_Database.CreateParameter("ClaimDate", land.ClaimDate));
1298 parameters.Add(_Database.CreateParameter("ClaimPrice", land.ClaimPrice));
1299 parameters.Add(_Database.CreateParameter("GroupUUID", land.GroupID));
1300 parameters.Add(_Database.CreateParameter("SalePrice", land.SalePrice));
1301 parameters.Add(_Database.CreateParameter("LandStatus", (int)land.Status)); //Enum. libsecondlife.Parcel.ParcelStatus
1302 parameters.Add(_Database.CreateParameter("LandFlags", land.Flags));
1303 parameters.Add(_Database.CreateParameter("LandingType", land.LandingType));
1304 parameters.Add(_Database.CreateParameter("MediaAutoScale", land.MediaAutoScale));
1305 parameters.Add(_Database.CreateParameter("MediaTextureUUID", land.MediaID));
1306 parameters.Add(_Database.CreateParameter("MediaURL", land.MediaURL));
1307 parameters.Add(_Database.CreateParameter("MusicURL", land.MusicURL));
1308 parameters.Add(_Database.CreateParameter("PassHours", land.PassHours));
1309 parameters.Add(_Database.CreateParameter("PassPrice", land.PassPrice));
1310 parameters.Add(_Database.CreateParameter("SnapshotUUID", land.SnapshotID));
1311 parameters.Add(_Database.CreateParameter("UserLocationX", land.UserLocation.X));
1312 parameters.Add(_Database.CreateParameter("UserLocationY", land.UserLocation.Y));
1313 parameters.Add(_Database.CreateParameter("UserLocationZ", land.UserLocation.Z));
1314 parameters.Add(_Database.CreateParameter("UserLookAtX", land.UserLookAt.X));
1315 parameters.Add(_Database.CreateParameter("UserLookAtY", land.UserLookAt.Y));
1316 parameters.Add(_Database.CreateParameter("UserLookAtZ", land.UserLookAt.Z));
1317 parameters.Add(_Database.CreateParameter("AuthBuyerID", land.AuthBuyerID));
1318 parameters.Add(_Database.CreateParameter("OtherCleanTime", land.OtherCleanTime));
1319 parameters.Add(_Database.CreateParameter("Dwell", land.Dwell));
1320
1321 return parameters.ToArray();
1322 }
1323
1324 /// <summary>
1325 /// Creates the land access parameters.
1326 /// </summary>
1327 /// <param name="parcelAccessEntry">parcel access entry.</param>
1328 /// <param name="parcelID">parcel ID.</param>
1329 /// <returns></returns>
1330 private SqlParameter[] CreateLandAccessParameters(ParcelManager.ParcelAccessEntry parcelAccessEntry, UUID parcelID)
1331 {
1332 List<SqlParameter> parameters = new List<SqlParameter>();
1333
1334 parameters.Add(_Database.CreateParameter("LandUUID", parcelID));
1335 parameters.Add(_Database.CreateParameter("AccessUUID", parcelAccessEntry.AgentID));
1336 parameters.Add(_Database.CreateParameter("Flags", parcelAccessEntry.Flags));
1337
1338 return parameters.ToArray();
1339 }
1340
1341 /// <summary>
1342 /// Creates the prim parameters for storing in DB.
1343 /// </summary>
1344 /// <param name="prim">Basic data of SceneObjectpart prim.</param>
1345 /// <param name="sceneGroupID">The scenegroup ID.</param>
1346 /// <param name="regionUUID">The region ID.</param>
1347 /// <returns></returns>
1348 private SqlParameter[] CreatePrimParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
1349 {
1350 List<SqlParameter> parameters = new List<SqlParameter>();
1351
1352 parameters.Add(_Database.CreateParameter("UUID", prim.UUID));
1353 parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID));
1354 parameters.Add(_Database.CreateParameter("CreationDate", prim.CreationDate));
1355 parameters.Add(_Database.CreateParameter("Name", prim.Name));
1356 parameters.Add(_Database.CreateParameter("SceneGroupID", sceneGroupID));
1357 // the UUID of the root part for this SceneObjectGroup
1358 // various text fields
1359 parameters.Add(_Database.CreateParameter("Text", prim.Text));
1360 parameters.Add(_Database.CreateParameter("ColorR", prim.Color.R));
1361 parameters.Add(_Database.CreateParameter("ColorG", prim.Color.G));
1362 parameters.Add(_Database.CreateParameter("ColorB", prim.Color.B));
1363 parameters.Add(_Database.CreateParameter("ColorA", prim.Color.A));
1364 parameters.Add(_Database.CreateParameter("Description", prim.Description));
1365 parameters.Add(_Database.CreateParameter("SitName", prim.SitName));
1366 parameters.Add(_Database.CreateParameter("TouchName", prim.TouchName));
1367 // permissions
1368 parameters.Add(_Database.CreateParameter("ObjectFlags", prim.ObjectFlags));
1369 parameters.Add(_Database.CreateParameter("CreatorID", prim.CreatorID));
1370 parameters.Add(_Database.CreateParameter("OwnerID", prim.OwnerID));
1371 parameters.Add(_Database.CreateParameter("GroupID", prim.GroupID));
1372 parameters.Add(_Database.CreateParameter("LastOwnerID", prim.LastOwnerID));
1373 parameters.Add(_Database.CreateParameter("OwnerMask", prim.OwnerMask));
1374 parameters.Add(_Database.CreateParameter("NextOwnerMask", prim.NextOwnerMask));
1375 parameters.Add(_Database.CreateParameter("GroupMask", prim.GroupMask));
1376 parameters.Add(_Database.CreateParameter("EveryoneMask", prim.EveryoneMask));
1377 parameters.Add(_Database.CreateParameter("BaseMask", prim.BaseMask));
1378 // vectors
1379 parameters.Add(_Database.CreateParameter("PositionX", prim.OffsetPosition.X));
1380 parameters.Add(_Database.CreateParameter("PositionY", prim.OffsetPosition.Y));
1381 parameters.Add(_Database.CreateParameter("PositionZ", prim.OffsetPosition.Z));
1382 parameters.Add(_Database.CreateParameter("GroupPositionX", prim.GroupPosition.X));
1383 parameters.Add(_Database.CreateParameter("GroupPositionY", prim.GroupPosition.Y));
1384 parameters.Add(_Database.CreateParameter("GroupPositionZ", prim.GroupPosition.Z));
1385 parameters.Add(_Database.CreateParameter("VelocityX", prim.Velocity.X));
1386 parameters.Add(_Database.CreateParameter("VelocityY", prim.Velocity.Y));
1387 parameters.Add(_Database.CreateParameter("VelocityZ", prim.Velocity.Z));
1388 parameters.Add(_Database.CreateParameter("AngularVelocityX", prim.AngularVelocity.X));
1389 parameters.Add(_Database.CreateParameter("AngularVelocityY", prim.AngularVelocity.Y));
1390 parameters.Add(_Database.CreateParameter("AngularVelocityZ", prim.AngularVelocity.Z));
1391 parameters.Add(_Database.CreateParameter("AccelerationX", prim.Acceleration.X));
1392 parameters.Add(_Database.CreateParameter("AccelerationY", prim.Acceleration.Y));
1393 parameters.Add(_Database.CreateParameter("AccelerationZ", prim.Acceleration.Z));
1394 // quaternions
1395 parameters.Add(_Database.CreateParameter("RotationX", prim.RotationOffset.X));
1396 parameters.Add(_Database.CreateParameter("RotationY", prim.RotationOffset.Y));
1397 parameters.Add(_Database.CreateParameter("RotationZ", prim.RotationOffset.Z));
1398 parameters.Add(_Database.CreateParameter("RotationW", prim.RotationOffset.W));
1399
1400 // Sit target
1401 Vector3 sitTargetPos = prim.SitTargetPositionLL;
1402 parameters.Add(_Database.CreateParameter("SitTargetOffsetX", sitTargetPos.X));
1403 parameters.Add(_Database.CreateParameter("SitTargetOffsetY", sitTargetPos.Y));
1404 parameters.Add(_Database.CreateParameter("SitTargetOffsetZ", sitTargetPos.Z));
1405
1406 Quaternion sitTargetOrient = prim.SitTargetOrientationLL;
1407 parameters.Add(_Database.CreateParameter("SitTargetOrientW", sitTargetOrient.W));
1408 parameters.Add(_Database.CreateParameter("SitTargetOrientX", sitTargetOrient.X));
1409 parameters.Add(_Database.CreateParameter("SitTargetOrientY", sitTargetOrient.Y));
1410 parameters.Add(_Database.CreateParameter("SitTargetOrientZ", sitTargetOrient.Z));
1411
1412 parameters.Add(_Database.CreateParameter("PayPrice", prim.PayPrice[0]));
1413 parameters.Add(_Database.CreateParameter("PayButton1", prim.PayPrice[1]));
1414 parameters.Add(_Database.CreateParameter("PayButton2", prim.PayPrice[2]));
1415 parameters.Add(_Database.CreateParameter("PayButton3", prim.PayPrice[3]));
1416 parameters.Add(_Database.CreateParameter("PayButton4", prim.PayPrice[4]));
1417
1418 if ((prim.SoundFlags & 1) != 0) // Looped
1419 {
1420 parameters.Add(_Database.CreateParameter("LoopedSound", prim.Sound));
1421 parameters.Add(_Database.CreateParameter("LoopedSoundGain", prim.SoundGain));
1422 }
1423 else
1424 {
1425 parameters.Add(_Database.CreateParameter("LoopedSound", UUID.Zero));
1426 parameters.Add(_Database.CreateParameter("LoopedSoundGain", 0.0f));
1427 }
1428
1429 parameters.Add(_Database.CreateParameter("TextureAnimation", prim.TextureAnimation));
1430 parameters.Add(_Database.CreateParameter("ParticleSystem", prim.ParticleSystem));
1431
1432 parameters.Add(_Database.CreateParameter("OmegaX", prim.RotationalVelocity.X));
1433 parameters.Add(_Database.CreateParameter("OmegaY", prim.RotationalVelocity.Y));
1434 parameters.Add(_Database.CreateParameter("OmegaZ", prim.RotationalVelocity.Z));
1435
1436 parameters.Add(_Database.CreateParameter("CameraEyeOffsetX", prim.GetCameraEyeOffset().X));
1437 parameters.Add(_Database.CreateParameter("CameraEyeOffsetY", prim.GetCameraEyeOffset().Y));
1438 parameters.Add(_Database.CreateParameter("CameraEyeOffsetZ", prim.GetCameraEyeOffset().Z));
1439
1440 parameters.Add(_Database.CreateParameter("CameraAtOffsetX", prim.GetCameraAtOffset().X));
1441 parameters.Add(_Database.CreateParameter("CameraAtOffsetY", prim.GetCameraAtOffset().Y));
1442 parameters.Add(_Database.CreateParameter("CameraAtOffsetZ", prim.GetCameraAtOffset().Z));
1443
1444 if (prim.GetForceMouselook())
1445 parameters.Add(_Database.CreateParameter("ForceMouselook", 1));
1446 else
1447 parameters.Add(_Database.CreateParameter("ForceMouselook", 0));
1448
1449 parameters.Add(_Database.CreateParameter("ScriptAccessPin", prim.ScriptAccessPin));
1450
1451 if (prim.AllowedDrop)
1452 parameters.Add(_Database.CreateParameter("AllowedDrop", 1));
1453 else
1454 parameters.Add(_Database.CreateParameter("AllowedDrop", 0));
1455
1456 if (prim.DIE_AT_EDGE)
1457 parameters.Add(_Database.CreateParameter("DieAtEdge", 1));
1458 else
1459 parameters.Add(_Database.CreateParameter("DieAtEdge", 0));
1460
1461 parameters.Add(_Database.CreateParameter("SalePrice", prim.SalePrice));
1462 parameters.Add(_Database.CreateParameter("SaleType", prim.ObjectSaleType));
1463
1464 byte clickAction = prim.ClickAction;
1465 parameters.Add(_Database.CreateParameter("ClickAction", clickAction));
1466
1467 parameters.Add(_Database.CreateParameter("Material", prim.Material));
1468
1469 parameters.Add(_Database.CreateParameter("CollisionSound", prim.CollisionSound));
1470 parameters.Add(_Database.CreateParameter("CollisionSoundVolume", prim.CollisionSoundVolume));
1471 if (prim.PassTouches)
1472 parameters.Add(_Database.CreateParameter("PassTouches", 1));
1473 else
1474 parameters.Add(_Database.CreateParameter("PassTouches", 0));
1475 parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum));
1476
1477 return parameters.ToArray();
1478 }
1479
1480 /// <summary>
1481 /// Creates the primshape parameters for stroing in DB.
1482 /// </summary>
1483 /// <param name="prim">Basic data of SceneObjectpart prim.</param>
1484 /// <param name="sceneGroupID">The scene group ID.</param>
1485 /// <param name="regionUUID">The region UUID.</param>
1486 /// <returns></returns>
1487 private SqlParameter[] CreatePrimShapeParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
1488 {
1489 List<SqlParameter> parameters = new List<SqlParameter>();
1490
1491 PrimitiveBaseShape s = prim.Shape;
1492 parameters.Add(_Database.CreateParameter("UUID", prim.UUID));
1493 // shape is an enum
1494 parameters.Add(_Database.CreateParameter("Shape", 0));
1495 // vectors
1496 parameters.Add(_Database.CreateParameter("ScaleX", s.Scale.X));
1497 parameters.Add(_Database.CreateParameter("ScaleY", s.Scale.Y));
1498 parameters.Add(_Database.CreateParameter("ScaleZ", s.Scale.Z));
1499 // paths
1500 parameters.Add(_Database.CreateParameter("PCode", s.PCode));
1501 parameters.Add(_Database.CreateParameter("PathBegin", s.PathBegin));
1502 parameters.Add(_Database.CreateParameter("PathEnd", s.PathEnd));
1503 parameters.Add(_Database.CreateParameter("PathScaleX", s.PathScaleX));
1504 parameters.Add(_Database.CreateParameter("PathScaleY", s.PathScaleY));
1505 parameters.Add(_Database.CreateParameter("PathShearX", s.PathShearX));
1506 parameters.Add(_Database.CreateParameter("PathShearY", s.PathShearY));
1507 parameters.Add(_Database.CreateParameter("PathSkew", s.PathSkew));
1508 parameters.Add(_Database.CreateParameter("PathCurve", s.PathCurve));
1509 parameters.Add(_Database.CreateParameter("PathRadiusOffset", s.PathRadiusOffset));
1510 parameters.Add(_Database.CreateParameter("PathRevolutions", s.PathRevolutions));
1511 parameters.Add(_Database.CreateParameter("PathTaperX", s.PathTaperX));
1512 parameters.Add(_Database.CreateParameter("PathTaperY", s.PathTaperY));
1513 parameters.Add(_Database.CreateParameter("PathTwist", s.PathTwist));
1514 parameters.Add(_Database.CreateParameter("PathTwistBegin", s.PathTwistBegin));
1515 // profile
1516 parameters.Add(_Database.CreateParameter("ProfileBegin", s.ProfileBegin));
1517 parameters.Add(_Database.CreateParameter("ProfileEnd", s.ProfileEnd));
1518 parameters.Add(_Database.CreateParameter("ProfileCurve", s.ProfileCurve));
1519 parameters.Add(_Database.CreateParameter("ProfileHollow", s.ProfileHollow));
1520 parameters.Add(_Database.CreateParameter("Texture", s.TextureEntry));
1521 parameters.Add(_Database.CreateParameter("ExtraParams", s.ExtraParams));
1522 parameters.Add(_Database.CreateParameter("State", s.State));
1523
1524 return parameters.ToArray();
1525 }
1526
1527 #endregion
1528
1529 #endregion
1530 } 310 }
1531} 311}
diff --git a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs
index 38be9f4..7b6e7c8 100644
--- a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs
@@ -40,19 +40,21 @@ namespace OpenSim.Data.MSSQL
40 { 40 {
41 private string m_Realm; 41 private string m_Realm;
42 private List<string> m_ColumnNames = null; 42 private List<string> m_ColumnNames = null;
43 private int m_LastExpire = 0;
44 private string m_ConnectionString; 43 private string m_ConnectionString;
44 private MSSQLManager m_database;
45 45
46 public MSSQLUserAccountData(string connectionString, string realm) 46 public MSSQLUserAccountData(string connectionString, string realm)
47 { 47 {
48 m_Realm = realm; 48 m_Realm = realm;
49 m_ConnectionString = connectionString; 49 m_ConnectionString = connectionString;
50 m_database = new MSSQLManager(connectionString);
51
50 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 52 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
51 { 53 {
52 conn.Open(); 54 conn.Open();
53 Migration m = new Migration(conn, GetType().Assembly, "UserStore"); 55 Migration m = new Migration(conn, GetType().Assembly, "UserStore");
54 m.Update(); 56 m.Update();
55 } 57 }
56 } 58 }
57 59
58 public List<UserAccountData> Query(UUID principalID, UUID scopeID, string query) 60 public List<UserAccountData> Query(UUID principalID, UUID scopeID, string query)
@@ -65,16 +67,16 @@ namespace OpenSim.Data.MSSQL
65 UserAccountData ret = new UserAccountData(); 67 UserAccountData ret = new UserAccountData();
66 ret.Data = new Dictionary<string, object>(); 68 ret.Data = new Dictionary<string, object>();
67 69
68 string sql = string.Format("select * from '{0}' where UUID = @principalID", m_Realm); 70 string sql = string.Format("select * from {0} where UUID = @principalID", m_Realm);
69 if (scopeID != UUID.Zero) 71 if (scopeID != UUID.Zero)
70 sql += " and ScopeID = @scopeID"; 72 sql += " and ScopeID = @scopeID";
71 73
72 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 74 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
73 using (SqlCommand cmd = new SqlCommand(sql, conn)) 75 using (SqlCommand cmd = new SqlCommand(sql, conn))
74 { 76 {
75 77 cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID));
76 cmd.Parameters.AddWithValue("@principalID", principalID); 78 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
77 cmd.Parameters.AddWithValue("@scopeID", scopeID); 79
78 conn.Open(); 80 conn.Open();
79 using (SqlDataReader result = cmd.ExecuteReader()) 81 using (SqlDataReader result = cmd.ExecuteReader())
80 { 82 {
@@ -123,17 +125,16 @@ namespace OpenSim.Data.MSSQL
123 using (SqlCommand cmd = new SqlCommand()) 125 using (SqlCommand cmd = new SqlCommand())
124 { 126 {
125 StringBuilder updateBuilder = new StringBuilder(); 127 StringBuilder updateBuilder = new StringBuilder();
126 updateBuilder.AppendFormat("update '{0}' set ", m_Realm); 128 updateBuilder.AppendFormat("update {0} set ", m_Realm);
127 bool first = true; 129 bool first = true;
128 foreach (string field in fields) 130 foreach (string field in fields)
129 { 131 {
130 if (!first) 132 if (!first)
131 updateBuilder.Append(", "); 133 updateBuilder.Append(", ");
132 updateBuilder.AppendFormat("'{0}' = @{0}", field); 134 updateBuilder.AppendFormat("{0} = @{0}", field);
133 135
134 first = false; 136 first = false;
135 137 cmd.Parameters.Add(m_database.CreateParameter("@" + field, data.Data[field]));
136 cmd.Parameters.AddWithValue("@" + field, data.Data[field]);
137 } 138 }
138 139
139 updateBuilder.Append(" where UUID = @principalID"); 140 updateBuilder.Append(" where UUID = @principalID");
@@ -143,16 +144,16 @@ namespace OpenSim.Data.MSSQL
143 144
144 cmd.CommandText = updateBuilder.ToString(); 145 cmd.CommandText = updateBuilder.ToString();
145 cmd.Connection = conn; 146 cmd.Connection = conn;
146 cmd.Parameters.AddWithValue("@principalID", data.PrincipalID); 147 cmd.Parameters.Add(m_database.CreateParameter("@principalID", data.PrincipalID));
147 cmd.Parameters.AddWithValue("@scopeID", data.ScopeID); 148 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", data.ScopeID));
148 conn.Open(); 149 conn.Open();
149 150
150 if (cmd.ExecuteNonQuery() < 1) 151 if (cmd.ExecuteNonQuery() < 1)
151 { 152 {
152 StringBuilder insertBuilder = new StringBuilder(); 153 StringBuilder insertBuilder = new StringBuilder();
153 insertBuilder.AppendFormat("insert into '{0}' ('UUID', 'ScopeID', '", m_Realm); 154 insertBuilder.AppendFormat("insert into {0} (UUID, ScopeID, ", m_Realm);
154 insertBuilder.Append(String.Join("', '", fields)); 155 insertBuilder.Append(String.Join(", ", fields));
155 insertBuilder.Append("') values (@principalID, @scopeID, @"); 156 insertBuilder.Append(") values ( @principalID, @scopeID, @");
156 insertBuilder.Append(String.Join(", @", fields)); 157 insertBuilder.Append(String.Join(", @", fields));
157 insertBuilder.Append(")"); 158 insertBuilder.Append(")");
158 159
@@ -169,12 +170,13 @@ namespace OpenSim.Data.MSSQL
169 170
170 public bool SetDataItem(UUID principalID, string item, string value) 171 public bool SetDataItem(UUID principalID, string item, string value)
171 { 172 {
172 string sql = string.Format("update '{0}' set '{1}' = @{1} where UUID = @UUID", m_Realm, item); 173 string sql = string.Format("update {0} set {1} = @{1} where UUID = @UUID", m_Realm, item);
173 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 174 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
174 using (SqlCommand cmd = new SqlCommand(sql, conn)) 175 using (SqlCommand cmd = new SqlCommand(sql, conn))
175 { 176 {
176 cmd.Parameters.AddWithValue("@" + item, value); 177 cmd.Parameters.Add(m_database.CreateParameter("@" + item, value));
177 cmd.Parameters.AddWithValue("@UUID", principalID); 178 cmd.Parameters.Add(m_database.CreateParameter("@UUID", principalID));
179
178 conn.Open(); 180 conn.Open();
179 181
180 if (cmd.ExecuteNonQuery() > 0) 182 if (cmd.ExecuteNonQuery() > 0)
diff --git a/OpenSim/Data/MSSQL/Resources/006_GridStore.sql b/OpenSim/Data/MSSQL/Resources/006_GridStore.sql
new file mode 100644
index 0000000..42010ce
--- /dev/null
+++ b/OpenSim/Data/MSSQL/Resources/006_GridStore.sql
@@ -0,0 +1,8 @@
1BEGIN TRANSACTION
2
3ALTER TABLE regions ADD scopeid uniqueidentifier default '00000000-0000-0000-0000-000000000000';
4ALTER TABLE regions ADD DEFAULT ('00000000-0000-0000-0000-000000000000') FOR [owner_uuid];
5ALTER TABLE regions ADD sizeX integer not null default 0;
6ALTER TABLE regions ADD sizeY integer not null default 0;
7
8COMMIT
diff --git a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs
index e96a123..a41f9f8 100644
--- a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs
+++ b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs
@@ -82,12 +82,16 @@ namespace OpenSim.Data.MySQL
82 ret.Data[s] = result[s].ToString(); 82 ret.Data[s] = result[s].ToString();
83 } 83 }
84 84
85 CloseDBConnection(cmd);
85 return ret; 86 return ret;
86 } 87 }
88 else
89 {
90 CloseDBConnection(cmd);
91 return null;
92 }
87 } 93 }
88 } 94 }
89
90 return null;
91 } 95 }
92 96
93 public bool Store(AuthenticationData data) 97 public bool Store(AuthenticationData data)
diff --git a/OpenSim/Data/MySQL/MySQLFramework.cs b/OpenSim/Data/MySQL/MySQLFramework.cs
index c756c9c..f37e9bc 100644
--- a/OpenSim/Data/MySQL/MySQLFramework.cs
+++ b/OpenSim/Data/MySQL/MySQLFramework.cs
@@ -47,7 +47,6 @@ namespace OpenSim.Data.MySQL
47 protected MySqlFramework(string connectionString) 47 protected MySqlFramework(string connectionString)
48 { 48 {
49 m_Connection = new MySqlConnection(connectionString); 49 m_Connection = new MySqlConnection(connectionString);
50
51 m_Connection.Open(); 50 m_Connection.Open();
52 } 51 }
53 52
@@ -82,8 +81,7 @@ namespace OpenSim.Data.MySQL
82 errorSeen = true; 81 errorSeen = true;
83 82
84 m_Connection.Close(); 83 m_Connection.Close();
85 MySqlConnection newConnection = (MySqlConnection) 84 MySqlConnection newConnection = (MySqlConnection)((ICloneable)m_Connection).Clone();
86 ((ICloneable)m_Connection).Clone();
87 m_Connection.Dispose(); 85 m_Connection.Dispose();
88 m_Connection = newConnection; 86 m_Connection = newConnection;
89 m_Connection.Open(); 87 m_Connection.Open();
@@ -104,14 +102,16 @@ namespace OpenSim.Data.MySQL
104 102
105 protected IDataReader ExecuteReader(MySqlCommand cmd) 103 protected IDataReader ExecuteReader(MySqlCommand cmd)
106 { 104 {
107 MySqlConnection newConnection = (MySqlConnection) 105 MySqlConnection newConnection = (MySqlConnection)((ICloneable)m_Connection).Clone();
108 ((ICloneable)m_Connection).Clone();
109
110 newConnection.Open(); 106 newConnection.Open();
111 107
112 cmd.Connection = newConnection; 108 cmd.Connection = newConnection;
113
114 return cmd.ExecuteReader(); 109 return cmd.ExecuteReader();
115 } 110 }
111
112 protected void CloseDBConnection(MySqlCommand cmd)
113 {
114 cmd.Connection.Dispose();
115 }
116 } 116 }
117} 117}
diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs
index 04b24b6..3fe27d5 100644
--- a/OpenSim/Data/MySQL/MySQLRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLRegionData.cs
@@ -172,6 +172,8 @@ namespace OpenSim.Data.MySQL
172 172
173 retList.Add(ret); 173 retList.Add(ret);
174 } 174 }
175
176 CloseDBConnection(cmd);
175 } 177 }
176 178
177 return retList; 179 return retList;
diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs
index c713a11..38a6f55 100644
--- a/OpenSim/Data/MySQL/MySQLUserAccountData.cs
+++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs
@@ -97,12 +97,16 @@ namespace OpenSim.Data.MySQL
97 ret.Data[s] = result[s].ToString(); 97 ret.Data[s] = result[s].ToString();
98 } 98 }
99 99
100 CloseDBConnection(cmd);
100 return ret; 101 return ret;
101 } 102 }
103 else
104 {
105 CloseDBConnection(cmd);
106 return null;
107 }
102 } 108 }
103 } 109 }
104
105 return null;
106 } 110 }
107 111
108 public bool Store(UserAccountData data) 112 public bool Store(UserAccountData data)
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index 632b551..56155dd 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -238,7 +238,7 @@ namespace OpenSim.Framework.Servers
238 List<Thread> threads = ThreadTracker.GetThreads(); 238 List<Thread> threads = ThreadTracker.GetThreads();
239 if (threads == null) 239 if (threads == null)
240 { 240 {
241 sb.Append("Thread tracking is only enabled in DEBUG mode."); 241 sb.Append("OpenSim thread tracking is only enabled in DEBUG mode.");
242 } 242 }
243 else 243 else
244 { 244 {
@@ -264,6 +264,12 @@ namespace OpenSim.Framework.Servers
264 } 264 }
265 } 265 }
266 } 266 }
267 int workers = 0, ports = 0, maxWorkers = 0, maxPorts = 0;
268 ThreadPool.GetAvailableThreads(out workers, out ports);
269 ThreadPool.GetMaxThreads(out maxWorkers, out maxPorts);
270
271 sb.Append(Environment.NewLine + "*** ThreadPool threads ***" + Environment.NewLine);
272 sb.Append("workers: " + (maxWorkers - workers) + " (" + maxWorkers + "); ports: " + (maxPorts - ports) + " (" + maxPorts + ")" + Environment.NewLine);
267 273
268 return sb.ToString(); 274 return sb.ToString();
269 } 275 }
diff --git a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs
index 8a490f7..4543fd5 100644
--- a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs
+++ b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs
@@ -28,14 +28,21 @@
28using System; 28using System;
29using System.IO; 29using System.IO;
30using System.Net; 30using System.Net;
31using System.Reflection;
31using System.Text; 32using System.Text;
32using System.Xml; 33using System.Xml;
33using System.Xml.Serialization; 34using System.Xml.Serialization;
34 35
36using log4net;
37
35namespace OpenSim.Framework.Servers.HttpServer 38namespace OpenSim.Framework.Servers.HttpServer
36{ 39{
37 public class SynchronousRestFormsRequester 40 public class SynchronousRestFormsRequester
38 { 41 {
42 private static readonly ILog m_log =
43 LogManager.GetLogger(
44 MethodBase.GetCurrentMethod().DeclaringType);
45
39 /// <summary> 46 /// <summary>
40 /// Perform a synchronous REST request. 47 /// Perform a synchronous REST request.
41 /// </summary> 48 /// </summary>
@@ -72,8 +79,9 @@ namespace OpenSim.Framework.Servers.HttpServer
72 requestStream = request.GetRequestStream(); 79 requestStream = request.GetRequestStream();
73 requestStream.Write(buffer.ToArray(), 0, length); 80 requestStream.Write(buffer.ToArray(), 0, length);
74 } 81 }
75 catch 82 catch (Exception e)
76 { 83 {
84 m_log.DebugFormat("[FORMS]: exception occured on sending request {0}", e.Message);
77 } 85 }
78 finally 86 finally
79 { 87 {
@@ -102,7 +110,10 @@ namespace OpenSim.Framework.Servers.HttpServer
102 respstring = reader.ReadToEnd(); 110 respstring = reader.ReadToEnd();
103 } 111 }
104 } 112 }
105 catch { } 113 catch (Exception e)
114 {
115 m_log.DebugFormat("[FORMS]: exception occured on receiving reply {0}", e.Message);
116 }
106 finally 117 finally
107 { 118 {
108 if (respStream != null) 119 if (respStream != null)
@@ -114,6 +125,7 @@ namespace OpenSim.Framework.Servers.HttpServer
114 catch (System.InvalidOperationException) 125 catch (System.InvalidOperationException)
115 { 126 {
116 // This is what happens when there is invalid XML 127 // This is what happens when there is invalid XML
128 m_log.DebugFormat("[FORMS]: InvalidOperationException on receiving request");
117 } 129 }
118 return respstring; 130 return respstring;
119 } 131 }
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs
index 5219df7..343f537 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs
@@ -88,7 +88,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
88 J2KImage imgrequest; 88 J2KImage imgrequest;
89 89
90 // Do a linear search for this texture download 90 // Do a linear search for this texture download
91 lock (m_priorityQueue) 91 lock (m_syncRoot)
92 m_priorityQueue.Find(delegate(J2KImage img) { return img.TextureID == newRequest.RequestedAssetID; }, out imgrequest); 92 m_priorityQueue.Find(delegate(J2KImage img) { return img.TextureID == newRequest.RequestedAssetID; }, out imgrequest);
93 93
94 if (imgrequest != null) 94 if (imgrequest != null)
@@ -99,7 +99,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
99 99
100 try 100 try
101 { 101 {
102 lock (m_priorityQueue) 102 lock (m_syncRoot)
103 m_priorityQueue.Delete(imgrequest.PriorityQueueHandle); 103 m_priorityQueue.Delete(imgrequest.PriorityQueueHandle);
104 } 104 }
105 catch (Exception) { } 105 catch (Exception) { }
@@ -167,8 +167,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
167 J2KImage imagereq; 167 J2KImage imagereq;
168 int numCollected = 0; 168 int numCollected = 0;
169 169
170 lock (m_syncRoot) 170 //lock (m_syncRoot)
171 { 171 //{
172 m_lastloopprocessed = DateTime.Now.Ticks; 172 m_lastloopprocessed = DateTime.Now.Ticks;
173 173
174 // This can happen during Close() 174 // This can happen during Close()
@@ -191,7 +191,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
191 if (numCollected == count) 191 if (numCollected == count)
192 break; 192 break;
193 } 193 }
194 } 194 //}
195 195
196 return m_priorityQueue.Count > 0; 196 return m_priorityQueue.Count > 0;
197 } 197 }
@@ -211,16 +211,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
211 { 211 {
212 J2KImage image = null; 212 J2KImage image = null;
213 213
214 if (m_priorityQueue.Count > 0) 214 lock (m_syncRoot)
215 { 215 {
216 try 216
217 if (m_priorityQueue.Count > 0)
217 { 218 {
218 lock (m_priorityQueue) 219 try
220 {
219 image = m_priorityQueue.FindMax(); 221 image = m_priorityQueue.FindMax();
222 }
223 catch (Exception) { }
220 } 224 }
221 catch (Exception) { }
222 } 225 }
223
224 return image; 226 return image;
225 } 227 }
226 228
@@ -228,23 +230,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
228 { 230 {
229 image.PriorityQueueHandle = null; 231 image.PriorityQueueHandle = null;
230 232
231 lock (m_priorityQueue) 233 lock (m_syncRoot)
232 m_priorityQueue.Add(ref image.PriorityQueueHandle, image); 234 try
235 {
236 m_priorityQueue.Add(ref image.PriorityQueueHandle, image);
237 }
238 catch (Exception) { }
233 } 239 }
234 240
235 void RemoveImageFromQueue(J2KImage image) 241 void RemoveImageFromQueue(J2KImage image)
236 { 242 {
237 try 243 lock (m_syncRoot)
238 { 244 try
239 lock (m_priorityQueue) 245 {
240 m_priorityQueue.Delete(image.PriorityQueueHandle); 246 m_priorityQueue.Delete(image.PriorityQueueHandle);
241 } 247 }
242 catch (Exception) { } 248 catch (Exception) { }
243 } 249 }
244 250
245 void UpdateImageInQueue(J2KImage image) 251 void UpdateImageInQueue(J2KImage image)
246 { 252 {
247 lock (m_priorityQueue) 253 lock (m_syncRoot)
248 { 254 {
249 try { m_priorityQueue.Replace(image.PriorityQueueHandle, image); } 255 try { m_priorityQueue.Replace(image.PriorityQueueHandle, image); }
250 catch (Exception) 256 catch (Exception)
diff --git a/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs b/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs
index 5a5ad7e..66ca7c2 100644
--- a/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs
+++ b/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs
@@ -178,7 +178,7 @@ namespace OpenSim.Region.CoreModules.Asset
178 { 178 {
179 if (maximalSize <= 0 || maximalCount <= 0) 179 if (maximalSize <= 0 || maximalCount <= 0)
180 { 180 {
181 Log.Info("[ASSET CACHE]: Cenome asset cache is not enabled."); 181 //Log.Debug("[ASSET CACHE]: Cenome asset cache is not enabled.");
182 m_enabled = false; 182 m_enabled = false;
183 return; 183 return;
184 } 184 }
@@ -194,7 +194,7 @@ namespace OpenSim.Region.CoreModules.Asset
194 CnmSynchronizedCache<string, AssetBase>.Synchronized(new CnmMemoryCache<string, AssetBase>( 194 CnmSynchronizedCache<string, AssetBase>.Synchronized(new CnmMemoryCache<string, AssetBase>(
195 maximalSize, maximalCount, expirationTime)); 195 maximalSize, maximalCount, expirationTime));
196 m_enabled = true; 196 m_enabled = true;
197 Log.InfoFormat( 197 Log.DebugFormat(
198 "[ASSET CACHE]: Cenome asset cache enabled (MaxSize = {0} bytes, MaxCount = {1}, ExpirationTime = {2})", 198 "[ASSET CACHE]: Cenome asset cache enabled (MaxSize = {0} bytes, MaxCount = {1}, ExpirationTime = {2})",
199 maximalSize, 199 maximalSize,
200 maximalCount, 200 maximalCount,
@@ -263,7 +263,7 @@ namespace OpenSim.Region.CoreModules.Asset
263 263
264 if (m_getCount == m_debugEpoch) 264 if (m_getCount == m_debugEpoch)
265 { 265 {
266 Log.InfoFormat( 266 Log.DebugFormat(
267 "[ASSET CACHE]: Cached = {0}, Get = {1}, Hits = {2}%, Size = {3} bytes, Avg. A. Size = {4} bytes", 267 "[ASSET CACHE]: Cached = {0}, Get = {1}, Hits = {2}%, Size = {3} bytes, Avg. A. Size = {4} bytes",
268 m_cachedCount, 268 m_cachedCount,
269 m_getCount, 269 m_getCount,
@@ -333,7 +333,7 @@ namespace OpenSim.Region.CoreModules.Asset
333 return; 333 return;
334 334
335 string name = moduleConfig.GetString("AssetCaching"); 335 string name = moduleConfig.GetString("AssetCaching");
336 Log.DebugFormat("[XXX] name = {0} (this module's name: {1}", name, Name); 336 //Log.DebugFormat("[XXX] name = {0} (this module's name: {1}", name, Name);
337 337
338 if (name != Name) 338 if (name != Name)
339 return; 339 return;
@@ -343,14 +343,14 @@ namespace OpenSim.Region.CoreModules.Asset
343 int maxCount = DefaultMaxCount; 343 int maxCount = DefaultMaxCount;
344 TimeSpan expirationTime = DefaultExpirationTime; 344 TimeSpan expirationTime = DefaultExpirationTime;
345 345
346 IConfig assetConfig = source.Configs[ "AssetCache" ]; 346 IConfig assetConfig = source.Configs["AssetCache"];
347 if (assetConfig != null) 347 if (assetConfig != null)
348 { 348 {
349 // Get optional configurations 349 // Get optional configurations
350 maxSize = assetConfig.GetLong("MaxSize", DefaultMaxSize); 350 maxSize = assetConfig.GetLong("MaxSize", DefaultMaxSize);
351 maxCount = assetConfig.GetInt("MaxCount", DefaultMaxCount); 351 maxCount = assetConfig.GetInt("MaxCount", DefaultMaxCount);
352 expirationTime = 352 expirationTime =
353 TimeSpan.FromMinutes(assetConfig.GetInt("ExpirationTime", (int) DefaultExpirationTime.TotalMinutes)); 353 TimeSpan.FromMinutes(assetConfig.GetInt("ExpirationTime", (int)DefaultExpirationTime.TotalMinutes));
354 354
355 // Debugging purposes only 355 // Debugging purposes only
356 m_debugEpoch = assetConfig.GetInt("DebugEpoch", 0); 356 m_debugEpoch = assetConfig.GetInt("DebugEpoch", 0);
diff --git a/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs b/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs
index 2de40d2..0a7e736 100644
--- a/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs
+++ b/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs
@@ -66,7 +66,7 @@ namespace OpenSim.Region.CoreModules.Asset
66 if (moduleConfig != null) 66 if (moduleConfig != null)
67 { 67 {
68 string name = moduleConfig.GetString("AssetCaching"); 68 string name = moduleConfig.GetString("AssetCaching");
69 m_log.DebugFormat("[XXX] name = {0} (this module's name: {1}", name, Name); 69 //m_log.DebugFormat("[XXX] name = {0} (this module's name: {1}", name, Name);
70 70
71 if (name == Name) 71 if (name == Name)
72 { 72 {
diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
index c0bb70c..b81ab41 100644
--- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
+++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
@@ -636,11 +636,8 @@ namespace Flotsam.RegionModules.AssetCache
636 m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache clearfile - Remove all assets cached on disk"); 636 m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache clearfile - Remove all assets cached on disk");
637 637
638 } 638 }
639
640
641 } 639 }
642 640
643 #endregion 641 #endregion
644
645 } 642 }
646} 643} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Asset/GlynnTuckerAssetCache.cs b/OpenSim/Region/CoreModules/Asset/GlynnTuckerAssetCache.cs
index 8d8e0fe..4869f5d 100644
--- a/OpenSim/Region/CoreModules/Asset/GlynnTuckerAssetCache.cs
+++ b/OpenSim/Region/CoreModules/Asset/GlynnTuckerAssetCache.cs
@@ -68,7 +68,7 @@ namespace OpenSim.Region.CoreModules.Asset
68 if (moduleConfig != null) 68 if (moduleConfig != null)
69 { 69 {
70 string name = moduleConfig.GetString("AssetCaching"); 70 string name = moduleConfig.GetString("AssetCaching");
71 m_log.DebugFormat("[ASSET CACHE] name = {0} (this module's name: {1}). Sync? ", name, Name, m_Cache.IsSynchronized); 71 //m_log.DebugFormat("[ASSET CACHE] name = {0} (this module's name: {1}). Sync? ", name, Name, m_Cache.IsSynchronized);
72 72
73 if (name == Name) 73 if (name == Name)
74 { 74 {
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
index 3ca4882..1c72488 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
@@ -206,6 +206,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
206 206
207 public GridRegion GetRegionByPosition(UUID scopeID, int x, int y) 207 public GridRegion GetRegionByPosition(UUID scopeID, int x, int y)
208 { 208 {
209 GridRegion region = null;
210
211 // First see if it's a neighbour, even if it isn't on this sim.
212 // Neighbour data is cached in memory, so this is fast
213 foreach (RegionCache rcache in m_LocalCache.Values)
214 {
215 region = rcache.GetRegionByPosition(x, y);
216 if (region != null)
217 {
218 return region;
219 }
220 }
221
222 // Then try on this sim (may be a lookup in DB if this is using MySql).
209 return m_GridService.GetRegionByPosition(scopeID, x, y); 223 return m_GridService.GetRegionByPosition(scopeID, x, y);
210 } 224 }
211 225
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs
index 2b336bb..44e850b 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionCache.cs
@@ -29,10 +29,12 @@ using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Reflection; 30using System.Reflection;
31 31
32using OpenSim.Framework;
32using OpenSim.Region.Framework.Scenes; 33using OpenSim.Region.Framework.Scenes;
33using OpenSim.Services.Interfaces; 34using OpenSim.Services.Interfaces;
34using GridRegion = OpenSim.Services.Interfaces.GridRegion; 35using GridRegion = OpenSim.Services.Interfaces.GridRegion;
35 36
37using OpenMetaverse;
36using log4net; 38using log4net;
37 39
38namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid 40namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
@@ -75,5 +77,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
75 { 77 {
76 return new List<GridRegion>(m_neighbours.Values); 78 return new List<GridRegion>(m_neighbours.Values);
77 } 79 }
80
81 public GridRegion GetRegionByPosition(int x, int y)
82 {
83 uint xsnap = (uint)(x / Constants.RegionSize) * Constants.RegionSize;
84 uint ysnap = (uint)(y / Constants.RegionSize) * Constants.RegionSize;
85 ulong handle = Utils.UIntsToLong(xsnap, ysnap);
86
87 if (m_neighbours.ContainsKey(handle))
88 return m_neighbours[handle];
89
90 return null;
91 }
78 } 92 }
79} 93}
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
index 9622555..901144a 100644
--- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
@@ -397,10 +397,15 @@ namespace OpenSim.Region.CoreModules.World.Permissions
397 // with the powers requested (powers = 0 for no powers check) 397 // with the powers requested (powers = 0 for no powers check)
398 protected bool IsGroupMember(UUID groupID, UUID userID, ulong powers) 398 protected bool IsGroupMember(UUID groupID, UUID userID, ulong powers)
399 { 399 {
400 IClientAPI client = m_scene.GetScenePresence(userID).ControllingClient; 400 ScenePresence sp = m_scene.GetScenePresence(userID);
401 401 if (sp != null)
402 return ((groupID == client.ActiveGroupId) && (client.ActiveGroupPowers != 0) && 402 {
403 ((powers == 0) || ((client.ActiveGroupPowers & powers) == powers))); 403 IClientAPI client = sp.ControllingClient;
404
405 return ((groupID == client.ActiveGroupId) && (client.ActiveGroupPowers != 0) &&
406 ((powers == 0) || ((client.ActiveGroupPowers & powers) == powers)));
407 }
408 return false;
404 } 409 }
405 410
406 /// <summary> 411 /// <summary>
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
index 631d801..00fe5df 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
@@ -425,7 +425,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
425 425
426 foreach (GroupMembersData member in m_groupsModule.GroupMembersRequest(null, groupID)) 426 foreach (GroupMembersData member in m_groupsModule.GroupMembersRequest(null, groupID))
427 { 427 {
428 if (m_agentsDroppedSession[im.imSessionID].Contains(member.AgentID.Guid)) 428 if (!m_agentsDroppedSession.ContainsKey(im.imSessionID) || m_agentsDroppedSession[im.imSessionID].Contains(member.AgentID.Guid))
429 { 429 {
430 // Don't deliver messages to people who have dropped this session 430 // Don't deliver messages to people who have dropped this session
431 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} has dropped session, not delivering to them", member.AgentID); 431 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} has dropped session, not delivering to them", member.AgentID);
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index 2e89a24..b209199 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -148,9 +148,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
148 UUID[] CurrentKeys = new UUID[m_clientRequestIDInfo.Count]; 148 UUID[] CurrentKeys = new UUID[m_clientRequestIDInfo.Count];
149 foreach (UUID key in CurrentKeys) 149 foreach (UUID key in CurrentKeys)
150 { 150 {
151 if (DateTime.Now - m_clientRequestIDInfo[key].LastUsedTMStamp > cacheTimeout) 151 if (m_clientRequestIDInfo.ContainsKey(key))
152 { 152 {
153 m_clientRequestIDInfo.Remove(key); 153 if (DateTime.Now - m_clientRequestIDInfo[key].LastUsedTMStamp > cacheTimeout)
154 {
155 m_clientRequestIDInfo.Remove(key);
156 }
154 } 157 }
155 } 158 }
156 } 159 }
@@ -476,7 +479,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
476 479
477 foreach (string key in binBucketOSD.Keys) 480 foreach (string key in binBucketOSD.Keys)
478 { 481 {
479 m_log.WarnFormat("{0}: {1}", key, binBucketOSD[key].ToString()); 482 if (binBucketOSD.ContainsKey(key))
483 {
484 m_log.WarnFormat("{0}: {1}", key, binBucketOSD[key].ToString());
485 }
480 } 486 }
481 } 487 }
482 488
diff --git a/OpenSim/Region/Physics/Manager/IMesher.cs b/OpenSim/Region/Physics/Manager/IMesher.cs
index e26c623..ac14292 100644
--- a/OpenSim/Region/Physics/Manager/IMesher.cs
+++ b/OpenSim/Region/Physics/Manager/IMesher.cs
@@ -47,6 +47,8 @@ namespace OpenSim.Region.Physics.Manager
47 int[] getIndexListAsInt(); 47 int[] getIndexListAsInt();
48 int[] getIndexListAsIntLocked(); 48 int[] getIndexListAsIntLocked();
49 float[] getVertexListAsFloatLocked(); 49 float[] getVertexListAsFloatLocked();
50 void getIndexListAsPtrToIntArray(out IntPtr indices, out int triStride, out int indexCount);
51 void getVertexListAsPtrToFloatArray( out IntPtr vertexList, out int vertexStride, out int vertexCount );
50 void releaseSourceMeshData(); 52 void releaseSourceMeshData();
51 void releasePinned(); 53 void releasePinned();
52 void Append(IMesh newMesh); 54 void Append(IMesh newMesh);
diff --git a/OpenSim/Region/Physics/Meshing/Mesh.cs b/OpenSim/Region/Physics/Meshing/Mesh.cs
index aae8871..ff1f816 100644
--- a/OpenSim/Region/Physics/Meshing/Mesh.cs
+++ b/OpenSim/Region/Physics/Meshing/Mesh.cs
@@ -36,23 +36,27 @@ namespace OpenSim.Region.Physics.Meshing
36{ 36{
37 public class Mesh : IMesh 37 public class Mesh : IMesh
38 { 38 {
39 private Dictionary<Vertex, int> vertices; 39 private Dictionary<Vertex, int> m_vertices;
40 private List<Triangle> triangles; 40 private List<Triangle> m_triangles;
41 GCHandle pinnedVirtexes; 41 GCHandle m_pinnedVertexes;
42 GCHandle pinnedIndex; 42 GCHandle m_pinnedIndex;
43 public float[] normals; 43 IntPtr m_verticesPtr = IntPtr.Zero;
44 int m_vertexCount = 0;
45 IntPtr m_indicesPtr = IntPtr.Zero;
46 int m_indexCount = 0;
47 public float[] m_normals;
44 48
45 public Mesh() 49 public Mesh()
46 { 50 {
47 vertices = new Dictionary<Vertex, int>(); 51 m_vertices = new Dictionary<Vertex, int>();
48 triangles = new List<Triangle>(); 52 m_triangles = new List<Triangle>();
49 } 53 }
50 54
51 public Mesh Clone() 55 public Mesh Clone()
52 { 56 {
53 Mesh result = new Mesh(); 57 Mesh result = new Mesh();
54 58
55 foreach (Triangle t in triangles) 59 foreach (Triangle t in m_triangles)
56 { 60 {
57 result.Add(new Triangle(t.v1.Clone(), t.v2.Clone(), t.v3.Clone())); 61 result.Add(new Triangle(t.v1.Clone(), t.v2.Clone(), t.v3.Clone()));
58 } 62 }
@@ -62,27 +66,27 @@ namespace OpenSim.Region.Physics.Meshing
62 66
63 public void Add(Triangle triangle) 67 public void Add(Triangle triangle)
64 { 68 {
65 if (pinnedIndex.IsAllocated || pinnedVirtexes.IsAllocated) 69 if (m_pinnedIndex.IsAllocated || m_pinnedVertexes.IsAllocated || m_indicesPtr != IntPtr.Zero || m_verticesPtr != IntPtr.Zero)
66 throw new NotSupportedException("Attempt to Add to a pinned Mesh"); 70 throw new NotSupportedException("Attempt to Add to a pinned Mesh");
67 // If a vertex of the triangle is not yet in the vertices list, 71 // If a vertex of the triangle is not yet in the vertices list,
68 // add it and set its index to the current index count 72 // add it and set its index to the current index count
69 if (!vertices.ContainsKey(triangle.v1)) 73 if( !m_vertices.ContainsKey(triangle.v1) )
70 vertices[triangle.v1] = vertices.Count; 74 m_vertices[triangle.v1] = m_vertices.Count;
71 if (!vertices.ContainsKey(triangle.v2)) 75 if (!m_vertices.ContainsKey(triangle.v2))
72 vertices[triangle.v2] = vertices.Count; 76 m_vertices[triangle.v2] = m_vertices.Count;
73 if (!vertices.ContainsKey(triangle.v3)) 77 if (!m_vertices.ContainsKey(triangle.v3))
74 vertices[triangle.v3] = vertices.Count; 78 m_vertices[triangle.v3] = m_vertices.Count;
75 triangles.Add(triangle); 79 m_triangles.Add(triangle);
76 } 80 }
77 81
78 public void CalcNormals() 82 public void CalcNormals()
79 { 83 {
80 int iTriangles = triangles.Count; 84 int iTriangles = m_triangles.Count;
81 85
82 this.normals = new float[iTriangles * 3]; 86 this.m_normals = new float[iTriangles * 3];
83 87
84 int i = 0; 88 int i = 0;
85 foreach (Triangle t in triangles) 89 foreach (Triangle t in m_triangles)
86 { 90 {
87 float ux, uy, uz; 91 float ux, uy, uz;
88 float vx, vy, vz; 92 float vx, vy, vz;
@@ -129,9 +133,9 @@ namespace OpenSim.Region.Physics.Meshing
129 //ny /= l; 133 //ny /= l;
130 //nz /= l; 134 //nz /= l;
131 135
132 normals[i] = nx * lReciprocal; 136 m_normals[i] = nx * lReciprocal;
133 normals[i + 1] = ny * lReciprocal; 137 m_normals[i + 1] = ny * lReciprocal;
134 normals[i + 2] = nz * lReciprocal; 138 m_normals[i + 2] = nz * lReciprocal;
135 139
136 i += 3; 140 i += 3;
137 } 141 }
@@ -140,45 +144,70 @@ namespace OpenSim.Region.Physics.Meshing
140 public List<PhysicsVector> getVertexList() 144 public List<PhysicsVector> getVertexList()
141 { 145 {
142 List<PhysicsVector> result = new List<PhysicsVector>(); 146 List<PhysicsVector> result = new List<PhysicsVector>();
143 foreach (Vertex v in vertices.Keys) 147 foreach (Vertex v in m_vertices.Keys)
144 { 148 {
145 result.Add(v); 149 result.Add(v);
146 } 150 }
147 return result; 151 return result;
148 } 152 }
149 153
150 public float[] getVertexListAsFloatLocked() 154 private float[] getVertexListAsFloat()
151 { 155 {
152 if (pinnedVirtexes.IsAllocated) 156 if(m_vertices == null)
153 return (float[])(pinnedVirtexes.Target); 157 throw new NotSupportedException();
154 float[] result; 158 float[] result = new float[m_vertices.Count * 3];
155 159 foreach (KeyValuePair<Vertex, int> kvp in m_vertices)
156 //m_log.WarnFormat("vertices.Count = {0}", vertices.Count);
157 result = new float[vertices.Count * 3];
158 foreach (KeyValuePair<Vertex, int> kvp in vertices)
159 { 160 {
160 Vertex v = kvp.Key; 161 Vertex v = kvp.Key;
161 int i = kvp.Value; 162 int i = kvp.Value;
162 //m_log.WarnFormat("kvp.Value = {0}", i);
163 result[3 * i + 0] = v.X; 163 result[3 * i + 0] = v.X;
164 result[3 * i + 1] = v.Y; 164 result[3 * i + 1] = v.Y;
165 result[3 * i + 2] = v.Z; 165 result[3 * i + 2] = v.Z;
166 } 166 }
167 pinnedVirtexes = GCHandle.Alloc(result, GCHandleType.Pinned);
168 return result; 167 return result;
169 } 168 }
170 169
171 public int[] getIndexListAsInt() 170 public float[] getVertexListAsFloatLocked()
172 { 171 {
173 int[] result; 172 if( m_pinnedVertexes.IsAllocated )
173 return (float[])(m_pinnedVertexes.Target);
174 174
175 result = new int[triangles.Count * 3]; 175 float[] result = getVertexListAsFloat();
176 for (int i = 0; i < triangles.Count; i++) 176 m_pinnedVertexes = GCHandle.Alloc(result, GCHandleType.Pinned);
177
178 return result;
179 }
180
181 public void getVertexListAsPtrToFloatArray(out IntPtr vertices, out int vertexStride, out int vertexCount)
182 {
183 // A vertex is 3 floats
184 vertexStride = 3 * sizeof(float);
185
186 // If there isn't an unmanaged array allocated yet, do it now
187 if (m_verticesPtr == IntPtr.Zero)
177 { 188 {
178 Triangle t = triangles[i]; 189 float[] vertexList = getVertexListAsFloat();
179 result[3 * i + 0] = vertices[t.v1]; 190 // Each vertex is 3 elements (floats)
180 result[3 * i + 1] = vertices[t.v2]; 191 m_vertexCount = vertexList.Length / 3;
181 result[3 * i + 2] = vertices[t.v3]; 192 int byteCount = m_vertexCount * vertexStride;
193 m_verticesPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(byteCount);
194 System.Runtime.InteropServices.Marshal.Copy(vertexList, 0, m_verticesPtr, m_vertexCount * 3);
195 }
196 vertices = m_verticesPtr;
197 vertexCount = m_vertexCount;
198 }
199
200 public int[] getIndexListAsInt()
201 {
202 if (m_triangles == null)
203 throw new NotSupportedException();
204 int[] result = new int[m_triangles.Count * 3];
205 for (int i = 0; i < m_triangles.Count; i++)
206 {
207 Triangle t = m_triangles[i];
208 result[3 * i + 0] = m_vertices[t.v1];
209 result[3 * i + 1] = m_vertices[t.v2];
210 result[3 * i + 2] = m_vertices[t.v3];
182 } 211 }
183 return result; 212 return result;
184 } 213 }
@@ -189,19 +218,48 @@ namespace OpenSim.Region.Physics.Meshing
189 /// <returns></returns> 218 /// <returns></returns>
190 public int[] getIndexListAsIntLocked() 219 public int[] getIndexListAsIntLocked()
191 { 220 {
192 if (pinnedIndex.IsAllocated) 221 if (m_pinnedIndex.IsAllocated)
193 return (int[])(pinnedIndex.Target); 222 return (int[])(m_pinnedIndex.Target);
194 223
195 int[] result = getIndexListAsInt(); 224 int[] result = getIndexListAsInt();
196 pinnedIndex = GCHandle.Alloc(result, GCHandleType.Pinned); 225 m_pinnedIndex = GCHandle.Alloc(result, GCHandleType.Pinned);
197 226
198 return result; 227 return result;
199 } 228 }
200 229
230 public void getIndexListAsPtrToIntArray(out IntPtr indices, out int triStride, out int indexCount)
231 {
232 // If there isn't an unmanaged array allocated yet, do it now
233 if (m_indicesPtr == IntPtr.Zero)
234 {
235 int[] indexList = getIndexListAsInt();
236 m_indexCount = indexList.Length;
237 int byteCount = m_indexCount * sizeof(int);
238 m_indicesPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(byteCount);
239 System.Runtime.InteropServices.Marshal.Copy(indexList, 0, m_indicesPtr, m_indexCount);
240 }
241 // A triangle is 3 ints (indices)
242 triStride = 3 * sizeof(int);
243 indices = m_indicesPtr;
244 indexCount = m_indexCount;
245 }
246
201 public void releasePinned() 247 public void releasePinned()
202 { 248 {
203 pinnedVirtexes.Free(); 249 if (m_pinnedVertexes.IsAllocated)
204 pinnedIndex.Free(); 250 m_pinnedVertexes.Free();
251 if (m_pinnedIndex.IsAllocated)
252 m_pinnedIndex.Free();
253 if (m_verticesPtr != IntPtr.Zero)
254 {
255 System.Runtime.InteropServices.Marshal.FreeHGlobal(m_verticesPtr);
256 m_verticesPtr = IntPtr.Zero;
257 }
258 if (m_indicesPtr != IntPtr.Zero)
259 {
260 System.Runtime.InteropServices.Marshal.FreeHGlobal(m_indicesPtr);
261 m_indicesPtr = IntPtr.Zero;
262 }
205 } 263 }
206 264
207 /// <summary> 265 /// <summary>
@@ -209,29 +267,29 @@ namespace OpenSim.Region.Physics.Meshing
209 /// </summary> 267 /// </summary>
210 public void releaseSourceMeshData() 268 public void releaseSourceMeshData()
211 { 269 {
212 triangles = null; 270 m_triangles = null;
213 vertices = null; 271 m_vertices = null;
214 } 272 }
215 273
216 public void Append(IMesh newMesh) 274 public void Append(IMesh newMesh)
217 { 275 {
218 if (pinnedIndex.IsAllocated || pinnedVirtexes.IsAllocated) 276 if (m_pinnedIndex.IsAllocated || m_pinnedVertexes.IsAllocated || m_indicesPtr != IntPtr.Zero || m_verticesPtr != IntPtr.Zero)
219 throw new NotSupportedException("Attempt to Append to a pinned Mesh"); 277 throw new NotSupportedException("Attempt to Append to a pinned Mesh");
220 278
221 if (!(newMesh is Mesh)) 279 if (!(newMesh is Mesh))
222 return; 280 return;
223 281
224 foreach (Triangle t in ((Mesh)newMesh).triangles) 282 foreach (Triangle t in ((Mesh)newMesh).m_triangles)
225 Add(t); 283 Add(t);
226 } 284 }
227 285
228 // Do a linear transformation of mesh. 286 // Do a linear transformation of mesh.
229 public void TransformLinear(float[,] matrix, float[] offset) 287 public void TransformLinear(float[,] matrix, float[] offset)
230 { 288 {
231 if (pinnedIndex.IsAllocated || pinnedVirtexes.IsAllocated) 289 if (m_pinnedIndex.IsAllocated || m_pinnedVertexes.IsAllocated || m_indicesPtr != IntPtr.Zero || m_verticesPtr != IntPtr.Zero)
232 throw new NotSupportedException("Attempt to TransformLinear a pinned Mesh"); 290 throw new NotSupportedException("Attempt to TransformLinear a pinned Mesh");
233 291
234 foreach (Vertex v in vertices.Keys) 292 foreach (Vertex v in m_vertices.Keys)
235 { 293 {
236 if (v == null) 294 if (v == null)
237 continue; 295 continue;
@@ -252,7 +310,7 @@ namespace OpenSim.Region.Physics.Meshing
252 String fileName = name + "_" + title + ".raw"; 310 String fileName = name + "_" + title + ".raw";
253 String completePath = Path.Combine(path, fileName); 311 String completePath = Path.Combine(path, fileName);
254 StreamWriter sw = new StreamWriter(completePath); 312 StreamWriter sw = new StreamWriter(completePath);
255 foreach (Triangle t in triangles) 313 foreach (Triangle t in m_triangles)
256 { 314 {
257 String s = t.ToStringRaw(); 315 String s = t.ToStringRaw();
258 sw.WriteLine(s); 316 sw.WriteLine(s);
@@ -262,7 +320,7 @@ namespace OpenSim.Region.Physics.Meshing
262 320
263 public void TrimExcess() 321 public void TrimExcess()
264 { 322 {
265 triangles.TrimExcess(); 323 m_triangles.TrimExcess();
266 } 324 }
267 } 325 }
268} 326}
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index 0e29ccc..1ea08e2 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -498,12 +498,9 @@ namespace OpenSim.Region.Physics.Meshing
498 // If this mesh has been created already, return it instead of creating another copy 498 // If this mesh has been created already, return it instead of creating another copy
499 // For large regions with 100k+ prims and hundreds of copies of each, this can save a GB or more of memory 499 // For large regions with 100k+ prims and hundreds of copies of each, this can save a GB or more of memory
500 500
501 if (! primShape.SculptEntry) 501 key = GetMeshKey(primShape, size, lod);
502 { 502 if (m_uniqueMeshes.TryGetValue(key, out mesh))
503 key = GetMeshKey(primShape, size, lod); 503 return mesh;
504 if (m_uniqueMeshes.TryGetValue(key, out mesh))
505 return mesh;
506 }
507 504
508 if (size.X < 0.01f) size.X = 0.01f; 505 if (size.X < 0.01f) size.X = 0.01f;
509 if (size.Y < 0.01f) size.Y = 0.01f; 506 if (size.Y < 0.01f) size.Y = 0.01f;
@@ -525,10 +522,9 @@ namespace OpenSim.Region.Physics.Meshing
525 522
526 // trim the vertex and triangle lists to free up memory 523 // trim the vertex and triangle lists to free up memory
527 mesh.TrimExcess(); 524 mesh.TrimExcess();
528 }
529 525
530 if (!primShape.SculptEntry)
531 m_uniqueMeshes.Add(key, mesh); 526 m_uniqueMeshes.Add(key, mesh);
527 }
532 528
533 return mesh; 529 return mesh;
534 } 530 }
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 032b5df..c041243 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -813,18 +813,17 @@ namespace OpenSim.Region.Physics.OdePlugin
813 } 813 }
814 } 814 }
815 815
816 float[] vertexList = mesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory 816 IntPtr vertices, indices;
817 int[] indexList = mesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage 817 int vertexCount, indexCount;
818 int vertexStride, triStride;
819 mesh.getVertexListAsPtrToFloatArray( out vertices, out vertexStride, out vertexCount ); // Note, that vertices are fixed in unmanaged heap
820 mesh.getIndexListAsPtrToIntArray( out indices, out triStride, out indexCount ); // Also fixed, needs release after usage
818 821
819 mesh.releaseSourceMeshData(); // free up the original mesh data to save memory 822 mesh.releaseSourceMeshData(); // free up the original mesh data to save memory
820 823
821 int VertexCount = vertexList.GetLength(0)/3;
822 int IndexCount = indexList.GetLength(0);
823
824 _triMeshData = d.GeomTriMeshDataCreate(); 824 _triMeshData = d.GeomTriMeshDataCreate();
825 825
826 d.GeomTriMeshDataBuildSimple(_triMeshData, vertexList, 3*sizeof (float), VertexCount, indexList, IndexCount, 826 d.GeomTriMeshDataBuildSimple(_triMeshData, vertices, vertexStride, vertexCount, indices, indexCount, triStride);
827 3*sizeof (int));
828 d.GeomTriMeshDataPreprocess(_triMeshData); 827 d.GeomTriMeshDataPreprocess(_triMeshData);
829 828
830 _parent_scene.waitForSpaceUnlock(m_targetSpace); 829 _parent_scene.waitForSpaceUnlock(m_targetSpace);
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 0769c90..f5ab1de 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -3476,7 +3476,7 @@ namespace OpenSim.Region.Physics.OdePlugin
3476 public override void UnCombine(PhysicsScene pScene) 3476 public override void UnCombine(PhysicsScene pScene)
3477 { 3477 {
3478 IntPtr localGround = IntPtr.Zero; 3478 IntPtr localGround = IntPtr.Zero;
3479 float[] localHeightfield; 3479 //float[] localHeightfield;
3480 bool proceed = false; 3480 bool proceed = false;
3481 List<IntPtr> geomDestroyList = new List<IntPtr>(); 3481 List<IntPtr> geomDestroyList = new List<IntPtr>();
3482 3482
@@ -3771,16 +3771,13 @@ namespace OpenSim.Region.Physics.OdePlugin
3771 sides.Z = 0.5f; 3771 sides.Z = 0.5f;
3772 3772
3773 ds.DrawBox(ref pos, ref R, ref sides); 3773 ds.DrawBox(ref pos, ref R, ref sides);
3774
3775
3776 } 3774 }
3777 } 3775 }
3778 } 3776 }
3779 } 3777 }
3780 3778
3781 public void start(int unused) 3779 public void start(int unused)
3782 { 3780 {
3783
3784 ds.SetViewpoint(ref xyz, ref hpr); 3781 ds.SetViewpoint(ref xyz, ref hpr);
3785 } 3782 }
3786#endif 3783#endif
diff --git a/OpenSim/Server/Base/ServerUtils.cs b/OpenSim/Server/Base/ServerUtils.cs
index 0964caa..9d9735e 100644
--- a/OpenSim/Server/Base/ServerUtils.cs
+++ b/OpenSim/Server/Base/ServerUtils.cs
@@ -260,7 +260,7 @@ namespace OpenSim.Server.Base
260 260
261 public static Dictionary<string, object> ParseXmlResponse(string data) 261 public static Dictionary<string, object> ParseXmlResponse(string data)
262 { 262 {
263 //m_log.DebugFormat("[XXX]: received xml string: {0}", data); 263 m_log.DebugFormat("[XXX]: received xml string: {0}", data);
264 264
265 Dictionary<string, object> ret = new Dictionary<string, object>(); 265 Dictionary<string, object> ret = new Dictionary<string, object>();
266 266
diff --git a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
index e22328d..433ed0b 100644
--- a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
@@ -67,43 +67,50 @@ namespace OpenSim.Server.Handlers.Grid
67 67
68 //m_log.DebugFormat("[XXX]: query String: {0}", body); 68 //m_log.DebugFormat("[XXX]: query String: {0}", body);
69 69
70 Dictionary<string, string> request = 70 try
71 ServerUtils.ParseQueryString(body); 71 {
72 Dictionary<string, string> request =
73 ServerUtils.ParseQueryString(body);
72 74
73 if (!request.ContainsKey("METHOD")) 75 if (!request.ContainsKey("METHOD"))
74 return FailureResult(); 76 return FailureResult();
75 77
76 string method = request["METHOD"]; 78 string method = request["METHOD"];
77 79
78 switch (method) 80 switch (method)
79 { 81 {
80 case "register": 82 case "register":
81 return Register(request); 83 return Register(request);
82 84
83 case "deregister": 85 case "deregister":
84 return Deregister(request); 86 return Deregister(request);
85 87
86 case "get_neighbours": 88 case "get_neighbours":
87 return GetNeighbours(request); 89 return GetNeighbours(request);
88 90
89 case "get_region_by_uuid": 91 case "get_region_by_uuid":
90 return GetRegionByUUID(request); 92 return GetRegionByUUID(request);
91 93
92 case "get_region_by_position": 94 case "get_region_by_position":
93 return GetRegionByPosition(request); 95 return GetRegionByPosition(request);
94 96
95 case "get_region_by_name": 97 case "get_region_by_name":
96 return GetRegionByName(request); 98 return GetRegionByName(request);
97 99
98 case "get_regions_by_name": 100 case "get_regions_by_name":
99 return GetRegionsByName(request); 101 return GetRegionsByName(request);
100 102
101 case "get_region_range": 103 case "get_region_range":
102 return GetRegionRange(request); 104 return GetRegionRange(request);
103 105
106 }
107 m_log.DebugFormat("[GRID HANDLER]: unknown method {0} request {1}", method.Length, method);
108 }
109 catch (Exception e)
110 {
111 m_log.DebugFormat("[GRID HANDLER]: Exception {0}", e);
104 } 112 }
105 113
106 m_log.DebugFormat("[GRID HANDLER]: unknown method {0} request {1}", method.Length, method);
107 return FailureResult(); 114 return FailureResult();
108 115
109 } 116 }
@@ -113,7 +120,7 @@ namespace OpenSim.Server.Handlers.Grid
113 byte[] Register(Dictionary<string, string> request) 120 byte[] Register(Dictionary<string, string> request)
114 { 121 {
115 UUID scopeID = UUID.Zero; 122 UUID scopeID = UUID.Zero;
116 if (request["SCOPEID"] != null) 123 if (request.ContainsKey("SCOPEID"))
117 UUID.TryParse(request["SCOPEID"], out scopeID); 124 UUID.TryParse(request["SCOPEID"], out scopeID);
118 else 125 else
119 m_log.WarnFormat("[GRID HANDLER]: no scopeID in request to register region"); 126 m_log.WarnFormat("[GRID HANDLER]: no scopeID in request to register region");
@@ -137,11 +144,21 @@ namespace OpenSim.Server.Handlers.Grid
137 } 144 }
138 145
139 Dictionary<string, object> rinfoData = new Dictionary<string, object>(); 146 Dictionary<string, object> rinfoData = new Dictionary<string, object>();
140 foreach (KeyValuePair<string, string> kvp in request) 147 GridRegion rinfo = null;
141 rinfoData[kvp.Key] = kvp.Value; 148 try
142 GridRegion rinfo = new GridRegion(rinfoData); 149 {
150 foreach (KeyValuePair<string, string> kvp in request)
151 rinfoData[kvp.Key] = kvp.Value;
152 rinfo = new GridRegion(rinfoData);
153 }
154 catch (Exception e)
155 {
156 m_log.DebugFormat("[GRID HANDLER]: exception unpacking region data: {0}", e);
157 }
143 158
144 bool result = m_GridService.RegisterRegion(scopeID, rinfo); 159 bool result = false;
160 if (rinfo != null)
161 result = m_GridService.RegisterRegion(scopeID, rinfo);
145 162
146 if (result) 163 if (result)
147 return SuccessResult(); 164 return SuccessResult();
diff --git a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs
index b1d41da..6f7c90f 100644
--- a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs
@@ -171,6 +171,8 @@ namespace OpenSim.Services.Connectors
171 171
172 if (asset == null) 172 if (asset == null)
173 { 173 {
174 bool result = false;
175
174 AsynchronousRestObjectRequester. 176 AsynchronousRestObjectRequester.
175 MakeRequest<int, AssetBase>("GET", uri, 0, 177 MakeRequest<int, AssetBase>("GET", uri, 0,
176 delegate(AssetBase a) 178 delegate(AssetBase a)
@@ -178,8 +180,10 @@ namespace OpenSim.Services.Connectors
178 if (m_Cache != null) 180 if (m_Cache != null)
179 m_Cache.Cache(a); 181 m_Cache.Cache(a);
180 handler(id, sender, a); 182 handler(id, sender, a);
183 result = true;
181 }); 184 });
182 185
186 return result;
183 } 187 }
184 else 188 else
185 { 189 {
diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
index ba46b0d..acdf558 100644
--- a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
@@ -109,8 +109,13 @@ namespace OpenSim.Services.Connectors
109 { 109 {
110 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply); 110 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
111 111
112 if ((replyData["Result"] != null) && (replyData["Result"].ToString().ToLower() == "success")) 112 if (replyData.ContainsKey("Result")&& (replyData["Result"].ToString().ToLower() == "success"))
113 return true; 113 return true;
114 else if (!replyData.ContainsKey("Result"))
115 m_log.DebugFormat("[GRID CONNECTOR]: reply data does not contain result field");
116 else
117 m_log.DebugFormat("[GRID CONNECTOR]: unexpected result {0}", replyData["Result"].ToString());
118
114 } 119 }
115 else 120 else
116 m_log.DebugFormat("[GRID CONNECTOR]: RegisterRegion received null reply"); 121 m_log.DebugFormat("[GRID CONNECTOR]: RegisterRegion received null reply");
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index 991acf2..a2e4771 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -69,18 +69,40 @@ namespace OpenSim.Services.GridService
69 ((region.posX != regionInfos.RegionLocX) || (region.posY != regionInfos.RegionLocY))) 69 ((region.posX != regionInfos.RegionLocX) || (region.posY != regionInfos.RegionLocY)))
70 { 70 {
71 // Region reregistering in other coordinates. Delete the old entry 71 // Region reregistering in other coordinates. Delete the old entry
72 m_Database.Delete(regionInfos.RegionID); 72 m_log.DebugFormat("[GRID SERVICE]: Region {0} ({1}) was previously registered at {2}-{3}. Deleting old entry.",
73 regionInfos.RegionName, regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY);
74
75 try
76 {
77 m_Database.Delete(regionInfos.RegionID);
78 }
79 catch (Exception e)
80 {
81 m_log.DebugFormat("[GRID SERVICE]: Database exception: {0}", e);
82 }
73 } 83 }
74 84
75 // Everything is ok, let's register 85 // Everything is ok, let's register
76 RegionData rdata = RegionInfo2RegionData(regionInfos); 86 RegionData rdata = RegionInfo2RegionData(regionInfos);
77 rdata.ScopeID = scopeID; 87 rdata.ScopeID = scopeID;
78 m_Database.Store(rdata); 88 try
89 {
90 m_Database.Store(rdata);
91 }
92 catch (Exception e)
93 {
94 m_log.DebugFormat("[GRID SERVICE]: Database exception: {0}", e);
95 }
96
97 m_log.DebugFormat("[GRID SERVICE]: Region {0} ({1}) registered successfully at {2}-{3}",
98 regionInfos.RegionName, regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY);
99
79 return true; 100 return true;
80 } 101 }
81 102
82 public bool DeregisterRegion(UUID regionID) 103 public bool DeregisterRegion(UUID regionID)
83 { 104 {
105 m_log.DebugFormat("[GRID SERVICE]: Region {0} deregistered", regionID);
84 return m_Database.Delete(regionID); 106 return m_Database.Delete(regionID);
85 } 107 }
86 108
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index fa8dc9d..5cb51b2 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -312,7 +312,7 @@
312 ; Uncomment below to enable llRemoteData/remote channels 312 ; Uncomment below to enable llRemoteData/remote channels
313 ; remoteDataPort = 20800 313 ; remoteDataPort = 20800
314 314
315 grid_server_url = "http://127.0.0.1:8001" 315 grid_server_url = "http://127.0.0.1:8003"
316 grid_send_key = "null" 316 grid_send_key = "null"
317 grid_recv_key = "null" 317 grid_recv_key = "null"
318 318
@@ -322,7 +322,7 @@
322 322
323 asset_server_url = "http://127.0.0.1:8003" 323 asset_server_url = "http://127.0.0.1:8003"
324 324
325 inventory_server_url = "http://127.0.0.1:8004" 325 inventory_server_url = "http://127.0.0.1:8003"
326 326
327 ; The MessagingServer is a companion of the UserServer. It uses 327 ; The MessagingServer is a companion of the UserServer. It uses
328 ; user_send_key and user_recv_key, too 328 ; user_send_key and user_recv_key, too
diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example
index 6607a1a..3bc9b6c 100644
--- a/bin/config-include/GridCommon.ini.example
+++ b/bin/config-include/GridCommon.ini.example
@@ -13,13 +13,13 @@
13 ; 13 ;
14 ; change this to your grid-wide inventory server 14 ; change this to your grid-wide inventory server
15 ; 15 ;
16 InventoryServerURI = "http://myinventoryserver.com:8004" 16 InventoryServerURI = "http://myinventoryserver.com:8003"
17 17
18[GridService] 18[GridService]
19 ; 19 ;
20 ; change this to your grid-wide grid server 20 ; change this to your grid-wide grid server
21 ; 21 ;
22 GridServerURI = "http://mygridserver.com:8001" 22 GridServerURI = "http://mygridserver.com:8003"
23 23
24[Modules] 24[Modules]
25 ;; Choose 0 or 1 cache modules, and the corresponding config file, if it exists. 25 ;; Choose 0 or 1 cache modules, and the corresponding config file, if it exists.