diff options
author | Justin Clark-Casey (justincc) | 2012-11-06 23:44:52 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-11-06 23:44:52 +0000 |
commit | bf469819a628dcb8df18d3e1fb6ff5ac77038f2d (patch) | |
tree | 5d646ead9aedb994554a9e41159401fb76eb8c08 | |
parent | Increment version number of a folder when an object it contains is deleted. (diff) | |
download | opensim-SC-bf469819a628dcb8df18d3e1fb6ff5ac77038f2d.zip opensim-SC-bf469819a628dcb8df18d3e1fb6ff5ac77038f2d.tar.gz opensim-SC-bf469819a628dcb8df18d3e1fb6ff5ac77038f2d.tar.bz2 opensim-SC-bf469819a628dcb8df18d3e1fb6ff5ac77038f2d.tar.xz |
Update folder version numbers when moving items and making the Delete(string[], string[]) call (not just string, string).
This is to stop viewer inventory cache version numbers becoming out of sync with grid stored numbers when viewer performs these actions.
If there are no problems with these changes, they will be propogated to SQLite (and MSSQL if that's simple enough).
May also need to do the same on folder store/create/delete and maybe propogate version increments up the folder hierarchy, but that requires investigation.
-rw-r--r-- | OpenSim/Data/MySQL/MySQLGenericTableHandler.cs | 6 | ||||
-rw-r--r-- | OpenSim/Data/MySQL/MySQLXInventoryData.cs | 51 |
2 files changed, 53 insertions, 4 deletions
diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs index da8e958..995c6a5 100644 --- a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs +++ b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs | |||
@@ -219,6 +219,8 @@ namespace OpenSim.Data.MySQL | |||
219 | 219 | ||
220 | public virtual bool Store(T row) | 220 | public virtual bool Store(T row) |
221 | { | 221 | { |
222 | // m_log.DebugFormat("[MYSQL GENERIC TABLE HANDLER]: Store(T row) invoked"); | ||
223 | |||
222 | using (MySqlCommand cmd = new MySqlCommand()) | 224 | using (MySqlCommand cmd = new MySqlCommand()) |
223 | { | 225 | { |
224 | string query = ""; | 226 | string query = ""; |
@@ -273,6 +275,10 @@ namespace OpenSim.Data.MySQL | |||
273 | 275 | ||
274 | public virtual bool Delete(string[] fields, string[] keys) | 276 | public virtual bool Delete(string[] fields, string[] keys) |
275 | { | 277 | { |
278 | // m_log.DebugFormat( | ||
279 | // "[MYSQL GENERIC TABLE HANDLER]: Delete(string[] fields, string[] keys) invoked with {0}:{1}", | ||
280 | // string.Join(",", fields), string.Join(",", keys)); | ||
281 | |||
276 | if (fields.Length != keys.Length) | 282 | if (fields.Length != keys.Length) |
277 | return false; | 283 | return false; |
278 | 284 | ||
diff --git a/OpenSim/Data/MySQL/MySQLXInventoryData.cs b/OpenSim/Data/MySQL/MySQLXInventoryData.cs index 189ee5e..cccc500 100644 --- a/OpenSim/Data/MySQL/MySQLXInventoryData.cs +++ b/OpenSim/Data/MySQL/MySQLXInventoryData.cs | |||
@@ -26,9 +26,10 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | ||
29 | using System.Data; | 30 | using System.Data; |
31 | using System.Linq; | ||
30 | using System.Reflection; | 32 | using System.Reflection; |
31 | using System.Collections.Generic; | ||
32 | using log4net; | 33 | using log4net; |
33 | using MySql.Data.MySqlClient; | 34 | using MySql.Data.MySqlClient; |
34 | using OpenMetaverse; | 35 | using OpenMetaverse; |
@@ -118,6 +119,8 @@ namespace OpenSim.Data.MySQL | |||
118 | 119 | ||
119 | public class MySqlItemHandler : MySQLGenericTableHandler<XInventoryItem> | 120 | public class MySqlItemHandler : MySQLGenericTableHandler<XInventoryItem> |
120 | { | 121 | { |
122 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
123 | |||
121 | public MySqlItemHandler(string c, string t, string m) : | 124 | public MySqlItemHandler(string c, string t, string m) : |
122 | base(c, t, m) | 125 | base(c, t, m) |
123 | { | 126 | { |
@@ -132,21 +135,53 @@ namespace OpenSim.Data.MySQL | |||
132 | if (!base.Delete(field, val)) | 135 | if (!base.Delete(field, val)) |
133 | return false; | 136 | return false; |
134 | 137 | ||
135 | IncrementFolderVersion(retrievedItems[0].parentFolderID); | 138 | // Don't increment folder version here since Delete(string, string) calls Delete(string[], string[]) |
139 | // IncrementFolderVersion(retrievedItems[0].parentFolderID); | ||
140 | |||
141 | return true; | ||
142 | } | ||
143 | |||
144 | public override bool Delete(string[] fields, string[] vals) | ||
145 | { | ||
146 | XInventoryItem[] retrievedItems = Get(fields, vals); | ||
147 | if (retrievedItems.Length == 0) | ||
148 | return false; | ||
149 | |||
150 | if (!base.Delete(fields, vals)) | ||
151 | return false; | ||
152 | |||
153 | HashSet<UUID> deletedItemFolderUUIDs = new HashSet<UUID>(); | ||
154 | |||
155 | Array.ForEach<XInventoryItem>(retrievedItems, i => deletedItemFolderUUIDs.Add(i.parentFolderID)); | ||
156 | |||
157 | foreach (UUID deletedItemFolderUUID in deletedItemFolderUUIDs) | ||
158 | IncrementFolderVersion(deletedItemFolderUUID); | ||
136 | 159 | ||
137 | return true; | 160 | return true; |
138 | } | 161 | } |
139 | 162 | ||
140 | public bool MoveItem(string id, string newParent) | 163 | public bool MoveItem(string id, string newParent) |
141 | { | 164 | { |
165 | XInventoryItem[] retrievedItems = Get(new string[] { "inventoryID" }, new string[] { id }); | ||
166 | if (retrievedItems.Length == 0) | ||
167 | return false; | ||
168 | |||
169 | UUID oldParent = retrievedItems[0].parentFolderID; | ||
170 | |||
142 | using (MySqlCommand cmd = new MySqlCommand()) | 171 | using (MySqlCommand cmd = new MySqlCommand()) |
143 | { | 172 | { |
144 | cmd.CommandText = String.Format("update {0} set parentFolderID = ?ParentFolderID where inventoryID = ?InventoryID", m_Realm); | 173 | cmd.CommandText = String.Format("update {0} set parentFolderID = ?ParentFolderID where inventoryID = ?InventoryID", m_Realm); |
145 | cmd.Parameters.AddWithValue("?ParentFolderID", newParent); | 174 | cmd.Parameters.AddWithValue("?ParentFolderID", newParent); |
146 | cmd.Parameters.AddWithValue("?InventoryID", id); | 175 | cmd.Parameters.AddWithValue("?InventoryID", id); |
147 | 176 | ||
148 | return ExecuteNonQuery(cmd) == 0 ? false : true; | 177 | if (ExecuteNonQuery(cmd) == 0) |
178 | return false; | ||
149 | } | 179 | } |
180 | |||
181 | IncrementFolderVersion(oldParent); | ||
182 | IncrementFolderVersion(newParent); | ||
183 | |||
184 | return true; | ||
150 | } | 185 | } |
151 | 186 | ||
152 | public XInventoryItem[] GetActiveGestures(UUID principalID) | 187 | public XInventoryItem[] GetActiveGestures(UUID principalID) |
@@ -204,6 +239,14 @@ namespace OpenSim.Data.MySQL | |||
204 | 239 | ||
205 | private bool IncrementFolderVersion(UUID folderID) | 240 | private bool IncrementFolderVersion(UUID folderID) |
206 | { | 241 | { |
242 | return IncrementFolderVersion(folderID.ToString()); | ||
243 | } | ||
244 | |||
245 | private bool IncrementFolderVersion(string folderID) | ||
246 | { | ||
247 | // m_log.DebugFormat("[MYSQL ITEM HANDLER]: Incrementing version on folder {0}", folderID); | ||
248 | // Util.PrintCallStack(); | ||
249 | |||
207 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) | 250 | using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) |
208 | { | 251 | { |
209 | dbcon.Open(); | 252 | dbcon.Open(); |
@@ -213,7 +256,7 @@ namespace OpenSim.Data.MySQL | |||
213 | cmd.Connection = dbcon; | 256 | cmd.Connection = dbcon; |
214 | 257 | ||
215 | cmd.CommandText = String.Format("update inventoryfolders set version=version+1 where folderID = ?folderID"); | 258 | cmd.CommandText = String.Format("update inventoryfolders set version=version+1 where folderID = ?folderID"); |
216 | cmd.Parameters.AddWithValue("?folderID", folderID.ToString()); | 259 | cmd.Parameters.AddWithValue("?folderID", folderID); |
217 | 260 | ||
218 | try | 261 | try |
219 | { | 262 | { |