diff options
author | Charles Krinke | 2009-01-07 15:03:41 +0000 |
---|---|---|
committer | Charles Krinke | 2009-01-07 15:03:41 +0000 |
commit | 0f9918f1d3df19e4feeb6a742de376aebe4d6f2f (patch) | |
tree | aa60bf8dd5147082bd43aa6f07b517ae2b9614d5 /OpenSim/Data | |
parent | * Added a client version report. (diff) | |
download | opensim-SC_OLD-0f9918f1d3df19e4feeb6a742de376aebe4d6f2f.zip opensim-SC_OLD-0f9918f1d3df19e4feeb6a742de376aebe4d6f2f.tar.gz opensim-SC_OLD-0f9918f1d3df19e4feeb6a742de376aebe4d6f2f.tar.bz2 opensim-SC_OLD-0f9918f1d3df19e4feeb6a742de376aebe4d6f2f.tar.xz |
Thank you kindly, StrawberryFride for a patch that:
Solves the problem of unable to load prim items on region start in MSSQL.
The error was in the MSSQLRegionData code that loads objects from the database,
due to reliance on the ParentID field that is not used.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Data/MSSQL/MSSQLManager.cs | 15 | ||||
-rw-r--r-- | OpenSim/Data/MSSQL/MSSQLRegionData.cs | 1201 | ||||
-rw-r--r-- | OpenSim/Data/MSSQL/Resources/012_RegionStore.sql | 5 |
3 files changed, 592 insertions, 629 deletions
diff --git a/OpenSim/Data/MSSQL/MSSQLManager.cs b/OpenSim/Data/MSSQL/MSSQLManager.cs index b3e9b6e..47d4cbc 100644 --- a/OpenSim/Data/MSSQL/MSSQLManager.cs +++ b/OpenSim/Data/MSSQL/MSSQLManager.cs | |||
@@ -185,7 +185,7 @@ namespace OpenSim.Data.MSSQL | |||
185 | } | 185 | } |
186 | if (type == typeof(sbyte)) | 186 | if (type == typeof(sbyte)) |
187 | { | 187 | { |
188 | return SqlDbType.TinyInt; | 188 | return SqlDbType.Int; |
189 | } | 189 | } |
190 | if (type == typeof(Byte[])) | 190 | if (type == typeof(Byte[])) |
191 | { | 191 | { |
@@ -215,6 +215,10 @@ namespace OpenSim.Data.MSSQL | |||
215 | { | 215 | { |
216 | return value.ToString(); | 216 | return value.ToString(); |
217 | } | 217 | } |
218 | if (valueType == typeof(OpenMetaverse.UUID)) | ||
219 | { | ||
220 | return value.ToString(); | ||
221 | } | ||
218 | if (valueType == typeof(bool)) | 222 | if (valueType == typeof(bool)) |
219 | { | 223 | { |
220 | return (bool)value ? 1 : 0; | 224 | return (bool)value ? 1 : 0; |
@@ -223,6 +227,10 @@ namespace OpenSim.Data.MSSQL | |||
223 | { | 227 | { |
224 | return value; | 228 | return value; |
225 | } | 229 | } |
230 | if (valueType == typeof(int)) | ||
231 | { | ||
232 | return value; | ||
233 | } | ||
226 | return value; | 234 | return value; |
227 | } | 235 | } |
228 | 236 | ||
@@ -269,6 +277,11 @@ namespace OpenSim.Data.MSSQL | |||
269 | 277 | ||
270 | private static readonly Dictionary<string, string> emptyDictionary = new Dictionary<string, string>(); | 278 | private static readonly Dictionary<string, string> emptyDictionary = new Dictionary<string, string>(); |
271 | 279 | ||
280 | /// <summary> | ||
281 | /// Run a query and return a sql db command | ||
282 | /// </summary> | ||
283 | /// <param name="sql">The SQL query.</param> | ||
284 | /// <returns></returns> | ||
272 | internal AutoClosingSqlCommand Query(string sql) | 285 | internal AutoClosingSqlCommand Query(string sql) |
273 | { | 286 | { |
274 | return Query(sql, emptyDictionary); | 287 | return Query(sql, emptyDictionary); |
diff --git a/OpenSim/Data/MSSQL/MSSQLRegionData.cs b/OpenSim/Data/MSSQL/MSSQLRegionData.cs index 179b48a..e710d1c 100644 --- a/OpenSim/Data/MSSQL/MSSQLRegionData.cs +++ b/OpenSim/Data/MSSQL/MSSQLRegionData.cs | |||
@@ -54,19 +54,7 @@ namespace OpenSim.Data.MSSQL | |||
54 | /// The database manager | 54 | /// The database manager |
55 | /// </summary> | 55 | /// </summary> |
56 | private MSSQLManager _Database; | 56 | private MSSQLManager _Database; |
57 | 57 | ||
58 | /// <summary> | ||
59 | /// Const for the prim store.. | ||
60 | /// </summary> | ||
61 | private const string _PrimSelect = "SELECT * FROM PRIMS WHERE RegionUUID = @RegionUUID"; //" AND UUID IN (@UUID)"; //SceneGroupID LIKE @SceneGroupID OR | ||
62 | private const string _ShapeSelect = "SELECT * FROM PRIMSHAPES WHERE UUID in (SELECT UUID FROM PRIMS WHERE RegionUUID = @RegionUUID)"; // AND UUID IN (@UUID))"; //(SceneGroupID LIKE @SceneGroupID OR | ||
63 | private const string _ItemsSelect = "SELECT * FROM PRIMITEMS WHERE primID in (SELECT UUID FROM PRIMS WHERE RegionUUID = @RegionUUID)"; // AND UUID IN (@UUID))"; //(SceneGroupID LIKE @SceneGroupID OR | ||
64 | |||
65 | private DataSet _PrimsDataSet; | ||
66 | private SqlDataAdapter _PrimDataAdapter; | ||
67 | private SqlDataAdapter _ShapeDataAdapter; | ||
68 | private SqlDataAdapter _ItemsDataAdapter; | ||
69 | |||
70 | /// <summary> | 58 | /// <summary> |
71 | /// Initialises the region datastore | 59 | /// Initialises the region datastore |
72 | /// </summary> | 60 | /// </summary> |
@@ -75,7 +63,6 @@ namespace OpenSim.Data.MSSQL | |||
75 | { | 63 | { |
76 | if (!string.IsNullOrEmpty(connectionString)) | 64 | if (!string.IsNullOrEmpty(connectionString)) |
77 | { | 65 | { |
78 | //Add MSSQLManager (dont know if we need it) | ||
79 | _Database = new MSSQLManager(connectionString); | 66 | _Database = new MSSQLManager(connectionString); |
80 | } | 67 | } |
81 | else | 68 | else |
@@ -93,60 +80,6 @@ namespace OpenSim.Data.MSSQL | |||
93 | //Migration settings | 80 | //Migration settings |
94 | _Database.CheckMigration(_migrationStore); | 81 | _Database.CheckMigration(_migrationStore); |
95 | 82 | ||
96 | using (SqlConnection connection = _Database.DatabaseConnection()) | ||
97 | { | ||
98 | //Create Dataset. Not filled!!! | ||
99 | _PrimsDataSet = new DataSet("primsdata"); | ||
100 | |||
101 | using (SqlCommand primSelectCmd = new SqlCommand(_PrimSelect, connection)) | ||
102 | { | ||
103 | primSelectCmd.Parameters.AddWithValue("@RegionUUID", ""); | ||
104 | _PrimDataAdapter = new SqlDataAdapter(primSelectCmd); | ||
105 | |||
106 | DataTable primDataTable = new DataTable("prims"); | ||
107 | _PrimDataAdapter.Fill(primDataTable); | ||
108 | primDataTable.PrimaryKey = new DataColumn[] { primDataTable.Columns["UUID"] }; | ||
109 | _PrimsDataSet.Tables.Add(primDataTable); | ||
110 | |||
111 | SetupCommands(_PrimDataAdapter); | ||
112 | |||
113 | primDataTable.Clear(); | ||
114 | } | ||
115 | |||
116 | using (SqlCommand shapeSelectCmd = new SqlCommand(_ShapeSelect, connection)) | ||
117 | { | ||
118 | shapeSelectCmd.Parameters.AddWithValue("@RegionUUID", ""); | ||
119 | _ShapeDataAdapter = new SqlDataAdapter(shapeSelectCmd); | ||
120 | |||
121 | DataTable shapeDataTable = new DataTable("primshapes"); | ||
122 | _ShapeDataAdapter.Fill(shapeDataTable); | ||
123 | shapeDataTable.PrimaryKey = new DataColumn[] { shapeDataTable.Columns["UUID"] }; | ||
124 | _PrimsDataSet.Tables.Add(shapeDataTable); | ||
125 | |||
126 | SetupCommands(_ShapeDataAdapter); | ||
127 | |||
128 | shapeDataTable.Clear(); | ||
129 | } | ||
130 | |||
131 | using (SqlCommand itemSelectCmd = new SqlCommand(_ItemsSelect, connection)) | ||
132 | { | ||
133 | itemSelectCmd.Parameters.AddWithValue("@RegionUUID", ""); | ||
134 | _ItemsDataAdapter = new SqlDataAdapter(itemSelectCmd); | ||
135 | |||
136 | DataTable itemsDataTable = new DataTable("primitems"); | ||
137 | _ItemsDataAdapter.Fill(itemsDataTable); | ||
138 | itemsDataTable.PrimaryKey = new DataColumn[] { itemsDataTable.Columns["itemID"] }; | ||
139 | _PrimsDataSet.Tables.Add(itemsDataTable); | ||
140 | |||
141 | SetupCommands(_ItemsDataAdapter); | ||
142 | |||
143 | itemsDataTable.Clear(); | ||
144 | } | ||
145 | |||
146 | connection.Close(); | ||
147 | } | ||
148 | |||
149 | //After this we have a empty fully configured DataSet. | ||
150 | } | 83 | } |
151 | 84 | ||
152 | /// <summary> | 85 | /// <summary> |
@@ -154,6 +87,8 @@ namespace OpenSim.Data.MSSQL | |||
154 | /// </summary> | 87 | /// </summary> |
155 | public void Dispose() { } | 88 | public void Dispose() { } |
156 | 89 | ||
90 | #region SceneObjectGroup region for loading and Store of the scene. | ||
91 | |||
157 | /// <summary> | 92 | /// <summary> |
158 | /// Loads the objects present in the region. | 93 | /// Loads the objects present in the region. |
159 | /// </summary> | 94 | /// </summary> |
@@ -161,152 +96,117 @@ namespace OpenSim.Data.MSSQL | |||
161 | /// <returns></returns> | 96 | /// <returns></returns> |
162 | public List<SceneObjectGroup> LoadObjects(UUID regionUUID) | 97 | public List<SceneObjectGroup> LoadObjects(UUID regionUUID) |
163 | { | 98 | { |
164 | Dictionary<UUID, SceneObjectGroup> createdObjects = new Dictionary<UUID, SceneObjectGroup>(); | 99 | UUID lastGroupID = UUID.Zero; |
165 | 100 | ||
166 | //Retrieve all values of current region | 101 | List<SceneObjectPart> sceneObjectParts = new List<SceneObjectPart>(); |
167 | RetrievePrimsDataForRegion(regionUUID, UUID.Zero, ""); | 102 | List<SceneObjectGroup> sceneObjectGroups = new List<SceneObjectGroup>(); |
103 | SceneObjectGroup grp = null; | ||
168 | 104 | ||
169 | List<SceneObjectGroup> retvals = new List<SceneObjectGroup>(); | ||
170 | 105 | ||
171 | DataTable prims = _PrimsDataSet.Tables["prims"]; | 106 | string query = "SELECT *, " + |
172 | DataTable shapes = _PrimsDataSet.Tables["primshapes"]; | 107 | "sort = CASE WHEN prims.UUID = prims.SceneGroupID THEN 0 ELSE 1 END " + |
108 | "FROM prims " + | ||
109 | "LEFT JOIN primshapes ON prims.UUID = primshapes.UUID " + | ||
110 | "WHERE RegionUUID = @RegionUUID " + | ||
111 | "ORDER BY SceneGroupID asc, sort asc, LinkNumber asc"; | ||
173 | 112 | ||
174 | lock (_PrimsDataSet) | 113 | using (AutoClosingSqlCommand command = _Database.Query(query)) |
175 | { | 114 | { |
176 | DataRow[] primsForRegion = prims.Select("", "ParentID ASC"); //.Select(byRegion, orderByParent); | 115 | command.Parameters.Add(_Database.CreateParameter("@regionUUID", regionUUID)); |
177 | |||
178 | _Log.Info("[REGION DB]: " + "Loaded " + primsForRegion.Length + " prims for region: " + regionUUID); | ||
179 | 116 | ||
180 | foreach (DataRow primRow in primsForRegion) | 117 | using (SqlDataReader reader = command.ExecuteReader()) |
181 | { | 118 | { |
182 | try | 119 | while (reader.Read()) |
183 | { | 120 | { |
184 | string uuid = (string)primRow["UUID"]; | 121 | SceneObjectPart sceneObjectPart = BuildPrim(reader); |
185 | string objID = (string)primRow["SceneGroupID"]; | 122 | if (reader["Shape"] is DBNull) |
123 | sceneObjectPart.Shape = PrimitiveBaseShape.Default; | ||
124 | else | ||
125 | sceneObjectPart.Shape = BuildShape(reader); | ||
186 | 126 | ||
187 | SceneObjectPart prim = buildPrim(primRow); | 127 | sceneObjectPart.FolderID = sceneObjectPart.UUID; // A relic from when we |
128 | // we thought prims contained | ||
129 | // folder objects. In | ||
130 | // reality, prim == folder | ||
131 | sceneObjectParts.Add(sceneObjectPart); | ||
188 | 132 | ||
189 | if (uuid == objID) //is new SceneObjectGroup ? | 133 | UUID groupID = new UUID(reader["SceneGroupID"].ToString()); |
134 | |||
135 | if (groupID != lastGroupID) // New SOG | ||
190 | { | 136 | { |
191 | SceneObjectGroup group = new SceneObjectGroup(); | 137 | if (grp != null) |
138 | sceneObjectGroups.Add(grp); | ||
192 | 139 | ||
193 | DataRow shapeRow = shapes.Rows.Find(prim.UUID.ToString()); | 140 | lastGroupID = groupID; |
194 | if (shapeRow != null) | ||
195 | { | ||
196 | prim.Shape = buildShape(shapeRow); | ||
197 | } | ||
198 | else | ||
199 | { | ||
200 | _Log.Info( | ||
201 | "No shape found for prim in storage, so setting default box shape"); | ||
202 | prim.Shape = PrimitiveBaseShape.Default; | ||
203 | } | ||
204 | |||
205 | group.SetRootPart(prim); | ||
206 | 141 | ||
207 | createdObjects.Add(group.UUID, group); | 142 | grp = new SceneObjectGroup(sceneObjectPart); |
208 | retvals.Add(group); | ||
209 | } | 143 | } |
210 | else | 144 | else |
211 | { | 145 | { |
212 | DataRow shapeRow = shapes.Rows.Find(prim.UUID.ToString()); | 146 | // Black magic to preserve link numbers |
213 | if (shapeRow != null) | 147 | // Why is this needed, fix this in AddPart method. |
214 | { | 148 | int link = sceneObjectPart.LinkNum; |
215 | prim.Shape = buildShape(shapeRow); | 149 | |
216 | } | 150 | grp.AddPart(sceneObjectPart); |
217 | else | 151 | |
218 | { | 152 | if (link != 0) |
219 | _Log.Info( | 153 | sceneObjectPart.LinkNum = link; |
220 | "No shape found for prim in storage, so setting default box shape"); | ||
221 | prim.Shape = PrimitiveBaseShape.Default; | ||
222 | } | ||
223 | createdObjects[new UUID(objID)].AddPart(prim); | ||
224 | } | 154 | } |
155 | } | ||
156 | } | ||
157 | } | ||
158 | |||
159 | if (grp != null) | ||
160 | sceneObjectGroups.Add(grp); | ||
161 | |||
162 | //Load the inventory off all sceneobjects within the region | ||
163 | LoadItems(sceneObjectParts); | ||
225 | 164 | ||
226 | LoadItems(prim); | 165 | _Log.DebugFormat("[DATABASE] Loaded {0} objects using {1} prims", sceneObjectGroups.Count, sceneObjectParts.Count); |
166 | |||
167 | return sceneObjectGroups; | ||
168 | |||
169 | } | ||
170 | |||
171 | /// <summary> | ||
172 | /// Load in the prim's persisted inventory. | ||
173 | /// </summary> | ||
174 | /// <param name="allPrims">all prims on a region</param> | ||
175 | private void LoadItems(List<SceneObjectPart> allPrims) | ||
176 | { | ||
177 | using (AutoClosingSqlCommand command = _Database.Query("SELECT * FROM primitems WHERE PrimID = @PrimID")) | ||
178 | { | ||
179 | bool createParamOnce = true; | ||
180 | |||
181 | foreach (SceneObjectPart objectPart in allPrims) | ||
182 | { | ||
183 | if (createParamOnce) | ||
184 | { | ||
185 | command.Parameters.Add(_Database.CreateParameter("@PrimID", objectPart.UUID)); | ||
186 | createParamOnce = false; | ||
227 | } | 187 | } |
228 | catch (Exception e) | 188 | else |
229 | { | 189 | { |
230 | _Log.Error("[REGION DB]: Failed create prim object, exception and data follows"); | 190 | command.Parameters["@PrimID"].Value = objectPart.UUID.ToString(); |
231 | _Log.Info("[REGION DB]: " + e.Message); | 191 | } |
232 | foreach (DataColumn col in prims.Columns) | 192 | |
193 | List<TaskInventoryItem> inventory = new List<TaskInventoryItem>(); | ||
194 | |||
195 | using (SqlDataReader reader = command.ExecuteReader()) | ||
196 | { | ||
197 | while (reader.Read()) | ||
233 | { | 198 | { |
234 | _Log.Info("[REGION DB]: Col: " + col.ColumnName + " => " + primRow[col]); | 199 | TaskInventoryItem item = BuildItem(reader); |
200 | |||
201 | item.ParentID = objectPart.UUID; // Values in database are | ||
202 | // often wrong | ||
203 | inventory.Add(item); | ||
235 | } | 204 | } |
236 | } | 205 | } |
237 | } | ||
238 | 206 | ||
239 | _PrimsDataSet.Tables["prims"].Clear(); | 207 | objectPart.Inventory.RestoreInventoryItems(inventory); |
240 | _PrimsDataSet.Tables["primshapes"].Clear(); | 208 | } |
241 | _PrimsDataSet.Tables["primitems"].Clear(); | ||
242 | } | 209 | } |
243 | return retvals; | ||
244 | |||
245 | #region Experimental | ||
246 | |||
247 | // | ||
248 | // //Get all prims | ||
249 | // string sql = "select * from prims where RegionUUID = @RegionUUID"; | ||
250 | // | ||
251 | // using (AutoClosingSqlCommand cmdPrims = _Database.Query(sql)) | ||
252 | // { | ||
253 | // cmdPrims.Parameters.AddWithValue("@RegionUUID", regionUUID.ToString()); | ||
254 | // using (SqlDataReader readerPrims = cmdPrims.ExecuteReader()) | ||
255 | // { | ||
256 | // while (readerPrims.Read()) | ||
257 | // { | ||
258 | // string uuid = (string)readerPrims["UUID"]; | ||
259 | // string objID = (string)readerPrims["SceneGroupID"]; | ||
260 | // SceneObjectPart prim = buildPrim(readerPrims); | ||
261 | // | ||
262 | // //Setting default shape, will change shape ltr | ||
263 | // prim.Shape = PrimitiveBaseShape.Default; | ||
264 | // | ||
265 | // //Load inventory items of prim | ||
266 | // //LoadItems(prim); | ||
267 | // | ||
268 | // if (uuid == objID) | ||
269 | // { | ||
270 | // SceneObjectGroup group = new SceneObjectGroup(); | ||
271 | // | ||
272 | // group.AddPart(prim); | ||
273 | // group.RootPart = prim; | ||
274 | // | ||
275 | // createdObjects.Add(group.UUID, group); | ||
276 | // retvals.Add(group); | ||
277 | // } | ||
278 | // else | ||
279 | // { | ||
280 | // createdObjects[new UUID(objID)].AddPart(prim); | ||
281 | // } | ||
282 | // } | ||
283 | // } | ||
284 | // } | ||
285 | // m_log.Info("[REGION DB]: Loaded " + retvals.Count + " prim objects for region: " + regionUUID); | ||
286 | // | ||
287 | // //Find all shapes related with prims | ||
288 | // sql = "select * from primshapes"; | ||
289 | // using (AutoClosingSqlCommand cmdShapes = _Database.Query(sql)) | ||
290 | // { | ||
291 | // using (SqlDataReader readerShapes = cmdShapes.ExecuteReader()) | ||
292 | // { | ||
293 | // while (readerShapes.Read()) | ||
294 | // { | ||
295 | // UUID UUID = new UUID((string) readerShapes["UUID"]); | ||
296 | // | ||
297 | // foreach (SceneObjectGroup objectGroup in createdObjects.Values) | ||
298 | // { | ||
299 | // if (objectGroup.Children.ContainsKey(UUID)) | ||
300 | // { | ||
301 | // objectGroup.Children[UUID].Shape = buildShape(readerShapes); | ||
302 | // } | ||
303 | // } | ||
304 | // } | ||
305 | // } | ||
306 | // } | ||
307 | // return retvals; | ||
308 | |||
309 | #endregion | ||
310 | } | 210 | } |
311 | 211 | ||
312 | /// <summary> | 212 | /// <summary> |
@@ -316,55 +216,184 @@ namespace OpenSim.Data.MSSQL | |||
316 | /// <param name="regionUUID"></param> | 216 | /// <param name="regionUUID"></param> |
317 | public void StoreObject(SceneObjectGroup obj, UUID regionUUID) | 217 | public void StoreObject(SceneObjectGroup obj, UUID regionUUID) |
318 | { | 218 | { |
319 | //Retrieve all values of current region, and current scene/or prims | 219 | _Log.InfoFormat("[REGION DB]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Children.Count); |
320 | //Build primID's, we use IN so I can select all prims from objgroup | ||
321 | string primID = ""; | ||
322 | 220 | ||
323 | lock (_Database) | 221 | using (SqlConnection conn = _Database.DatabaseConnection()) |
324 | { | 222 | { |
325 | RetrievePrimsDataForRegion(regionUUID, obj.UUID, primID); | 223 | SqlTransaction transaction = conn.BeginTransaction(); |
326 | 224 | ||
327 | _Log.InfoFormat("[REGION DB]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Children.Count); | 225 | try |
328 | |||
329 | DataTable prims = _PrimsDataSet.Tables["prims"]; | ||
330 | DataTable shapes = _PrimsDataSet.Tables["primshapes"]; | ||
331 | |||
332 | foreach (SceneObjectPart prim in obj.Children.Values) | ||
333 | { | 226 | { |
334 | if ((prim.GetEffectiveObjectFlags() & (uint)PrimFlags.Temporary) == 0 | 227 | foreach (SceneObjectPart sceneObjectPart in obj.Children.Values) |
335 | && (prim.GetEffectiveObjectFlags() & (uint)PrimFlags.TemporaryOnRez) == 0) | ||
336 | { | 228 | { |
337 | 229 | //Update prim | |
338 | DataRow primRow = prims.Rows.Find(prim.UUID.ToString()); | 230 | using (SqlCommand sqlCommand = conn.CreateCommand()) |
339 | if (primRow == null) | ||
340 | { | ||
341 | primRow = prims.NewRow(); | ||
342 | fillPrimRow(primRow, prim, obj.UUID, regionUUID); | ||
343 | prims.Rows.Add(primRow); | ||
344 | } | ||
345 | else | ||
346 | { | 231 | { |
347 | fillPrimRow(primRow, prim, obj.UUID, regionUUID); | 232 | sqlCommand.Transaction = transaction; |
233 | try | ||
234 | { | ||
235 | StoreSceneObjectPrim(sceneObjectPart, sqlCommand, obj.UUID, regionUUID); | ||
236 | } | ||
237 | catch (SqlException sqlEx) | ||
238 | { | ||
239 | _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrim SQL error: {0} at line {1}", sqlEx.Message, sqlEx.LineNumber); | ||
240 | throw; | ||
241 | } | ||
348 | } | 242 | } |
349 | 243 | ||
350 | DataRow shapeRow = shapes.Rows.Find(prim.UUID.ToString()); | 244 | //Update primshapes |
351 | if (shapeRow == null) | 245 | using (SqlCommand sqlCommand = conn.CreateCommand()) |
352 | { | 246 | { |
353 | shapeRow = shapes.NewRow(); | 247 | sqlCommand.Transaction = transaction; |
354 | fillShapeRow(shapeRow, prim); | 248 | try |
355 | shapes.Rows.Add(shapeRow); | 249 | { |
356 | } | 250 | StoreSceneObjectPrimShapes(sceneObjectPart, sqlCommand, obj.UUID, regionUUID); |
357 | else | 251 | } |
358 | { | 252 | catch (SqlException sqlEx) |
359 | fillShapeRow(shapeRow, prim); | 253 | { |
254 | _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrimShapes SQL error: {0} at line {1}", sqlEx.Message, sqlEx.LineNumber); | ||
255 | throw; | ||
256 | } | ||
360 | } | 257 | } |
361 | } | 258 | } |
362 | 259 | ||
260 | transaction.Commit(); | ||
363 | } | 261 | } |
262 | catch (Exception ex) | ||
263 | { | ||
264 | _Log.ErrorFormat("[REGION DB]: Store SceneObjectGroup error: {0}, Rolling back...", ex.Message); | ||
265 | try | ||
266 | { | ||
267 | transaction.Rollback(); | ||
268 | } | ||
269 | catch (Exception ex2) | ||
270 | { | ||
271 | //Show error | ||
272 | _Log.InfoFormat("[REGION DB]: Rollback of SceneObjectGroup store transaction failed with error: {0}", ex2.Message); | ||
364 | 273 | ||
365 | //Save changes | 274 | } |
366 | CommitDataSet(); | 275 | } |
367 | } | 276 | } |
277 | |||
278 | } | ||
279 | |||
280 | /// <summary> | ||
281 | /// Stores the prim of the sceneobjectpart. | ||
282 | /// </summary> | ||
283 | /// <param name="sceneObjectPart">The sceneobjectpart or prim.</param> | ||
284 | /// <param name="sqlCommand">The SQL command with the transaction.</param> | ||
285 | /// <param name="sceneGroupID">The scenegroup UUID.</param> | ||
286 | /// <param name="regionUUID">The region UUID.</param> | ||
287 | private void StoreSceneObjectPrim(SceneObjectPart sceneObjectPart, SqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID) | ||
288 | { | ||
289 | //Big query to update or insert a new prim. | ||
290 | //Note for SQL Server 2008 this could be simplified | ||
291 | string queryPrims = @" | ||
292 | IF EXISTS (SELECT UUID FROM prims WHERE UUID = @UUID) | ||
293 | BEGIN | ||
294 | UPDATE prims SET | ||
295 | CreationDate = @CreationDate, Name = @Name, Text = @Text, Description = @Description, SitName = @SitName, | ||
296 | TouchName = @TouchName, ObjectFlags = @ObjectFlags, OwnerMask = @OwnerMask, NextOwnerMask = @NextOwnerMask, GroupMask = @GroupMask, | ||
297 | EveryoneMask = @EveryoneMask, BaseMask = @BaseMask, PositionX = @PositionX, PositionY = @PositionY, PositionZ = @PositionZ, | ||
298 | GroupPositionX = @GroupPositionX, GroupPositionY = @GroupPositionY, GroupPositionZ = @GroupPositionZ, VelocityX = @VelocityX, | ||
299 | VelocityY = @VelocityY, VelocityZ = @VelocityZ, AngularVelocityX = @AngularVelocityX, AngularVelocityY = @AngularVelocityY, | ||
300 | AngularVelocityZ = @AngularVelocityZ, AccelerationX = @AccelerationX, AccelerationY = @AccelerationY, | ||
301 | AccelerationZ = @AccelerationZ, RotationX = @RotationX, RotationY = @RotationY, RotationZ = @RotationZ, RotationW = @RotationW, | ||
302 | SitTargetOffsetX = @SitTargetOffsetX, SitTargetOffsetY = @SitTargetOffsetY, SitTargetOffsetZ = @SitTargetOffsetZ, | ||
303 | SitTargetOrientW = @SitTargetOrientW, SitTargetOrientX = @SitTargetOrientX, SitTargetOrientY = @SitTargetOrientY, | ||
304 | SitTargetOrientZ = @SitTargetOrientZ, RegionUUID = @RegionUUID, CreatorID = @CreatorID, OwnerID = @OwnerID, GroupID = @GroupID, | ||
305 | LastOwnerID = @LastOwnerID, SceneGroupID = @SceneGroupID, PayPrice = @PayPrice, PayButton1 = @PayButton1, PayButton2 = @PayButton2, | ||
306 | PayButton3 = @PayButton3, PayButton4 = @PayButton4, LoopedSound = @LoopedSound, LoopedSoundGain = @LoopedSoundGain, | ||
307 | TextureAnimation = @TextureAnimation, OmegaX = @OmegaX, OmegaY = @OmegaY, OmegaZ = @OmegaZ, CameraEyeOffsetX = @CameraEyeOffsetX, | ||
308 | CameraEyeOffsetY = @CameraEyeOffsetY, CameraEyeOffsetZ = @CameraEyeOffsetZ, CameraAtOffsetX = @CameraAtOffsetX, | ||
309 | CameraAtOffsetY = @CameraAtOffsetY, CameraAtOffsetZ = @CameraAtOffsetZ, ForceMouselook = @ForceMouselook, | ||
310 | ScriptAccessPin = @ScriptAccessPin, AllowedDrop = @AllowedDrop, DieAtEdge = @DieAtEdge, SalePrice = @SalePrice, | ||
311 | SaleType = @SaleType, ColorR = @ColorR, ColorG = @ColorG, ColorB = @ColorB, ColorA = @ColorA, ParticleSystem = @ParticleSystem, | ||
312 | ClickAction = @ClickAction, Material = @Material, CollisionSound = @CollisionSound, CollisionSoundVolume = @CollisionSoundVolume, | ||
313 | LinkNumber = @LinkNumber | ||
314 | WHERE UUID = @UUID | ||
315 | END | ||
316 | ELSE | ||
317 | BEGIN | ||
318 | INSERT INTO | ||
319 | prims ( | ||
320 | UUID, CreationDate, Name, Text, Description, SitName, TouchName, ObjectFlags, OwnerMask, NextOwnerMask, GroupMask, | ||
321 | EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, | ||
322 | VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, | ||
323 | RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, | ||
324 | SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, RegionUUID, CreatorID, OwnerID, GroupID, LastOwnerID, SceneGroupID, | ||
325 | PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX, | ||
326 | OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, | ||
327 | ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, | ||
328 | ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, LinkNumber | ||
329 | ) VALUES ( | ||
330 | @UUID, @CreationDate, @Name, @Text, @Description, @SitName, @TouchName, @ObjectFlags, @OwnerMask, @NextOwnerMask, @GroupMask, | ||
331 | @EveryoneMask, @BaseMask, @PositionX, @PositionY, @PositionZ, @GroupPositionX, @GroupPositionY, @GroupPositionZ, @VelocityX, | ||
332 | @VelocityY, @VelocityZ, @AngularVelocityX, @AngularVelocityY, @AngularVelocityZ, @AccelerationX, @AccelerationY, @AccelerationZ, | ||
333 | @RotationX, @RotationY, @RotationZ, @RotationW, @SitTargetOffsetX, @SitTargetOffsetY, @SitTargetOffsetZ, @SitTargetOrientW, | ||
334 | @SitTargetOrientX, @SitTargetOrientY, @SitTargetOrientZ, @RegionUUID, @CreatorID, @OwnerID, @GroupID, @LastOwnerID, @SceneGroupID, | ||
335 | @PayPrice, @PayButton1, @PayButton2, @PayButton3, @PayButton4, @LoopedSound, @LoopedSoundGain, @TextureAnimation, @OmegaX, | ||
336 | @OmegaY, @OmegaZ, @CameraEyeOffsetX, @CameraEyeOffsetY, @CameraEyeOffsetZ, @CameraAtOffsetX, @CameraAtOffsetY, @CameraAtOffsetZ, | ||
337 | @ForceMouselook, @ScriptAccessPin, @AllowedDrop, @DieAtEdge, @SalePrice, @SaleType, @ColorR, @ColorG, @ColorB, @ColorA, | ||
338 | @ParticleSystem, @ClickAction, @Material, @CollisionSound, @CollisionSoundVolume, @LinkNumber | ||
339 | ) | ||
340 | END"; | ||
341 | |||
342 | //Set commandtext. | ||
343 | sqlCommand.CommandText = queryPrims; | ||
344 | //Add parameters | ||
345 | sqlCommand.Parameters.AddRange(CreatePrimParameters(sceneObjectPart, sceneGroupID, regionUUID)); | ||
346 | |||
347 | //Execute the query. If it fails then error is trapped in calling function | ||
348 | sqlCommand.ExecuteNonQuery(); | ||
349 | } | ||
350 | |||
351 | /// <summary> | ||
352 | /// Stores the scene object prim shapes. | ||
353 | /// </summary> | ||
354 | /// <param name="sceneObjectPart">The sceneobjectpart containing prim shape.</param> | ||
355 | /// <param name="sqlCommand">The SQL command with the transaction.</param> | ||
356 | /// <param name="sceneGroupID">The scenegroup UUID.</param> | ||
357 | /// <param name="regionUUID">The region UUID.</param> | ||
358 | private void StoreSceneObjectPrimShapes(SceneObjectPart sceneObjectPart, SqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID) | ||
359 | { | ||
360 | //Big query to or insert or update primshapes | ||
361 | //Note for SQL Server 2008 this can be simplified | ||
362 | string queryPrimShapes = @" | ||
363 | IF EXISTS (SELECT UUID FROM primshapes WHERE UUID = @UUID) | ||
364 | BEGIN | ||
365 | UPDATE primshapes SET | ||
366 | Shape = @Shape, ScaleX = @ScaleX, ScaleY = @ScaleY, ScaleZ = @ScaleZ, PCode = @PCode, PathBegin = @PathBegin, | ||
367 | PathEnd = @PathEnd, PathScaleX = @PathScaleX, PathScaleY = @PathScaleY, PathShearX = @PathShearX, PathShearY = @PathShearY, | ||
368 | PathSkew = @PathSkew, PathCurve = @PathCurve, PathRadiusOffset = @PathRadiusOffset, PathRevolutions = @PathRevolutions, | ||
369 | PathTaperX = @PathTaperX, PathTaperY = @PathTaperY, PathTwist = @PathTwist, PathTwistBegin = @PathTwistBegin, | ||
370 | ProfileBegin = @ProfileBegin, ProfileEnd = @ProfileEnd, ProfileCurve = @ProfileCurve, ProfileHollow = @ProfileHollow, | ||
371 | Texture = @Texture, ExtraParams = @ExtraParams, State = @State | ||
372 | WHERE UUID = @UUID | ||
373 | END | ||
374 | ELSE | ||
375 | BEGIN | ||
376 | INSERT INTO | ||
377 | primshapes ( | ||
378 | UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, | ||
379 | PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, | ||
380 | ProfileEnd, ProfileCurve, ProfileHollow, Texture, ExtraParams, State | ||
381 | ) VALUES ( | ||
382 | @UUID, @Shape, @ScaleX, @ScaleY, @ScaleZ, @PCode, @PathBegin, @PathEnd, @PathScaleX, @PathScaleY, @PathShearX, @PathShearY, | ||
383 | @PathSkew, @PathCurve, @PathRadiusOffset, @PathRevolutions, @PathTaperX, @PathTaperY, @PathTwist, @PathTwistBegin, @ProfileBegin, | ||
384 | @ProfileEnd, @ProfileCurve, @ProfileHollow, @Texture, @ExtraParams, @State | ||
385 | ) | ||
386 | END"; | ||
387 | |||
388 | //Set commandtext. | ||
389 | sqlCommand.CommandText = queryPrimShapes; | ||
390 | |||
391 | //Add parameters | ||
392 | sqlCommand.Parameters.AddRange(CreatePrimShapeParameters(sceneObjectPart, sceneGroupID, regionUUID)); | ||
393 | |||
394 | //Execute the query. If it fails then error is trapped in calling function | ||
395 | sqlCommand.ExecuteNonQuery(); | ||
396 | |||
368 | } | 397 | } |
369 | 398 | ||
370 | /// <summary> | 399 | /// <summary> |
@@ -405,7 +434,7 @@ namespace OpenSim.Data.MSSQL | |||
405 | /// <param name="items"></param> | 434 | /// <param name="items"></param> |
406 | public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items) | 435 | public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items) |
407 | { | 436 | { |
408 | //_Log.InfoFormat("[REGION DB]: Persisting Prim Inventory with prim ID {0}", primID); | 437 | //_Log.InfoFormat("[REGION DB: Persisting Prim Inventory with prim ID {0}", primID); |
409 | 438 | ||
410 | //Statement from MySQL section! | 439 | //Statement from MySQL section! |
411 | // For now, we're just going to crudely remove all the previous inventory items | 440 | // For now, we're just going to crudely remove all the previous inventory items |
@@ -420,13 +449,17 @@ namespace OpenSim.Data.MSSQL | |||
420 | } | 449 | } |
421 | 450 | ||
422 | string sql = | 451 | string sql = |
423 | "INSERT INTO [primitems] ([itemID],[primID],[assetID],[parentFolderID],[invType],[assetType],[name],[description],[creationDate],[creatorID],[ownerID],[lastOwnerID],[groupID],[nextPermissions],[currentPermissions],[basePermissions],[everyonePermissions],[groupPermissions],[flags]) VALUES (@itemID,@primID,@assetID,@parentFolderID,@invType,@assetType,@name,@description,@creationDate,@creatorID,@ownerID,@lastOwnerID,@groupID,@nextPermissions,@currentPermissions,@basePermissions,@everyonePermissions,@groupPermissions,@flags)"; | 452 | @"INSERT INTO primitems ( |
453 | itemID,primID,assetID,parentFolderID,invType,assetType,name,description,creationDate,creatorID,ownerID,lastOwnerID,groupID, | ||
454 | nextPermissions,currentPermissions,basePermissions,everyonePermissions,groupPermissions,flags) | ||
455 | VALUES (@itemID,@primID,@assetID,@parentFolderID,@invType,@assetType,@name,@description,@creationDate,@creatorID,@ownerID, | ||
456 | @lastOwnerID,@groupID,@nextPermissions,@currentPermissions,@basePermissions,@everyonePermissions,@groupPermissions,@flags)"; | ||
424 | 457 | ||
425 | using (AutoClosingSqlCommand cmd = _Database.Query(sql)) | 458 | using (AutoClosingSqlCommand cmd = _Database.Query(sql)) |
426 | { | 459 | { |
427 | foreach (TaskInventoryItem taskItem in items) | 460 | foreach (TaskInventoryItem taskItem in items) |
428 | { | 461 | { |
429 | cmd.Parameters.AddRange(CreatePrimInventoryParameters(taskItem)); | 462 | cmd.Parameters.AddRange(CreatePrimInventoryParameters(taskItem)); |
430 | cmd.ExecuteNonQuery(); | 463 | cmd.ExecuteNonQuery(); |
431 | 464 | ||
432 | cmd.Parameters.Clear(); | 465 | cmd.Parameters.Clear(); |
@@ -434,6 +467,8 @@ namespace OpenSim.Data.MSSQL | |||
434 | } | 467 | } |
435 | } | 468 | } |
436 | 469 | ||
470 | #endregion | ||
471 | |||
437 | /// <summary> | 472 | /// <summary> |
438 | /// Loads the terrain map. | 473 | /// Loads the terrain map. |
439 | /// </summary> | 474 | /// </summary> |
@@ -529,7 +564,7 @@ namespace OpenSim.Data.MSSQL | |||
529 | { | 564 | { |
530 | while (readerLandData.Read()) | 565 | while (readerLandData.Read()) |
531 | { | 566 | { |
532 | landDataForRegion.Add(buildLandData(readerLandData)); | 567 | landDataForRegion.Add(BuildLandData(readerLandData)); |
533 | } | 568 | } |
534 | } | 569 | } |
535 | } | 570 | } |
@@ -545,7 +580,7 @@ namespace OpenSim.Data.MSSQL | |||
545 | { | 580 | { |
546 | while (readerAccessList.Read()) | 581 | while (readerAccessList.Read()) |
547 | { | 582 | { |
548 | landData.ParcelAccessList.Add(buildLandAccessData(readerAccessList)); | 583 | landData.ParcelAccessList.Add(BuildLandAccessData(readerAccessList)); |
549 | } | 584 | } |
550 | } | 585 | } |
551 | } | 586 | } |
@@ -586,7 +621,7 @@ VALUES | |||
586 | { | 621 | { |
587 | foreach (ParcelManager.ParcelAccessEntry parcelAccessEntry in parcel.landData.ParcelAccessList) | 622 | foreach (ParcelManager.ParcelAccessEntry parcelAccessEntry in parcel.landData.ParcelAccessList) |
588 | { | 623 | { |
589 | cmd.Parameters.AddRange(CreateLandAccessParameters(parcelAccessEntry, parcel.regionUUID)); | 624 | cmd.Parameters.AddRange(CreateLandAccessParameters(parcelAccessEntry, parcel.regionUUID)); |
590 | 625 | ||
591 | cmd.ExecuteNonQuery(); | 626 | cmd.ExecuteNonQuery(); |
592 | cmd.Parameters.Clear(); | 627 | cmd.Parameters.Clear(); |
@@ -629,7 +664,7 @@ VALUES | |||
629 | { | 664 | { |
630 | if (reader.Read()) | 665 | if (reader.Read()) |
631 | { | 666 | { |
632 | regionSettings = buildRegionSettings(reader); | 667 | regionSettings = BuildRegionSettings(reader); |
633 | regionSettings.OnSave += StoreRegionSettings; | 668 | regionSettings.OnSave += StoreRegionSettings; |
634 | 669 | ||
635 | return regionSettings; | 670 | return regionSettings; |
@@ -698,37 +733,6 @@ VALUES | |||
698 | #region Private Methods | 733 | #region Private Methods |
699 | 734 | ||
700 | /// <summary> | 735 | /// <summary> |
701 | /// Load in a prim's persisted inventory. | ||
702 | /// </summary> | ||
703 | /// <param name="prim">The prim</param> | ||
704 | private void LoadItems(SceneObjectPart prim) | ||
705 | { | ||
706 | DataTable dbItems = _PrimsDataSet.Tables["primitems"]; | ||
707 | |||
708 | String sql = String.Format("primID = '{0}'", prim.UUID); | ||
709 | DataRow[] dbItemRows = dbItems.Select(sql); | ||
710 | |||
711 | IList<TaskInventoryItem> inventory = new List<TaskInventoryItem>(); | ||
712 | |||
713 | foreach (DataRow row in dbItemRows) | ||
714 | { | ||
715 | TaskInventoryItem item = buildItem(row); | ||
716 | inventory.Add(item); | ||
717 | |||
718 | //m_log.DebugFormat("[DATASTORE]: Restored item {0}, {1}", item.Name, item.ItemID); | ||
719 | } | ||
720 | |||
721 | prim.Inventory.RestoreInventoryItems(inventory); | ||
722 | |||
723 | // XXX A nasty little hack to recover the folder id for the prim (which is currently stored in | ||
724 | // every item). This data should really be stored in the prim table itself. | ||
725 | if (dbItemRows.Length > 0) | ||
726 | { | ||
727 | prim.FolderID = inventory[0].ParentID; | ||
728 | } | ||
729 | } | ||
730 | |||
731 | /// <summary> | ||
732 | /// Serializes the terrain data for storage in DB. | 736 | /// Serializes the terrain data for storage in DB. |
733 | /// </summary> | 737 | /// </summary> |
734 | /// <param name="val">terrain data</param> | 738 | /// <param name="val">terrain data</param> |
@@ -773,7 +777,7 @@ VALUES | |||
773 | 777 | ||
774 | using (AutoClosingSqlCommand cmd = _Database.Query(sql)) | 778 | using (AutoClosingSqlCommand cmd = _Database.Query(sql)) |
775 | { | 779 | { |
776 | cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings)); | 780 | cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings)); |
777 | cmd.ExecuteNonQuery(); | 781 | cmd.ExecuteNonQuery(); |
778 | } | 782 | } |
779 | } | 783 | } |
@@ -785,7 +789,7 @@ VALUES | |||
785 | /// </summary> | 789 | /// </summary> |
786 | /// <param name="row">datarecord with regionsettings.</param> | 790 | /// <param name="row">datarecord with regionsettings.</param> |
787 | /// <returns></returns> | 791 | /// <returns></returns> |
788 | private static RegionSettings buildRegionSettings(IDataRecord row) | 792 | private static RegionSettings BuildRegionSettings(IDataRecord row) |
789 | { | 793 | { |
790 | //TODO change this is some more generic code so we doesnt have to change it every time a new field is added? | 794 | //TODO change this is some more generic code so we doesnt have to change it every time a new field is added? |
791 | RegionSettings newSettings = new RegionSettings(); | 795 | RegionSettings newSettings = new RegionSettings(); |
@@ -838,7 +842,7 @@ VALUES | |||
838 | /// </summary> | 842 | /// </summary> |
839 | /// <param name="row">datarecord with land data</param> | 843 | /// <param name="row">datarecord with land data</param> |
840 | /// <returns></returns> | 844 | /// <returns></returns> |
841 | private static LandData buildLandData(IDataRecord row) | 845 | private static LandData BuildLandData(IDataRecord row) |
842 | { | 846 | { |
843 | LandData newData = new LandData(); | 847 | LandData newData = new LandData(); |
844 | 848 | ||
@@ -909,7 +913,7 @@ VALUES | |||
909 | /// </summary> | 913 | /// </summary> |
910 | /// <param name="row">datarecord with landaccess data</param> | 914 | /// <param name="row">datarecord with landaccess data</param> |
911 | /// <returns></returns> | 915 | /// <returns></returns> |
912 | private static ParcelManager.ParcelAccessEntry buildLandAccessData(IDataRecord row) | 916 | private static ParcelManager.ParcelAccessEntry BuildLandAccessData(IDataRecord row) |
913 | { | 917 | { |
914 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); | 918 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); |
915 | entry.AgentID = new UUID((string)row["AccessUUID"]); | 919 | entry.AgentID = new UUID((string)row["AccessUUID"]); |
@@ -923,13 +927,14 @@ VALUES | |||
923 | /// </summary> | 927 | /// </summary> |
924 | /// <param name="primRow">datarecord</param> | 928 | /// <param name="primRow">datarecord</param> |
925 | /// <returns></returns> | 929 | /// <returns></returns> |
926 | private static SceneObjectPart buildPrim(DataRow primRow) | 930 | private static SceneObjectPart BuildPrim(IDataRecord primRow) |
927 | { | 931 | { |
928 | SceneObjectPart prim = new SceneObjectPart(); | 932 | SceneObjectPart prim = new SceneObjectPart(); |
929 | 933 | ||
930 | prim.UUID = new UUID((String)primRow["UUID"]); | 934 | prim.UUID = new UUID((String)primRow["UUID"]); |
931 | // explicit conversion of integers is required, which sort | 935 | // explicit conversion of integers is required, which sort |
932 | // of sucks. No idea if there is a shortcut here or not. | 936 | // of sucks. No idea if there is a shortcut here or not. |
937 | //prim.ParentID = (uint)Convert.ToInt32(primRow["ParentID"]); | ||
933 | prim.CreationDate = Convert.ToInt32(primRow["CreationDate"]); | 938 | prim.CreationDate = Convert.ToInt32(primRow["CreationDate"]); |
934 | prim.Name = (String)primRow["Name"]; | 939 | prim.Name = (String)primRow["Name"]; |
935 | // various text fields | 940 | // various text fields |
@@ -1006,9 +1011,9 @@ VALUES | |||
1006 | prim.SoundGain = Convert.ToSingle(primRow["LoopedSoundGain"]); | 1011 | prim.SoundGain = Convert.ToSingle(primRow["LoopedSoundGain"]); |
1007 | prim.SoundFlags = 1; // If it's persisted at all, it's looped | 1012 | prim.SoundFlags = 1; // If it's persisted at all, it's looped |
1008 | 1013 | ||
1009 | if (!primRow.IsNull("TextureAnimation") && primRow["TextureAnimation"] != DBNull.Value) | 1014 | if (!(primRow["TextureAnimation"] is DBNull)) |
1010 | prim.TextureAnimation = (Byte[])primRow["TextureAnimation"]; | 1015 | prim.TextureAnimation = (Byte[])primRow["TextureAnimation"]; |
1011 | if (!primRow.IsNull("ParticleSystem")) | 1016 | if (!(primRow["ParticleSystem"] is DBNull)) |
1012 | prim.ParticleSystem = (Byte[])primRow["ParticleSystem"]; | 1017 | prim.ParticleSystem = (Byte[])primRow["ParticleSystem"]; |
1013 | 1018 | ||
1014 | prim.RotationalVelocity = new Vector3( | 1019 | prim.RotationalVelocity = new Vector3( |
@@ -1044,97 +1049,100 @@ VALUES | |||
1044 | 1049 | ||
1045 | prim.Material = Convert.ToByte(primRow["Material"]); | 1050 | prim.Material = Convert.ToByte(primRow["Material"]); |
1046 | 1051 | ||
1047 | if (!primRow.IsNull("ClickAction")) | 1052 | if (!(primRow["ClickAction"] is DBNull)) |
1048 | prim.ClickAction = Convert.ToByte(primRow["ClickAction"]); | 1053 | prim.ClickAction = Convert.ToByte(primRow["ClickAction"]); |
1049 | 1054 | ||
1050 | prim.CollisionSound = new UUID(primRow["CollisionSound"].ToString()); | 1055 | prim.CollisionSound = new UUID(primRow["CollisionSound"].ToString()); |
1051 | prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]); | 1056 | prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]); |
1052 | 1057 | ||
1058 | prim.LinkNum = Convert.ToInt32(primRow["LinkNumber"]); | ||
1059 | |||
1053 | return prim; | 1060 | return prim; |
1054 | } | 1061 | } |
1055 | 1062 | ||
1056 | /// <summary> | 1063 | /// <summary> |
1057 | /// Builds the prim shape from a datarecord. | 1064 | /// Builds the prim shape from a datarecord. |
1058 | /// </summary> | 1065 | /// </summary> |
1059 | /// <param name="row">The row.</param> | 1066 | /// <param name="shapeRow">The row.</param> |
1060 | /// <returns></returns> | 1067 | /// <returns></returns> |
1061 | private static PrimitiveBaseShape buildShape(DataRow row) | 1068 | private static PrimitiveBaseShape BuildShape(IDataRecord shapeRow) |
1062 | { | 1069 | { |
1063 | PrimitiveBaseShape s = new PrimitiveBaseShape(); | 1070 | PrimitiveBaseShape baseShape = new PrimitiveBaseShape(); |
1064 | s.Scale = new Vector3( | 1071 | |
1065 | Convert.ToSingle(row["ScaleX"]), | 1072 | baseShape.Scale = new Vector3( |
1066 | Convert.ToSingle(row["ScaleY"]), | 1073 | Convert.ToSingle(shapeRow["ScaleX"]), |
1067 | Convert.ToSingle(row["ScaleZ"])); | 1074 | Convert.ToSingle(shapeRow["ScaleY"]), |
1075 | Convert.ToSingle(shapeRow["ScaleZ"])); | ||
1068 | 1076 | ||
1069 | // paths | 1077 | // paths |
1070 | s.PCode = Convert.ToByte(row["PCode"]); | 1078 | baseShape.PCode = Convert.ToByte(shapeRow["PCode"]); |
1071 | s.PathBegin = Convert.ToUInt16(row["PathBegin"]); | 1079 | baseShape.PathBegin = Convert.ToUInt16(shapeRow["PathBegin"]); |
1072 | s.PathEnd = Convert.ToUInt16(row["PathEnd"]); | 1080 | baseShape.PathEnd = Convert.ToUInt16(shapeRow["PathEnd"]); |
1073 | s.PathScaleX = Convert.ToByte(row["PathScaleX"]); | 1081 | baseShape.PathScaleX = Convert.ToByte(shapeRow["PathScaleX"]); |
1074 | s.PathScaleY = Convert.ToByte(row["PathScaleY"]); | 1082 | baseShape.PathScaleY = Convert.ToByte(shapeRow["PathScaleY"]); |
1075 | s.PathShearX = Convert.ToByte(row["PathShearX"]); | 1083 | baseShape.PathShearX = Convert.ToByte(shapeRow["PathShearX"]); |
1076 | s.PathShearY = Convert.ToByte(row["PathShearY"]); | 1084 | baseShape.PathShearY = Convert.ToByte(shapeRow["PathShearY"]); |
1077 | s.PathSkew = Convert.ToSByte(row["PathSkew"]); | 1085 | baseShape.PathSkew = Convert.ToSByte(shapeRow["PathSkew"]); |
1078 | s.PathCurve = Convert.ToByte(row["PathCurve"]); | 1086 | baseShape.PathCurve = Convert.ToByte(shapeRow["PathCurve"]); |
1079 | s.PathRadiusOffset = Convert.ToSByte(row["PathRadiusOffset"]); | 1087 | baseShape.PathRadiusOffset = Convert.ToSByte(shapeRow["PathRadiusOffset"]); |
1080 | s.PathRevolutions = Convert.ToByte(row["PathRevolutions"]); | 1088 | baseShape.PathRevolutions = Convert.ToByte(shapeRow["PathRevolutions"]); |
1081 | s.PathTaperX = Convert.ToSByte(row["PathTaperX"]); | 1089 | baseShape.PathTaperX = Convert.ToSByte(shapeRow["PathTaperX"]); |
1082 | s.PathTaperY = Convert.ToSByte(row["PathTaperY"]); | 1090 | baseShape.PathTaperY = Convert.ToSByte(shapeRow["PathTaperY"]); |
1083 | s.PathTwist = Convert.ToSByte(row["PathTwist"]); | 1091 | baseShape.PathTwist = Convert.ToSByte(shapeRow["PathTwist"]); |
1084 | s.PathTwistBegin = Convert.ToSByte(row["PathTwistBegin"]); | 1092 | baseShape.PathTwistBegin = Convert.ToSByte(shapeRow["PathTwistBegin"]); |
1085 | // profile | 1093 | // profile |
1086 | s.ProfileBegin = Convert.ToUInt16(row["ProfileBegin"]); | 1094 | baseShape.ProfileBegin = Convert.ToUInt16(shapeRow["ProfileBegin"]); |
1087 | s.ProfileEnd = Convert.ToUInt16(row["ProfileEnd"]); | 1095 | baseShape.ProfileEnd = Convert.ToUInt16(shapeRow["ProfileEnd"]); |
1088 | s.ProfileCurve = Convert.ToByte(row["ProfileCurve"]); | 1096 | baseShape.ProfileCurve = Convert.ToByte(shapeRow["ProfileCurve"]); |
1089 | s.ProfileHollow = Convert.ToUInt16(row["ProfileHollow"]); | 1097 | baseShape.ProfileHollow = Convert.ToUInt16(shapeRow["ProfileHollow"]); |
1090 | 1098 | ||
1091 | byte[] textureEntry = (byte[])row["Texture"]; | 1099 | byte[] textureEntry = (byte[])shapeRow["Texture"]; |
1092 | s.TextureEntry = textureEntry; | 1100 | baseShape.TextureEntry = textureEntry; |
1093 | 1101 | ||
1094 | s.ExtraParams = (byte[])row["ExtraParams"]; | 1102 | baseShape.ExtraParams = (byte[])shapeRow["ExtraParams"]; |
1095 | 1103 | ||
1096 | try | 1104 | try |
1097 | { | 1105 | { |
1098 | s.State = Convert.ToByte(row["State"]); | 1106 | baseShape.State = Convert.ToByte(shapeRow["State"]); |
1099 | } | 1107 | } |
1100 | catch (InvalidCastException) | 1108 | catch (InvalidCastException) |
1101 | { | 1109 | { |
1102 | } | 1110 | } |
1103 | 1111 | ||
1104 | return s; | 1112 | return baseShape; |
1105 | } | 1113 | } |
1106 | 1114 | ||
1107 | /// <summary> | 1115 | /// <summary> |
1108 | /// Build a prim inventory item from the persisted data. | 1116 | /// Build a prim inventory item from the persisted data. |
1109 | /// </summary> | 1117 | /// </summary> |
1110 | /// <param name="row"></param> | 1118 | /// <param name="inventoryRow"></param> |
1111 | /// <returns></returns> | 1119 | /// <returns></returns> |
1112 | private static TaskInventoryItem buildItem(DataRow row) | 1120 | private static TaskInventoryItem BuildItem(IDataRecord inventoryRow) |
1113 | { | 1121 | { |
1114 | TaskInventoryItem taskItem = new TaskInventoryItem(); | 1122 | TaskInventoryItem taskItem = new TaskInventoryItem(); |
1115 | 1123 | ||
1116 | taskItem.ItemID = new UUID((String)row["itemID"]); | 1124 | taskItem.ItemID = new UUID((String)inventoryRow["itemID"]); |
1117 | taskItem.ParentPartID = new UUID((String)row["primID"]); | 1125 | taskItem.ParentPartID = new UUID((String)inventoryRow["primID"]); |
1118 | taskItem.AssetID = new UUID((String)row["assetID"]); | 1126 | taskItem.AssetID = new UUID((String)inventoryRow["assetID"]); |
1119 | taskItem.ParentID = new UUID((String)row["parentFolderID"]); | 1127 | taskItem.ParentID = new UUID((String)inventoryRow["parentFolderID"]); |
1120 | 1128 | ||
1121 | taskItem.InvType = Convert.ToInt32(row["invType"]); | 1129 | taskItem.InvType = Convert.ToInt32(inventoryRow["invType"]); |
1122 | taskItem.Type = Convert.ToInt32(row["assetType"]); | 1130 | taskItem.Type = Convert.ToInt32(inventoryRow["assetType"]); |
1123 | 1131 | ||
1124 | taskItem.Name = (String)row["name"]; | 1132 | taskItem.Name = (String)inventoryRow["name"]; |
1125 | taskItem.Description = (String)row["description"]; | 1133 | taskItem.Description = (String)inventoryRow["description"]; |
1126 | taskItem.CreationDate = Convert.ToUInt32(row["creationDate"]); | 1134 | taskItem.CreationDate = Convert.ToUInt32(inventoryRow["creationDate"]); |
1127 | taskItem.CreatorID = new UUID((String)row["creatorID"]); | 1135 | taskItem.CreatorID = new UUID((String)inventoryRow["creatorID"]); |
1128 | taskItem.OwnerID = new UUID((String)row["ownerID"]); | 1136 | taskItem.OwnerID = new UUID((String)inventoryRow["ownerID"]); |
1129 | taskItem.LastOwnerID = new UUID((String)row["lastOwnerID"]); | 1137 | taskItem.LastOwnerID = new UUID((String)inventoryRow["lastOwnerID"]); |
1130 | taskItem.GroupID = new UUID((String)row["groupID"]); | 1138 | taskItem.GroupID = new UUID((String)inventoryRow["groupID"]); |
1131 | 1139 | ||
1132 | taskItem.NextPermissions = Convert.ToUInt32(row["nextPermissions"]); | 1140 | taskItem.NextPermissions = Convert.ToUInt32(inventoryRow["nextPermissions"]); |
1133 | taskItem.CurrentPermissions = Convert.ToUInt32(row["currentPermissions"]); | 1141 | taskItem.CurrentPermissions = Convert.ToUInt32(inventoryRow["currentPermissions"]); |
1134 | taskItem.BasePermissions = Convert.ToUInt32(row["basePermissions"]); | 1142 | taskItem.BasePermissions = Convert.ToUInt32(inventoryRow["basePermissions"]); |
1135 | taskItem.EveryonePermissions = Convert.ToUInt32(row["everyonePermissions"]); | 1143 | taskItem.EveryonePermissions = Convert.ToUInt32(inventoryRow["everyonePermissions"]); |
1136 | taskItem.GroupPermissions = Convert.ToUInt32(row["groupPermissions"]); | 1144 | taskItem.GroupPermissions = Convert.ToUInt32(inventoryRow["groupPermissions"]); |
1137 | taskItem.Flags = Convert.ToUInt32(row["flags"]); | 1145 | taskItem.Flags = Convert.ToUInt32(inventoryRow["flags"]); |
1138 | 1146 | ||
1139 | return taskItem; | 1147 | return taskItem; |
1140 | } | 1148 | } |
@@ -1149,31 +1157,30 @@ VALUES | |||
1149 | /// <returns></returns> | 1157 | /// <returns></returns> |
1150 | private SqlParameter[] CreatePrimInventoryParameters(TaskInventoryItem taskItem) | 1158 | private SqlParameter[] CreatePrimInventoryParameters(TaskInventoryItem taskItem) |
1151 | { | 1159 | { |
1152 | SqlParameter[] parameters = new SqlParameter[19]; | 1160 | List<SqlParameter> parameters = new List<SqlParameter>(); |
1153 | 1161 | ||
1154 | parameters[0] = _Database.CreateParameter("itemID", taskItem.ItemID); | 1162 | parameters.Add(_Database.CreateParameter("itemID", taskItem.ItemID)); |
1155 | parameters[1] = _Database.CreateParameter("primID", taskItem.ParentPartID); | 1163 | parameters.Add(_Database.CreateParameter("primID", taskItem.ParentPartID)); |
1156 | parameters[2] = _Database.CreateParameter("assetID", taskItem.AssetID); | 1164 | parameters.Add(_Database.CreateParameter("assetID", taskItem.AssetID)); |
1157 | parameters[3] = _Database.CreateParameter("parentFolderID", taskItem.ParentID); | 1165 | parameters.Add(_Database.CreateParameter("parentFolderID", taskItem.ParentID)); |
1158 | 1166 | parameters.Add(_Database.CreateParameter("invType", taskItem.InvType)); | |
1159 | parameters[4] = _Database.CreateParameter("invType", taskItem.InvType); | 1167 | parameters.Add(_Database.CreateParameter("assetType", taskItem.Type)); |
1160 | parameters[5] = _Database.CreateParameter("assetType", taskItem.Type); | 1168 | |
1161 | 1169 | parameters.Add(_Database.CreateParameter("name", taskItem.Name)); | |
1162 | parameters[6] = _Database.CreateParameter("name", taskItem.Name); | 1170 | parameters.Add(_Database.CreateParameter("description", taskItem.Description)); |
1163 | parameters[7] = _Database.CreateParameter("description", taskItem.Description); | 1171 | parameters.Add(_Database.CreateParameter("creationDate", taskItem.CreationDate)); |
1164 | parameters[8] = _Database.CreateParameter("creationDate", taskItem.CreationDate); | 1172 | parameters.Add(_Database.CreateParameter("creatorID", taskItem.CreatorID)); |
1165 | parameters[9] = _Database.CreateParameter("creatorID", taskItem.CreatorID); | 1173 | parameters.Add(_Database.CreateParameter("ownerID", taskItem.OwnerID)); |
1166 | parameters[10] = _Database.CreateParameter("ownerID", taskItem.OwnerID); | 1174 | parameters.Add(_Database.CreateParameter("lastOwnerID", taskItem.LastOwnerID)); |
1167 | parameters[11] = _Database.CreateParameter("lastOwnerID", taskItem.LastOwnerID); | 1175 | parameters.Add(_Database.CreateParameter("groupID", taskItem.GroupID)); |
1168 | parameters[12] = _Database.CreateParameter("groupID", taskItem.GroupID); | 1176 | parameters.Add(_Database.CreateParameter("nextPermissions", taskItem.NextPermissions)); |
1169 | parameters[13] = _Database.CreateParameter("nextPermissions", taskItem.NextPermissions); | 1177 | parameters.Add(_Database.CreateParameter("currentPermissions", taskItem.CurrentPermissions)); |
1170 | parameters[14] = _Database.CreateParameter("currentPermissions", taskItem.CurrentPermissions); | 1178 | parameters.Add(_Database.CreateParameter("basePermissions", taskItem.BasePermissions)); |
1171 | parameters[15] = _Database.CreateParameter("basePermissions", taskItem.BasePermissions); | 1179 | parameters.Add(_Database.CreateParameter("everyonePermissions", taskItem.EveryonePermissions)); |
1172 | parameters[16] = _Database.CreateParameter("everyonePermissions", taskItem.EveryonePermissions); | 1180 | parameters.Add(_Database.CreateParameter("groupPermissions", taskItem.GroupPermissions)); |
1173 | parameters[17] = _Database.CreateParameter("groupPermissions", taskItem.GroupPermissions); | 1181 | parameters.Add(_Database.CreateParameter("flags", taskItem.Flags)); |
1174 | parameters[18] = _Database.CreateParameter("flags", taskItem.Flags); | 1182 | |
1175 | 1183 | return parameters.ToArray(); | |
1176 | return parameters; | ||
1177 | } | 1184 | } |
1178 | 1185 | ||
1179 | /// <summary> | 1186 | /// <summary> |
@@ -1183,47 +1190,47 @@ VALUES | |||
1183 | /// <returns></returns> | 1190 | /// <returns></returns> |
1184 | private SqlParameter[] CreateRegionSettingParameters(RegionSettings settings) | 1191 | private SqlParameter[] CreateRegionSettingParameters(RegionSettings settings) |
1185 | { | 1192 | { |
1186 | SqlParameter[] parameters = new SqlParameter[37]; | 1193 | List<SqlParameter> parameters = new List<SqlParameter>(); |
1187 | 1194 | ||
1188 | parameters[0] = _Database.CreateParameter("regionUUID", settings.RegionUUID); | 1195 | parameters.Add(_Database.CreateParameter("regionUUID", settings.RegionUUID)); |
1189 | parameters[1] = _Database.CreateParameter("block_terraform", settings.BlockTerraform); | 1196 | parameters.Add(_Database.CreateParameter("block_terraform", settings.BlockTerraform)); |
1190 | parameters[2] = _Database.CreateParameter("block_fly", settings.BlockFly); | 1197 | parameters.Add(_Database.CreateParameter("block_fly", settings.BlockFly)); |
1191 | parameters[3] = _Database.CreateParameter("allow_damage", settings.AllowDamage); | 1198 | parameters.Add(_Database.CreateParameter("allow_damage", settings.AllowDamage)); |
1192 | parameters[4] = _Database.CreateParameter("restrict_pushing", settings.RestrictPushing); | 1199 | parameters.Add(_Database.CreateParameter("restrict_pushing", settings.RestrictPushing)); |
1193 | parameters[5] = _Database.CreateParameter("allow_land_resell", settings.AllowLandResell); | 1200 | parameters.Add(_Database.CreateParameter("allow_land_resell", settings.AllowLandResell)); |
1194 | parameters[6] = _Database.CreateParameter("allow_land_join_divide", settings.AllowLandJoinDivide); | 1201 | parameters.Add(_Database.CreateParameter("allow_land_join_divide", settings.AllowLandJoinDivide)); |
1195 | parameters[7] = _Database.CreateParameter("block_show_in_search", settings.BlockShowInSearch); | 1202 | parameters.Add(_Database.CreateParameter("block_show_in_search", settings.BlockShowInSearch)); |
1196 | parameters[8] = _Database.CreateParameter("agent_limit", settings.AgentLimit); | 1203 | parameters.Add(_Database.CreateParameter("agent_limit", settings.AgentLimit)); |
1197 | parameters[9] = _Database.CreateParameter("object_bonus", settings.ObjectBonus); | 1204 | parameters.Add(_Database.CreateParameter("object_bonus", settings.ObjectBonus)); |
1198 | parameters[10] = _Database.CreateParameter("maturity", settings.Maturity); | 1205 | parameters.Add(_Database.CreateParameter("maturity", settings.Maturity)); |
1199 | parameters[11] = _Database.CreateParameter("disable_scripts", settings.DisableScripts); | 1206 | parameters.Add(_Database.CreateParameter("disable_scripts", settings.DisableScripts)); |
1200 | parameters[12] = _Database.CreateParameter("disable_collisions", settings.DisableCollisions); | 1207 | parameters.Add(_Database.CreateParameter("disable_collisions", settings.DisableCollisions)); |
1201 | parameters[13] = _Database.CreateParameter("disable_physics", settings.DisablePhysics); | 1208 | parameters.Add(_Database.CreateParameter("disable_physics", settings.DisablePhysics)); |
1202 | parameters[14] = _Database.CreateParameter("terrain_texture_1", settings.TerrainTexture1); | 1209 | parameters.Add(_Database.CreateParameter("terrain_texture_1", settings.TerrainTexture1)); |
1203 | parameters[15] = _Database.CreateParameter("terrain_texture_2", settings.TerrainTexture2); | 1210 | parameters.Add(_Database.CreateParameter("terrain_texture_2", settings.TerrainTexture2)); |
1204 | parameters[16] = _Database.CreateParameter("terrain_texture_3", settings.TerrainTexture3); | 1211 | parameters.Add(_Database.CreateParameter("terrain_texture_3", settings.TerrainTexture3)); |
1205 | parameters[17] = _Database.CreateParameter("terrain_texture_4", settings.TerrainTexture4); | 1212 | parameters.Add(_Database.CreateParameter("terrain_texture_4", settings.TerrainTexture4)); |
1206 | parameters[18] = _Database.CreateParameter("elevation_1_nw", settings.Elevation1NW); | 1213 | parameters.Add(_Database.CreateParameter("elevation_1_nw", settings.Elevation1NW)); |
1207 | parameters[19] = _Database.CreateParameter("elevation_2_nw", settings.Elevation2NW); | 1214 | parameters.Add(_Database.CreateParameter("elevation_2_nw", settings.Elevation2NW)); |
1208 | parameters[20] = _Database.CreateParameter("elevation_1_ne", settings.Elevation1NE); | 1215 | parameters.Add(_Database.CreateParameter("elevation_1_ne", settings.Elevation1NE)); |
1209 | parameters[21] = _Database.CreateParameter("elevation_2_ne", settings.Elevation2NE); | 1216 | parameters.Add(_Database.CreateParameter("elevation_2_ne", settings.Elevation2NE)); |
1210 | parameters[22] = _Database.CreateParameter("elevation_1_se", settings.Elevation1SE); | 1217 | parameters.Add(_Database.CreateParameter("elevation_1_se", settings.Elevation1SE)); |
1211 | parameters[23] = _Database.CreateParameter("elevation_2_se", settings.Elevation2SE); | 1218 | parameters.Add(_Database.CreateParameter("elevation_2_se", settings.Elevation2SE)); |
1212 | parameters[24] = _Database.CreateParameter("elevation_1_sw", settings.Elevation1SW); | 1219 | parameters.Add(_Database.CreateParameter("elevation_1_sw", settings.Elevation1SW)); |
1213 | parameters[25] = _Database.CreateParameter("elevation_2_sw", settings.Elevation2SW); | 1220 | parameters.Add(_Database.CreateParameter("elevation_2_sw", settings.Elevation2SW)); |
1214 | parameters[26] = _Database.CreateParameter("water_height", settings.WaterHeight); | 1221 | parameters.Add(_Database.CreateParameter("water_height", settings.WaterHeight)); |
1215 | parameters[27] = _Database.CreateParameter("terrain_raise_limit", settings.TerrainRaiseLimit); | 1222 | parameters.Add(_Database.CreateParameter("terrain_raise_limit", settings.TerrainRaiseLimit)); |
1216 | parameters[28] = _Database.CreateParameter("terrain_lower_limit", settings.TerrainLowerLimit); | 1223 | parameters.Add(_Database.CreateParameter("terrain_lower_limit", settings.TerrainLowerLimit)); |
1217 | parameters[29] = _Database.CreateParameter("use_estate_sun", settings.UseEstateSun); | 1224 | parameters.Add(_Database.CreateParameter("use_estate_sun", settings.UseEstateSun)); |
1218 | parameters[30] = _Database.CreateParameter("sandbox", settings.Sandbox); | 1225 | parameters.Add(_Database.CreateParameter("sandbox", settings.Sandbox)); |
1219 | parameters[31] = _Database.CreateParameter("fixed_sun", settings.FixedSun); | 1226 | parameters.Add(_Database.CreateParameter("fixed_sun", settings.FixedSun)); |
1220 | parameters[32] = _Database.CreateParameter("sun_position", settings.SunPosition); | 1227 | parameters.Add(_Database.CreateParameter("sun_position", settings.SunPosition)); |
1221 | parameters[33] = _Database.CreateParameter("sunvectorx", settings.SunVector.X); | 1228 | parameters.Add(_Database.CreateParameter("sunvectorx", settings.SunVector.X)); |
1222 | parameters[34] = _Database.CreateParameter("sunvectory", settings.SunVector.Y); | 1229 | parameters.Add(_Database.CreateParameter("sunvectory", settings.SunVector.Y)); |
1223 | parameters[35] = _Database.CreateParameter("sunvectorz", settings.SunVector.Z); | 1230 | parameters.Add(_Database.CreateParameter("sunvectorz", settings.SunVector.Z)); |
1224 | parameters[36] = _Database.CreateParameter("covenant", settings.Covenant); | 1231 | parameters.Add(_Database.CreateParameter("covenant", settings.Covenant)); |
1225 | 1232 | ||
1226 | return parameters; | 1233 | return parameters.ToArray(); |
1227 | } | 1234 | } |
1228 | 1235 | ||
1229 | /// <summary> | 1236 | /// <summary> |
@@ -1234,47 +1241,47 @@ VALUES | |||
1234 | /// <returns></returns> | 1241 | /// <returns></returns> |
1235 | private SqlParameter[] CreateLandParameters(LandData land, UUID regionUUID) | 1242 | private SqlParameter[] CreateLandParameters(LandData land, UUID regionUUID) |
1236 | { | 1243 | { |
1237 | SqlParameter[] parameters = new SqlParameter[34]; | 1244 | List<SqlParameter> parameters = new List<SqlParameter>(); |
1238 | 1245 | ||
1239 | parameters[0] = _Database.CreateParameter("UUID", land.GlobalID); | 1246 | parameters.Add(_Database.CreateParameter("UUID", land.GlobalID)); |
1240 | parameters[1] = _Database.CreateParameter("RegionUUID", regionUUID); | 1247 | parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID)); |
1241 | parameters[2] = _Database.CreateParameter("LocalLandID", land.LocalID); | 1248 | parameters.Add(_Database.CreateParameter("LocalLandID", land.LocalID)); |
1242 | 1249 | ||
1243 | // Bitmap is a byte[512] | 1250 | // Bitmap is a byte[512] |
1244 | parameters[3] = _Database.CreateParameter("Bitmap", land.Bitmap); | 1251 | parameters.Add(_Database.CreateParameter("Bitmap", land.Bitmap)); |
1245 | 1252 | ||
1246 | parameters[4] = _Database.CreateParameter("Name", land.Name); | 1253 | parameters.Add(_Database.CreateParameter("Name", land.Name)); |
1247 | parameters[5] = _Database.CreateParameter("Description", land.Description); | 1254 | parameters.Add(_Database.CreateParameter("Description", land.Description)); |
1248 | parameters[6] = _Database.CreateParameter("OwnerUUID", land.OwnerID); | 1255 | parameters.Add(_Database.CreateParameter("OwnerUUID", land.OwnerID)); |
1249 | parameters[7] = _Database.CreateParameter("IsGroupOwned", land.IsGroupOwned); | 1256 | parameters.Add(_Database.CreateParameter("IsGroupOwned", land.IsGroupOwned)); |
1250 | parameters[8] = _Database.CreateParameter("Area", land.Area); | 1257 | parameters.Add(_Database.CreateParameter("Area", land.Area)); |
1251 | parameters[9] = _Database.CreateParameter("AuctionID", land.AuctionID); //Unemplemented | 1258 | parameters.Add(_Database.CreateParameter("AuctionID", land.AuctionID)); //Unemplemented |
1252 | parameters[10] = _Database.CreateParameter("Category", (int)land.Category); //Enum libsecondlife.Parcel.ParcelCategory | 1259 | parameters.Add(_Database.CreateParameter("Category", (int)land.Category)); //Enum libsecondlife.Parcel.ParcelCategory |
1253 | parameters[11] = _Database.CreateParameter("ClaimDate", land.ClaimDate); | 1260 | parameters.Add(_Database.CreateParameter("ClaimDate", land.ClaimDate)); |
1254 | parameters[12] = _Database.CreateParameter("ClaimPrice", land.ClaimPrice); | 1261 | parameters.Add(_Database.CreateParameter("ClaimPrice", land.ClaimPrice)); |
1255 | parameters[13] = _Database.CreateParameter("GroupUUID", land.GroupID); | 1262 | parameters.Add(_Database.CreateParameter("GroupUUID", land.GroupID)); |
1256 | parameters[14] = _Database.CreateParameter("SalePrice", land.SalePrice); | 1263 | parameters.Add(_Database.CreateParameter("SalePrice", land.SalePrice)); |
1257 | parameters[15] = _Database.CreateParameter("LandStatus", (int)land.Status); //Enum. libsecondlife.Parcel.ParcelStatus | 1264 | parameters.Add(_Database.CreateParameter("LandStatus", (int)land.Status)); //Enum. libsecondlife.Parcel.ParcelStatus |
1258 | parameters[16] = _Database.CreateParameter("LandFlags", land.Flags); | 1265 | parameters.Add(_Database.CreateParameter("LandFlags", land.Flags)); |
1259 | parameters[17] = _Database.CreateParameter("LandingType", land.LandingType); | 1266 | parameters.Add(_Database.CreateParameter("LandingType", land.LandingType)); |
1260 | parameters[18] = _Database.CreateParameter("MediaAutoScale", land.MediaAutoScale); | 1267 | parameters.Add(_Database.CreateParameter("MediaAutoScale", land.MediaAutoScale)); |
1261 | parameters[19] = _Database.CreateParameter("MediaTextureUUID", land.MediaID); | 1268 | parameters.Add(_Database.CreateParameter("MediaTextureUUID", land.MediaID)); |
1262 | parameters[20] = _Database.CreateParameter("MediaURL", land.MediaURL); | 1269 | parameters.Add(_Database.CreateParameter("MediaURL", land.MediaURL)); |
1263 | parameters[21] = _Database.CreateParameter("MusicURL", land.MusicURL); | 1270 | parameters.Add(_Database.CreateParameter("MusicURL", land.MusicURL)); |
1264 | parameters[22] = _Database.CreateParameter("PassHours", land.PassHours); | 1271 | parameters.Add(_Database.CreateParameter("PassHours", land.PassHours)); |
1265 | parameters[23] = _Database.CreateParameter("PassPrice", land.PassPrice); | 1272 | parameters.Add(_Database.CreateParameter("PassPrice", land.PassPrice)); |
1266 | parameters[24] = _Database.CreateParameter("SnapshotUUID", land.SnapshotID); | 1273 | parameters.Add(_Database.CreateParameter("SnapshotUUID", land.SnapshotID)); |
1267 | parameters[25] = _Database.CreateParameter("UserLocationX", land.UserLocation.X); | 1274 | parameters.Add(_Database.CreateParameter("UserLocationX", land.UserLocation.X)); |
1268 | parameters[26] = _Database.CreateParameter("UserLocationY", land.UserLocation.Y); | 1275 | parameters.Add(_Database.CreateParameter("UserLocationY", land.UserLocation.Y)); |
1269 | parameters[27] = _Database.CreateParameter("UserLocationZ", land.UserLocation.Z); | 1276 | parameters.Add(_Database.CreateParameter("UserLocationZ", land.UserLocation.Z)); |
1270 | parameters[28] = _Database.CreateParameter("UserLookAtX", land.UserLookAt.X); | 1277 | parameters.Add(_Database.CreateParameter("UserLookAtX", land.UserLookAt.X)); |
1271 | parameters[29] = _Database.CreateParameter("UserLookAtY", land.UserLookAt.Y); | 1278 | parameters.Add(_Database.CreateParameter("UserLookAtY", land.UserLookAt.Y)); |
1272 | parameters[30] = _Database.CreateParameter("UserLookAtZ", land.UserLookAt.Z); | 1279 | parameters.Add(_Database.CreateParameter("UserLookAtZ", land.UserLookAt.Z)); |
1273 | parameters[31] = _Database.CreateParameter("AuthBuyerID", land.AuthBuyerID); | 1280 | parameters.Add(_Database.CreateParameter("AuthBuyerID", land.AuthBuyerID)); |
1274 | parameters[32] = _Database.CreateParameter("OtherCleanTime", land.OtherCleanTime); | 1281 | parameters.Add(_Database.CreateParameter("OtherCleanTime", land.OtherCleanTime)); |
1275 | parameters[33] = _Database.CreateParameter("Dwell", land.Dwell); | 1282 | parameters.Add(_Database.CreateParameter("Dwell", land.Dwell)); |
1276 | 1283 | ||
1277 | return parameters; | 1284 | return parameters.ToArray(); |
1278 | } | 1285 | } |
1279 | 1286 | ||
1280 | /// <summary> | 1287 | /// <summary> |
@@ -1285,264 +1292,202 @@ VALUES | |||
1285 | /// <returns></returns> | 1292 | /// <returns></returns> |
1286 | private SqlParameter[] CreateLandAccessParameters(ParcelManager.ParcelAccessEntry parcelAccessEntry, UUID parcelID) | 1293 | private SqlParameter[] CreateLandAccessParameters(ParcelManager.ParcelAccessEntry parcelAccessEntry, UUID parcelID) |
1287 | { | 1294 | { |
1288 | SqlParameter[] parameters = new SqlParameter[3]; | 1295 | List<SqlParameter> parameters = new List<SqlParameter>(); |
1289 | 1296 | ||
1290 | parameters[0] = _Database.CreateParameter("LandUUID", parcelID); | 1297 | parameters.Add(_Database.CreateParameter("LandUUID", parcelID)); |
1291 | parameters[1] = _Database.CreateParameter("AccessUUID", parcelAccessEntry.AgentID); | 1298 | parameters.Add(_Database.CreateParameter("AccessUUID", parcelAccessEntry.AgentID)); |
1292 | parameters[2] = _Database.CreateParameter("Flags", parcelAccessEntry.Flags); | 1299 | parameters.Add(_Database.CreateParameter("Flags", parcelAccessEntry.Flags)); |
1293 | 1300 | ||
1294 | return parameters; | 1301 | return parameters.ToArray(); |
1295 | } | 1302 | } |
1296 | 1303 | ||
1297 | /// <summary> | 1304 | /// <summary> |
1298 | /// <summary> | 1305 | /// Creates the prim parameters for storing in DB. |
1299 | /// Fills/Updates the prim datarow. | ||
1300 | /// </summary> | 1306 | /// </summary> |
1301 | /// <param name="row">datarow.</param> | 1307 | /// <param name="prim">Basic data of SceneObjectpart prim.</param> |
1302 | /// <param name="prim">prim data.</param> | 1308 | /// <param name="sceneGroupID">The scenegroup ID.</param> |
1303 | /// <param name="sceneGroupID">scenegroup ID.</param> | 1309 | /// <param name="regionUUID">The region ID.</param> |
1304 | /// <param name="regionUUID">regionUUID.</param> | 1310 | /// <returns></returns> |
1305 | private static void fillPrimRow(DataRow row, SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID) | 1311 | private SqlParameter[] CreatePrimParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID) |
1306 | { | 1312 | { |
1307 | row["UUID"] = prim.UUID.ToString(); | 1313 | List<SqlParameter> parameters = new List<SqlParameter>(); |
1308 | row["RegionUUID"] = regionUUID.ToString(); | 1314 | |
1309 | row["CreationDate"] = prim.CreationDate; | 1315 | parameters.Add(_Database.CreateParameter("UUID", prim.UUID)); |
1310 | row["Name"] = prim.Name; | 1316 | parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID)); |
1311 | row["SceneGroupID"] = sceneGroupID.ToString(); | 1317 | //parameters.Add(_Database.CreateParameter("ParentID", (int)prim.ParentID)); |
1318 | parameters.Add(_Database.CreateParameter("CreationDate", prim.CreationDate)); | ||
1319 | parameters.Add(_Database.CreateParameter("Name", prim.Name)); | ||
1320 | parameters.Add(_Database.CreateParameter("SceneGroupID", sceneGroupID)); | ||
1312 | // the UUID of the root part for this SceneObjectGroup | 1321 | // the UUID of the root part for this SceneObjectGroup |
1313 | // various text fields | 1322 | // various text fields |
1314 | row["Text"] = prim.Text; | 1323 | parameters.Add(_Database.CreateParameter("Text", prim.Text)); |
1315 | row["ColorR"] = prim.Color.R; | 1324 | parameters.Add(_Database.CreateParameter("ColorR", prim.Color.R)); |
1316 | row["ColorG"] = prim.Color.G; | 1325 | parameters.Add(_Database.CreateParameter("ColorG", prim.Color.G)); |
1317 | row["ColorB"] = prim.Color.B; | 1326 | parameters.Add(_Database.CreateParameter("ColorB", prim.Color.B)); |
1318 | row["ColorA"] = prim.Color.A; | 1327 | parameters.Add(_Database.CreateParameter("ColorA", prim.Color.A)); |
1319 | row["Description"] = prim.Description; | 1328 | parameters.Add(_Database.CreateParameter("Description", prim.Description)); |
1320 | row["SitName"] = prim.SitName; | 1329 | parameters.Add(_Database.CreateParameter("SitName", prim.SitName)); |
1321 | row["TouchName"] = prim.TouchName; | 1330 | parameters.Add(_Database.CreateParameter("TouchName", prim.TouchName)); |
1322 | // permissions | 1331 | // permissions |
1323 | row["ObjectFlags"] = prim.ObjectFlags; | 1332 | parameters.Add(_Database.CreateParameter("ObjectFlags", prim.ObjectFlags)); |
1324 | row["CreatorID"] = prim.CreatorID.ToString(); | 1333 | parameters.Add(_Database.CreateParameter("CreatorID", prim.CreatorID)); |
1325 | row["OwnerID"] = prim.OwnerID.ToString(); | 1334 | parameters.Add(_Database.CreateParameter("OwnerID", prim.OwnerID)); |
1326 | row["GroupID"] = prim.GroupID.ToString(); | 1335 | parameters.Add(_Database.CreateParameter("GroupID", prim.GroupID)); |
1327 | row["LastOwnerID"] = prim.LastOwnerID.ToString(); | 1336 | parameters.Add(_Database.CreateParameter("LastOwnerID", prim.LastOwnerID)); |
1328 | row["OwnerMask"] = prim.OwnerMask; | 1337 | parameters.Add(_Database.CreateParameter("OwnerMask", prim.OwnerMask)); |
1329 | row["NextOwnerMask"] = prim.NextOwnerMask; | 1338 | parameters.Add(_Database.CreateParameter("NextOwnerMask", prim.NextOwnerMask)); |
1330 | row["GroupMask"] = prim.GroupMask; | 1339 | parameters.Add(_Database.CreateParameter("GroupMask", prim.GroupMask)); |
1331 | row["EveryoneMask"] = prim.EveryoneMask; | 1340 | parameters.Add(_Database.CreateParameter("EveryoneMask", prim.EveryoneMask)); |
1332 | row["BaseMask"] = prim.BaseMask; | 1341 | parameters.Add(_Database.CreateParameter("BaseMask", prim.BaseMask)); |
1333 | // vectors | 1342 | // vectors |
1334 | row["PositionX"] = prim.OffsetPosition.X; | 1343 | parameters.Add(_Database.CreateParameter("PositionX", prim.OffsetPosition.X)); |
1335 | row["PositionY"] = prim.OffsetPosition.Y; | 1344 | parameters.Add(_Database.CreateParameter("PositionY", prim.OffsetPosition.Y)); |
1336 | row["PositionZ"] = prim.OffsetPosition.Z; | 1345 | parameters.Add(_Database.CreateParameter("PositionZ", prim.OffsetPosition.Z)); |
1337 | row["GroupPositionX"] = prim.GroupPosition.X; | 1346 | parameters.Add(_Database.CreateParameter("GroupPositionX", prim.GroupPosition.X)); |
1338 | row["GroupPositionY"] = prim.GroupPosition.Y; | 1347 | parameters.Add(_Database.CreateParameter("GroupPositionY", prim.GroupPosition.Y)); |
1339 | row["GroupPositionZ"] = prim.GroupPosition.Z; | 1348 | parameters.Add(_Database.CreateParameter("GroupPositionZ", prim.GroupPosition.Z)); |
1340 | row["VelocityX"] = prim.Velocity.X; | 1349 | parameters.Add(_Database.CreateParameter("VelocityX", prim.Velocity.X)); |
1341 | row["VelocityY"] = prim.Velocity.Y; | 1350 | parameters.Add(_Database.CreateParameter("VelocityY", prim.Velocity.Y)); |
1342 | row["VelocityZ"] = prim.Velocity.Z; | 1351 | parameters.Add(_Database.CreateParameter("VelocityZ", prim.Velocity.Z)); |
1343 | row["AngularVelocityX"] = prim.AngularVelocity.X; | 1352 | parameters.Add(_Database.CreateParameter("AngularVelocityX", prim.AngularVelocity.X)); |
1344 | row["AngularVelocityY"] = prim.AngularVelocity.Y; | 1353 | parameters.Add(_Database.CreateParameter("AngularVelocityY", prim.AngularVelocity.Y)); |
1345 | row["AngularVelocityZ"] = prim.AngularVelocity.Z; | 1354 | parameters.Add(_Database.CreateParameter("AngularVelocityZ", prim.AngularVelocity.Z)); |
1346 | row["AccelerationX"] = prim.Acceleration.X; | 1355 | parameters.Add(_Database.CreateParameter("AccelerationX", prim.Acceleration.X)); |
1347 | row["AccelerationY"] = prim.Acceleration.Y; | 1356 | parameters.Add(_Database.CreateParameter("AccelerationY", prim.Acceleration.Y)); |
1348 | row["AccelerationZ"] = prim.Acceleration.Z; | 1357 | parameters.Add(_Database.CreateParameter("AccelerationZ", prim.Acceleration.Z)); |
1349 | // quaternions | 1358 | // quaternions |
1350 | row["RotationX"] = prim.RotationOffset.X; | 1359 | parameters.Add(_Database.CreateParameter("RotationX", prim.RotationOffset.X)); |
1351 | row["RotationY"] = prim.RotationOffset.Y; | 1360 | parameters.Add(_Database.CreateParameter("RotationY", prim.RotationOffset.Y)); |
1352 | row["RotationZ"] = prim.RotationOffset.Z; | 1361 | parameters.Add(_Database.CreateParameter("RotationZ", prim.RotationOffset.Z)); |
1353 | row["RotationW"] = prim.RotationOffset.W; | 1362 | parameters.Add(_Database.CreateParameter("RotationW", prim.RotationOffset.W)); |
1354 | 1363 | ||
1355 | // Sit target | 1364 | // Sit target |
1356 | Vector3 sitTargetPos = prim.SitTargetPositionLL; | 1365 | Vector3 sitTargetPos = prim.SitTargetPositionLL; |
1357 | row["SitTargetOffsetX"] = sitTargetPos.X; | 1366 | parameters.Add(_Database.CreateParameter("SitTargetOffsetX", sitTargetPos.X)); |
1358 | row["SitTargetOffsetY"] = sitTargetPos.Y; | 1367 | parameters.Add(_Database.CreateParameter("SitTargetOffsetY", sitTargetPos.Y)); |
1359 | row["SitTargetOffsetZ"] = sitTargetPos.Z; | 1368 | parameters.Add(_Database.CreateParameter("SitTargetOffsetZ", sitTargetPos.Z)); |
1360 | 1369 | ||
1361 | Quaternion sitTargetOrient = prim.SitTargetOrientationLL; | 1370 | Quaternion sitTargetOrient = prim.SitTargetOrientationLL; |
1362 | row["SitTargetOrientW"] = sitTargetOrient.W; | 1371 | parameters.Add(_Database.CreateParameter("SitTargetOrientW", sitTargetOrient.W)); |
1363 | row["SitTargetOrientX"] = sitTargetOrient.X; | 1372 | parameters.Add(_Database.CreateParameter("SitTargetOrientX", sitTargetOrient.X)); |
1364 | row["SitTargetOrientY"] = sitTargetOrient.Y; | 1373 | parameters.Add(_Database.CreateParameter("SitTargetOrientY", sitTargetOrient.Y)); |
1365 | row["SitTargetOrientZ"] = sitTargetOrient.Z; | 1374 | parameters.Add(_Database.CreateParameter("SitTargetOrientZ", sitTargetOrient.Z)); |
1366 | 1375 | ||
1367 | row["PayPrice"] = prim.PayPrice[0]; | 1376 | parameters.Add(_Database.CreateParameter("PayPrice", prim.PayPrice[0])); |
1368 | row["PayButton1"] = prim.PayPrice[1]; | 1377 | parameters.Add(_Database.CreateParameter("PayButton1", prim.PayPrice[1])); |
1369 | row["PayButton2"] = prim.PayPrice[2]; | 1378 | parameters.Add(_Database.CreateParameter("PayButton2", prim.PayPrice[2])); |
1370 | row["PayButton3"] = prim.PayPrice[3]; | 1379 | parameters.Add(_Database.CreateParameter("PayButton3", prim.PayPrice[3])); |
1371 | row["PayButton4"] = prim.PayPrice[4]; | 1380 | parameters.Add(_Database.CreateParameter("PayButton4", prim.PayPrice[4])); |
1372 | 1381 | ||
1373 | if ((prim.SoundFlags & 1) != 0) // Looped | 1382 | if ((prim.SoundFlags & 1) != 0) // Looped |
1374 | { | 1383 | { |
1375 | row["LoopedSound"] = prim.Sound.ToString(); | 1384 | parameters.Add(_Database.CreateParameter("LoopedSound", prim.Sound)); |
1376 | row["LoopedSoundGain"] = prim.SoundGain; | 1385 | parameters.Add(_Database.CreateParameter("LoopedSoundGain", prim.SoundGain)); |
1377 | } | 1386 | } |
1378 | else | 1387 | else |
1379 | { | 1388 | { |
1380 | row["LoopedSound"] = UUID.Zero; | 1389 | parameters.Add(_Database.CreateParameter("LoopedSound", UUID.Zero)); |
1381 | row["LoopedSoundGain"] = 0.0f; | 1390 | parameters.Add(_Database.CreateParameter("LoopedSoundGain", 0.0f)); |
1382 | } | 1391 | } |
1383 | 1392 | ||
1384 | row["TextureAnimation"] = prim.TextureAnimation; | 1393 | parameters.Add(_Database.CreateParameter("TextureAnimation", prim.TextureAnimation)); |
1385 | row["ParticleSystem"] = prim.ParticleSystem; | 1394 | parameters.Add(_Database.CreateParameter("ParticleSystem", prim.ParticleSystem)); |
1386 | 1395 | ||
1387 | row["OmegaX"] = prim.RotationalVelocity.X; | 1396 | parameters.Add(_Database.CreateParameter("OmegaX", prim.RotationalVelocity.X)); |
1388 | row["OmegaY"] = prim.RotationalVelocity.Y; | 1397 | parameters.Add(_Database.CreateParameter("OmegaY", prim.RotationalVelocity.Y)); |
1389 | row["OmegaZ"] = prim.RotationalVelocity.Z; | 1398 | parameters.Add(_Database.CreateParameter("OmegaZ", prim.RotationalVelocity.Z)); |
1390 | 1399 | ||
1391 | row["CameraEyeOffsetX"] = prim.GetCameraEyeOffset().X; | 1400 | parameters.Add(_Database.CreateParameter("CameraEyeOffsetX", prim.GetCameraEyeOffset().X)); |
1392 | row["CameraEyeOffsetY"] = prim.GetCameraEyeOffset().Y; | 1401 | parameters.Add(_Database.CreateParameter("CameraEyeOffsetY", prim.GetCameraEyeOffset().Y)); |
1393 | row["CameraEyeOffsetZ"] = prim.GetCameraEyeOffset().Z; | 1402 | parameters.Add(_Database.CreateParameter("CameraEyeOffsetZ", prim.GetCameraEyeOffset().Z)); |
1394 | 1403 | ||
1395 | row["CameraAtOffsetX"] = prim.GetCameraAtOffset().X; | 1404 | parameters.Add(_Database.CreateParameter("CameraAtOffsetX", prim.GetCameraAtOffset().X)); |
1396 | row["CameraAtOffsetY"] = prim.GetCameraAtOffset().Y; | 1405 | parameters.Add(_Database.CreateParameter("CameraAtOffsetY", prim.GetCameraAtOffset().Y)); |
1397 | row["CameraAtOffsetZ"] = prim.GetCameraAtOffset().Z; | 1406 | parameters.Add(_Database.CreateParameter("CameraAtOffsetZ", prim.GetCameraAtOffset().Z)); |
1398 | 1407 | ||
1399 | if (prim.GetForceMouselook()) | 1408 | if (prim.GetForceMouselook()) |
1400 | row["ForceMouselook"] = 1; | 1409 | parameters.Add(_Database.CreateParameter("ForceMouselook", 1)); |
1401 | else | 1410 | else |
1402 | row["ForceMouselook"] = 0; | 1411 | parameters.Add(_Database.CreateParameter("ForceMouselook", 0)); |
1403 | 1412 | ||
1404 | row["ScriptAccessPin"] = prim.ScriptAccessPin; | 1413 | parameters.Add(_Database.CreateParameter("ScriptAccessPin", prim.ScriptAccessPin)); |
1405 | 1414 | ||
1406 | if (prim.AllowedDrop) | 1415 | if (prim.AllowedDrop) |
1407 | row["AllowedDrop"] = 1; | 1416 | parameters.Add(_Database.CreateParameter("AllowedDrop", 1)); |
1408 | else | 1417 | else |
1409 | row["AllowedDrop"] = 0; | 1418 | parameters.Add(_Database.CreateParameter("AllowedDrop", 0)); |
1410 | 1419 | ||
1411 | if (prim.DIE_AT_EDGE) | 1420 | if (prim.DIE_AT_EDGE) |
1412 | row["DieAtEdge"] = 1; | 1421 | parameters.Add(_Database.CreateParameter("DieAtEdge", 1)); |
1413 | else | 1422 | else |
1414 | row["DieAtEdge"] = 0; | 1423 | parameters.Add(_Database.CreateParameter("DieAtEdge", 0)); |
1415 | 1424 | ||
1416 | row["SalePrice"] = prim.SalePrice; | 1425 | parameters.Add(_Database.CreateParameter("SalePrice", prim.SalePrice)); |
1417 | row["SaleType"] = Convert.ToInt16(prim.ObjectSaleType); | 1426 | parameters.Add(_Database.CreateParameter("SaleType", prim.ObjectSaleType)); |
1418 | 1427 | ||
1419 | byte clickAction = prim.ClickAction; | 1428 | byte clickAction = prim.ClickAction; |
1420 | row["ClickAction"] = clickAction; | 1429 | parameters.Add(_Database.CreateParameter("ClickAction", clickAction)); |
1430 | |||
1431 | parameters.Add(_Database.CreateParameter("Material", prim.Material)); | ||
1421 | 1432 | ||
1422 | row["Material"] = prim.Material; | 1433 | parameters.Add(_Database.CreateParameter("CollisionSound", prim.CollisionSound)); |
1434 | parameters.Add(_Database.CreateParameter("CollisionSoundVolume", prim.CollisionSoundVolume)); | ||
1435 | parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum)); | ||
1423 | 1436 | ||
1424 | row["CollisionSound"] = prim.CollisionSound.ToString(); | 1437 | return parameters.ToArray(); |
1425 | row["CollisionSoundVolume"] = prim.CollisionSoundVolume; | ||
1426 | } | 1438 | } |
1427 | 1439 | ||
1428 | /// <summary> | 1440 | /// <summary> |
1429 | /// Fills/Updates the shape datarow. | 1441 | /// Creates the primshape parameters for stroing in DB. |
1430 | /// </summary> | 1442 | /// </summary> |
1431 | /// <param name="row">datarow to fill/update.</param> | 1443 | /// <param name="prim">Basic data of SceneObjectpart prim.</param> |
1432 | /// <param name="prim">prim shape data.</param> | 1444 | /// <param name="sceneGroupID">The scene group ID.</param> |
1433 | private static void fillShapeRow(DataRow row, SceneObjectPart prim) | 1445 | /// <param name="regionUUID">The region UUID.</param> |
1446 | /// <returns></returns> | ||
1447 | private SqlParameter[] CreatePrimShapeParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID) | ||
1434 | { | 1448 | { |
1449 | List<SqlParameter> parameters = new List<SqlParameter>(); | ||
1450 | |||
1435 | PrimitiveBaseShape s = prim.Shape; | 1451 | PrimitiveBaseShape s = prim.Shape; |
1436 | row["UUID"] = prim.UUID.ToString(); | 1452 | parameters.Add(_Database.CreateParameter("UUID", prim.UUID)); |
1437 | // shape is an enum | 1453 | // shape is an enum |
1438 | row["Shape"] = 0; | 1454 | parameters.Add(_Database.CreateParameter("Shape", 0)); |
1439 | // vectors | 1455 | // vectors |
1440 | row["ScaleX"] = s.Scale.X; | 1456 | parameters.Add(_Database.CreateParameter("ScaleX", s.Scale.X)); |
1441 | row["ScaleY"] = s.Scale.Y; | 1457 | parameters.Add(_Database.CreateParameter("ScaleY", s.Scale.Y)); |
1442 | row["ScaleZ"] = s.Scale.Z; | 1458 | parameters.Add(_Database.CreateParameter("ScaleZ", s.Scale.Z)); |
1443 | // paths | 1459 | // paths |
1444 | row["PCode"] = s.PCode; | 1460 | parameters.Add(_Database.CreateParameter("PCode", s.PCode)); |
1445 | row["PathBegin"] = s.PathBegin; | 1461 | parameters.Add(_Database.CreateParameter("PathBegin", s.PathBegin)); |
1446 | row["PathEnd"] = s.PathEnd; | 1462 | parameters.Add(_Database.CreateParameter("PathEnd", s.PathEnd)); |
1447 | row["PathScaleX"] = s.PathScaleX; | 1463 | parameters.Add(_Database.CreateParameter("PathScaleX", s.PathScaleX)); |
1448 | row["PathScaleY"] = s.PathScaleY; | 1464 | parameters.Add(_Database.CreateParameter("PathScaleY", s.PathScaleY)); |
1449 | row["PathShearX"] = s.PathShearX; | 1465 | parameters.Add(_Database.CreateParameter("PathShearX", s.PathShearX)); |
1450 | row["PathShearY"] = s.PathShearY; | 1466 | parameters.Add(_Database.CreateParameter("PathShearY", s.PathShearY)); |
1451 | row["PathSkew"] = s.PathSkew; | 1467 | parameters.Add(_Database.CreateParameter("PathSkew", s.PathSkew)); |
1452 | row["PathCurve"] = s.PathCurve; | 1468 | parameters.Add(_Database.CreateParameter("PathCurve", s.PathCurve)); |
1453 | row["PathRadiusOffset"] = s.PathRadiusOffset; | 1469 | parameters.Add(_Database.CreateParameter("PathRadiusOffset", s.PathRadiusOffset)); |
1454 | row["PathRevolutions"] = s.PathRevolutions; | 1470 | parameters.Add(_Database.CreateParameter("PathRevolutions", s.PathRevolutions)); |
1455 | row["PathTaperX"] = s.PathTaperX; | 1471 | parameters.Add(_Database.CreateParameter("PathTaperX", s.PathTaperX)); |
1456 | row["PathTaperY"] = s.PathTaperY; | 1472 | parameters.Add(_Database.CreateParameter("PathTaperY", s.PathTaperY)); |
1457 | row["PathTwist"] = s.PathTwist; | 1473 | parameters.Add(_Database.CreateParameter("PathTwist", s.PathTwist)); |
1458 | row["PathTwistBegin"] = s.PathTwistBegin; | 1474 | parameters.Add(_Database.CreateParameter("PathTwistBegin", s.PathTwistBegin)); |
1459 | // profile | 1475 | // profile |
1460 | row["ProfileBegin"] = s.ProfileBegin; | 1476 | parameters.Add(_Database.CreateParameter("ProfileBegin", s.ProfileBegin)); |
1461 | row["ProfileEnd"] = s.ProfileEnd; | 1477 | parameters.Add(_Database.CreateParameter("ProfileEnd", s.ProfileEnd)); |
1462 | row["ProfileCurve"] = s.ProfileCurve; | 1478 | parameters.Add(_Database.CreateParameter("ProfileCurve", s.ProfileCurve)); |
1463 | row["ProfileHollow"] = s.ProfileHollow; | 1479 | parameters.Add(_Database.CreateParameter("ProfileHollow", s.ProfileHollow)); |
1464 | row["Texture"] = s.TextureEntry; | 1480 | parameters.Add(_Database.CreateParameter("Texture", s.TextureEntry)); |
1465 | row["ExtraParams"] = s.ExtraParams; | 1481 | parameters.Add(_Database.CreateParameter("ExtraParams", s.ExtraParams)); |
1466 | row["State"] = s.State; | 1482 | parameters.Add(_Database.CreateParameter("State", s.State)); |
1483 | |||
1484 | return parameters.ToArray(); | ||
1467 | } | 1485 | } |
1468 | 1486 | ||
1469 | #endregion | 1487 | |
1470 | 1488 | ||
1471 | /// <summary> | 1489 | #endregion |
1472 | /// Retrieves the prims data for region. | ||
1473 | /// </summary> | ||
1474 | /// <param name="regionUUID">The region UUID.</param> | ||
1475 | /// <param name="sceneGroupID">The scene group ID.</param> | ||
1476 | /// <param name="primID">The prim ID.</param> | ||
1477 | private void RetrievePrimsDataForRegion(UUID regionUUID, UUID sceneGroupID, string primID) | ||
1478 | { | ||
1479 | using (SqlConnection connection = _Database.DatabaseConnection()) | ||
1480 | { | ||
1481 | _PrimDataAdapter.SelectCommand.Connection = connection; | ||
1482 | _PrimDataAdapter.SelectCommand.Parameters["@RegionUUID"].Value = regionUUID.ToString(); | ||
1483 | _PrimDataAdapter.Fill(_PrimsDataSet, "prims"); | ||
1484 | |||
1485 | _Log.Debug("Prim row count: " + _PrimsDataSet.Tables["prims"].Rows.Count); | ||
1486 | |||
1487 | _ShapeDataAdapter.SelectCommand.Connection = connection; | ||
1488 | _ShapeDataAdapter.SelectCommand.Parameters["@RegionUUID"].Value = regionUUID.ToString(); | ||
1489 | _ShapeDataAdapter.Fill(_PrimsDataSet, "primshapes"); | ||
1490 | |||
1491 | _ItemsDataAdapter.SelectCommand.Connection = connection; | ||
1492 | _ItemsDataAdapter.SelectCommand.Parameters["@RegionUUID"].Value = regionUUID.ToString(); | ||
1493 | _ItemsDataAdapter.Fill(_PrimsDataSet, "primitems"); | ||
1494 | } | ||
1495 | } | ||
1496 | |||
1497 | /// <summary> | ||
1498 | /// Commits the dataset. | ||
1499 | /// </summary> | ||
1500 | private void CommitDataSet() | ||
1501 | { | ||
1502 | try | ||
1503 | { | ||
1504 | using (SqlConnection connection = _Database.DatabaseConnection()) | ||
1505 | { | ||
1506 | _PrimDataAdapter.InsertCommand.Connection = connection; | ||
1507 | _PrimDataAdapter.UpdateCommand.Connection = connection; | ||
1508 | _PrimDataAdapter.DeleteCommand.Connection = connection; | ||
1509 | |||
1510 | _ShapeDataAdapter.InsertCommand.Connection = connection; | ||
1511 | _ShapeDataAdapter.UpdateCommand.Connection = connection; | ||
1512 | _ShapeDataAdapter.DeleteCommand.Connection = connection; | ||
1513 | |||
1514 | _ItemsDataAdapter.InsertCommand.Connection = connection; | ||
1515 | _ItemsDataAdapter.UpdateCommand.Connection = connection; | ||
1516 | _ItemsDataAdapter.DeleteCommand.Connection = connection; | ||
1517 | |||
1518 | _PrimDataAdapter.Update(_PrimsDataSet.Tables["prims"]); | ||
1519 | _ShapeDataAdapter.Update(_PrimsDataSet.Tables["primshapes"]); | ||
1520 | _ItemsDataAdapter.Update(_PrimsDataSet.Tables["primitems"]); | ||
1521 | } | ||
1522 | } | ||
1523 | finally | ||
1524 | { | ||
1525 | _PrimsDataSet.AcceptChanges(); | ||
1526 | |||
1527 | _PrimsDataSet.Tables["prims"].Clear(); | ||
1528 | _PrimsDataSet.Tables["primshapes"].Clear(); | ||
1529 | _PrimsDataSet.Tables["primitems"].Clear(); | ||
1530 | |||
1531 | } | ||
1532 | } | ||
1533 | |||
1534 | /// <summary> | ||
1535 | /// Create commands for a dataadapter. | ||
1536 | /// </summary> | ||
1537 | /// <param name="dataAdapter">The data adapter.</param> | ||
1538 | private static void SetupCommands(SqlDataAdapter dataAdapter) | ||
1539 | { | ||
1540 | SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); | ||
1541 | 1490 | ||
1542 | dataAdapter.InsertCommand = commandBuilder.GetInsertCommand(true); | ||
1543 | dataAdapter.UpdateCommand = commandBuilder.GetUpdateCommand(true); | ||
1544 | dataAdapter.DeleteCommand = commandBuilder.GetDeleteCommand(true); | ||
1545 | } | ||
1546 | #endregion | 1491 | #endregion |
1547 | } | 1492 | } |
1548 | } | 1493 | } |
diff --git a/OpenSim/Data/MSSQL/Resources/012_RegionStore.sql b/OpenSim/Data/MSSQL/Resources/012_RegionStore.sql new file mode 100644 index 0000000..8edc823 --- /dev/null +++ b/OpenSim/Data/MSSQL/Resources/012_RegionStore.sql | |||
@@ -0,0 +1,5 @@ | |||
1 | BEGIN TRANSACTION | ||
2 | |||
3 | ALTER TABLE prims ADD LinkNumber integer not null default 0 | ||
4 | |||
5 | COMMIT | ||