diff options
-rw-r--r-- | OpenSim/Framework/Communications/InventoryServiceBase.cs | 15 | ||||
-rw-r--r-- | OpenSim/Framework/Data.MSSQL/MSSQLInventoryData.cs | 16 | ||||
-rw-r--r-- | OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs | 26 | ||||
-rw-r--r-- | OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs | 27 | ||||
-rw-r--r-- | OpenSim/Framework/InventoryItemBase.cs | 4 | ||||
-rw-r--r-- | OpenSim/Grid/UserServer/UserLoginService.cs | 34 |
6 files changed, 75 insertions, 47 deletions
diff --git a/OpenSim/Framework/Communications/InventoryServiceBase.cs b/OpenSim/Framework/Communications/InventoryServiceBase.cs index 091d829..e86eaac 100644 --- a/OpenSim/Framework/Communications/InventoryServiceBase.cs +++ b/OpenSim/Framework/Communications/InventoryServiceBase.cs | |||
@@ -82,10 +82,12 @@ namespace OpenSim.Framework.Communications | |||
82 | /// <returns></returns> | 82 | /// <returns></returns> |
83 | public List<InventoryFolderBase> RequestFirstLevelFolders(LLUUID userID) | 83 | public List<InventoryFolderBase> RequestFirstLevelFolders(LLUUID userID) |
84 | { | 84 | { |
85 | List<InventoryFolderBase> inventoryList = new List<InventoryFolderBase>(); | 85 | List<InventoryFolderBase> inventoryList = new List<InventoryFolderBase>(); |
86 | InventoryFolderBase rootFolder = null; | ||
87 | |||
86 | foreach (KeyValuePair<string, IInventoryData> plugin in m_plugins) | 88 | foreach (KeyValuePair<string, IInventoryData> plugin in m_plugins) |
87 | { | 89 | { |
88 | InventoryFolderBase rootFolder = plugin.Value.getUserRootFolder(userID); | 90 | rootFolder = plugin.Value.getUserRootFolder(userID); |
89 | if (rootFolder != null) | 91 | if (rootFolder != null) |
90 | { | 92 | { |
91 | inventoryList = plugin.Value.getInventoryFolders(rootFolder.folderID); | 93 | inventoryList = plugin.Value.getInventoryFolders(rootFolder.folderID); |
@@ -93,6 +95,13 @@ namespace OpenSim.Framework.Communications | |||
93 | return inventoryList; | 95 | return inventoryList; |
94 | } | 96 | } |
95 | } | 97 | } |
98 | |||
99 | if (null == rootFolder) | ||
100 | { | ||
101 | MainLog.Instance.Warn( | ||
102 | "INVENTORY", "Could not find a root folder belonging to user with ID " + userID); | ||
103 | } | ||
104 | |||
96 | return inventoryList; | 105 | return inventoryList; |
97 | } | 106 | } |
98 | 107 | ||
@@ -235,4 +244,4 @@ namespace OpenSim.Framework.Communications | |||
235 | public abstract void AddNewInventoryItem(LLUUID userID, InventoryItemBase item); | 244 | public abstract void AddNewInventoryItem(LLUUID userID, InventoryItemBase item); |
236 | public abstract void DeleteInventoryItem(LLUUID userID, InventoryItemBase item); | 245 | public abstract void DeleteInventoryItem(LLUUID userID, InventoryItemBase item); |
237 | } | 246 | } |
238 | } \ No newline at end of file | 247 | } |
diff --git a/OpenSim/Framework/Data.MSSQL/MSSQLInventoryData.cs b/OpenSim/Framework/Data.MSSQL/MSSQLInventoryData.cs index 364e0f2..cd0470c 100644 --- a/OpenSim/Framework/Data.MSSQL/MSSQLInventoryData.cs +++ b/OpenSim/Framework/Data.MSSQL/MSSQLInventoryData.cs | |||
@@ -201,11 +201,7 @@ namespace OpenSim.Framework.Data.MSSQL | |||
201 | } | 201 | } |
202 | } | 202 | } |
203 | 203 | ||
204 | /// <summary> | 204 | // see InventoryItemBase.getUserRootFolder |
205 | /// Returns the users inventory root folder. | ||
206 | /// </summary> | ||
207 | /// <param name="user"></param> | ||
208 | /// <returns></returns> | ||
209 | public InventoryFolderBase getUserRootFolder(LLUUID user) | 205 | public InventoryFolderBase getUserRootFolder(LLUUID user) |
210 | { | 206 | { |
211 | try | 207 | try |
@@ -224,8 +220,14 @@ namespace OpenSim.Framework.Data.MSSQL | |||
224 | items.Add(readInventoryFolder(reader)); | 220 | items.Add(readInventoryFolder(reader)); |
225 | 221 | ||
226 | InventoryFolderBase rootFolder = null; | 222 | InventoryFolderBase rootFolder = null; |
223 | |||
224 | // There should only ever be one root folder for a user. However, if there's more | ||
225 | // than one we'll simply use the first one rather than failing. It would be even | ||
226 | // nicer to print some message to this effect, but this feels like it's too low a | ||
227 | // to put such a message out, and it's too minor right now to spare the time to | ||
228 | // suitably refactor. | ||
227 | if (items.Count > 0) { | 229 | if (items.Count > 0) { |
228 | rootFolder = items[0]; //should only be one folder with parent set to zero (the root one). | 230 | rootFolder = items[0]; |
229 | } | 231 | } |
230 | 232 | ||
231 | reader.Close(); | 233 | reader.Close(); |
@@ -694,4 +696,4 @@ namespace OpenSim.Framework.Data.MSSQL | |||
694 | } | 696 | } |
695 | } | 697 | } |
696 | } | 698 | } |
697 | } \ No newline at end of file | 699 | } |
diff --git a/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs b/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs index 7c86e2c..4020cc1 100644 --- a/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs +++ b/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs | |||
@@ -211,11 +211,7 @@ namespace OpenSim.Framework.Data.MySQL | |||
211 | } | 211 | } |
212 | } | 212 | } |
213 | 213 | ||
214 | /// <summary> | 214 | // see InventoryItemBase.getUserRootFolder |
215 | /// Returns the users inventory root folder. | ||
216 | /// </summary> | ||
217 | /// <param name="user"></param> | ||
218 | /// <returns></returns> | ||
219 | public InventoryFolderBase getUserRootFolder(LLUUID user) | 215 | public InventoryFolderBase getUserRootFolder(LLUUID user) |
220 | { | 216 | { |
221 | try | 217 | try |
@@ -234,9 +230,19 @@ namespace OpenSim.Framework.Data.MySQL | |||
234 | List<InventoryFolderBase> items = new List<InventoryFolderBase>(); | 230 | List<InventoryFolderBase> items = new List<InventoryFolderBase>(); |
235 | while (reader.Read()) | 231 | while (reader.Read()) |
236 | items.Add(readInventoryFolder(reader)); | 232 | items.Add(readInventoryFolder(reader)); |
233 | |||
234 | InventoryFolderBase rootFolder = null; | ||
235 | |||
236 | // There should only ever be one root folder for a user. However, if there's more | ||
237 | // than one we'll simply use the first one rather than failing. It would be even | ||
238 | // nicer to print some message to this effect, but this feels like it's too low a | ||
239 | // to put such a message out, and it's too minor right now to spare the time to | ||
240 | // suitably refactor. | ||
241 | if (items.Count > 0) | ||
242 | { | ||
243 | rootFolder = items[0]; | ||
244 | } | ||
237 | 245 | ||
238 | InventoryFolderBase rootFolder = items[0]; | ||
239 | //should only be one folder with parent set to zero (the root one). | ||
240 | reader.Close(); | 246 | reader.Close(); |
241 | result.Dispose(); | 247 | result.Dispose(); |
242 | 248 | ||
@@ -252,7 +258,9 @@ namespace OpenSim.Framework.Data.MySQL | |||
252 | } | 258 | } |
253 | 259 | ||
254 | /// <summary> | 260 | /// <summary> |
255 | /// Returns a list of folders in a users inventory contained within the specified folder | 261 | /// Return a list of folders in a users inventory contained within the specified folder. |
262 | /// This method is only used in tests - in normal operation the user always have one, | ||
263 | /// and only one, root folder. | ||
256 | /// </summary> | 264 | /// </summary> |
257 | /// <param name="parentID">The folder to search</param> | 265 | /// <param name="parentID">The folder to search</param> |
258 | /// <returns>A list of inventory folders</returns> | 266 | /// <returns>A list of inventory folders</returns> |
@@ -605,4 +613,4 @@ namespace OpenSim.Framework.Data.MySQL | |||
605 | } | 613 | } |
606 | } | 614 | } |
607 | } | 615 | } |
608 | } \ No newline at end of file | 616 | } |
diff --git a/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs b/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs index 5e95878..94084a6 100644 --- a/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs +++ b/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs | |||
@@ -226,11 +226,7 @@ namespace OpenSim.Framework.Data.SQLite | |||
226 | return new List<InventoryFolderBase>(); | 226 | return new List<InventoryFolderBase>(); |
227 | } | 227 | } |
228 | 228 | ||
229 | /// <summary> | 229 | // see InventoryItemBase.getUserRootFolder |
230 | /// Returns the users inventory root folder. | ||
231 | /// </summary> | ||
232 | /// <param name="user">The UUID of the user who is having inventory being returned</param> | ||
233 | /// <returns>Root inventory folder</returns> | ||
234 | public InventoryFolderBase getUserRootFolder(LLUUID user) | 230 | public InventoryFolderBase getUserRootFolder(LLUUID user) |
235 | { | 231 | { |
236 | List<InventoryFolderBase> folders = new List<InventoryFolderBase>(); | 232 | List<InventoryFolderBase> folders = new List<InventoryFolderBase>(); |
@@ -242,22 +238,15 @@ namespace OpenSim.Framework.Data.SQLite | |||
242 | folders.Add(buildFolder(row)); | 238 | folders.Add(buildFolder(row)); |
243 | } | 239 | } |
244 | 240 | ||
245 | if (folders.Count == 1) | 241 | // There should only ever be one root folder for a user. However, if there's more |
242 | // than one we'll simply use the first one rather than failing. It would be even | ||
243 | // nicer to print some message to this effect, but this feels like it's too low a | ||
244 | // to put such a message out, and it's too minor right now to spare the time to | ||
245 | // suitably refactor. | ||
246 | if (folders.Count > 1) | ||
246 | { | 247 | { |
247 | //we found the root | ||
248 | //System.Console.WriteLine("found root inventory folder"); | ||
249 | return folders[0]; | 248 | return folders[0]; |
250 | } | 249 | } |
251 | else if (folders.Count > 1) | ||
252 | { | ||
253 | //err shouldn't be more than one root | ||
254 | //System.Console.WriteLine("found more than one root inventory folder"); | ||
255 | } | ||
256 | else if (folders.Count == 0) | ||
257 | { | ||
258 | // no root? | ||
259 | //System.Console.WriteLine("couldn't find root inventory folder"); | ||
260 | } | ||
261 | 250 | ||
262 | return null; | 251 | return null; |
263 | } | 252 | } |
@@ -608,4 +597,4 @@ namespace OpenSim.Framework.Data.SQLite | |||
608 | return true; | 597 | return true; |
609 | } | 598 | } |
610 | } | 599 | } |
611 | } \ No newline at end of file | 600 | } |
diff --git a/OpenSim/Framework/InventoryItemBase.cs b/OpenSim/Framework/InventoryItemBase.cs index 0ee30bb..b9a11c9 100644 --- a/OpenSim/Framework/InventoryItemBase.cs +++ b/OpenSim/Framework/InventoryItemBase.cs | |||
@@ -184,7 +184,7 @@ namespace OpenSim.Framework | |||
184 | /// Returns the users inventory root folder. | 184 | /// Returns the users inventory root folder. |
185 | /// </summary> | 185 | /// </summary> |
186 | /// <param name="user">The UUID of the user who is having inventory being returned</param> | 186 | /// <param name="user">The UUID of the user who is having inventory being returned</param> |
187 | /// <returns>Root inventory folder</returns> | 187 | /// <returns>Root inventory folder, null if no root inventory folder was found</returns> |
188 | InventoryFolderBase getUserRootFolder(LLUUID user); | 188 | InventoryFolderBase getUserRootFolder(LLUUID user); |
189 | 189 | ||
190 | /// <summary> | 190 | /// <summary> |
@@ -285,4 +285,4 @@ namespace OpenSim.Framework | |||
285 | 285 | ||
286 | [XmlElement(ElementName = "folder", IsNullable = true)] public SerializableFolder root; | 286 | [XmlElement(ElementName = "folder", IsNullable = true)] public SerializableFolder root; |
287 | } | 287 | } |
288 | } \ No newline at end of file | 288 | } |
diff --git a/OpenSim/Grid/UserServer/UserLoginService.cs b/OpenSim/Grid/UserServer/UserLoginService.cs index f404cce..fa5eac5 100644 --- a/OpenSim/Grid/UserServer/UserLoginService.cs +++ b/OpenSim/Grid/UserServer/UserLoginService.cs | |||
@@ -197,15 +197,32 @@ namespace OpenSim.Grid.UserServer | |||
197 | 197 | ||
198 | protected override InventoryData CreateInventoryData(LLUUID userID) | 198 | protected override InventoryData CreateInventoryData(LLUUID userID) |
199 | { | 199 | { |
200 | List<InventoryFolderBase> folders = SynchronousRestObjectPoster.BeginPostObject<LLUUID, List<InventoryFolderBase>>("POST", m_config.InventoryUrl + "RootFolders/", userID); | 200 | List<InventoryFolderBase> folders |
201 | if (folders ==null | folders.Count == 0) | 201 | = SynchronousRestObjectPoster.BeginPostObject<LLUUID, List<InventoryFolderBase>>( |
202 | "POST", m_config.InventoryUrl + "RootFolders/", userID); | ||
203 | |||
204 | // In theory, the user will only ever be missing a root folder in situations where a grid | ||
205 | // which didn't previously run a grid wide inventory server is being transitioned to one | ||
206 | // which does. | ||
207 | if (null == folders | folders.Count == 0) | ||
202 | { | 208 | { |
203 | RestObjectPoster.BeginPostObject<LLUUID>(m_config.InventoryUrl + "CreateInventory/", userID); | 209 | MainLog.Instance.Warn( |
204 | Thread.Sleep(1000); | 210 | "LOGIN", |
205 | folders = SynchronousRestObjectPoster.BeginPostObject<LLUUID, List<InventoryFolderBase>>("POST", m_config.InventoryUrl + "RootFolders/", userID); | 211 | "A root inventory folder for user ID " + userID + " was not found. A new set" |
212 | + " of empty inventory folders is being created."); | ||
213 | |||
214 | RestObjectPoster.BeginPostObject<LLUUID>( | ||
215 | m_config.InventoryUrl + "CreateInventory/", userID); | ||
216 | |||
217 | // A big delay should be okay here since the recreation of the user's root folders should | ||
218 | // only ever happen once. We need to sleep to let the inventory server do its work - | ||
219 | // previously 1000ms has been found to be too short. | ||
220 | Thread.Sleep(10000); | ||
221 | folders = SynchronousRestObjectPoster.BeginPostObject<LLUUID, List<InventoryFolderBase>>( | ||
222 | "POST", m_config.InventoryUrl + "RootFolders/", userID); | ||
206 | } | 223 | } |
207 | 224 | ||
208 | if(folders.Count >0) | 225 | if (folders.Count > 0) |
209 | { | 226 | { |
210 | LLUUID rootID = LLUUID.Zero; | 227 | LLUUID rootID = LLUUID.Zero; |
211 | ArrayList AgentInventoryArray = new ArrayList(); | 228 | ArrayList AgentInventoryArray = new ArrayList(); |
@@ -228,6 +245,9 @@ namespace OpenSim.Grid.UserServer | |||
228 | } | 245 | } |
229 | else | 246 | else |
230 | { | 247 | { |
248 | MainLog.Instance.Warn("LOGIN", "The root inventory folder could still not be retrieved" + | ||
249 | " for user ID " + userID); | ||
250 | |||
231 | AgentInventory userInventory = new AgentInventory(); | 251 | AgentInventory userInventory = new AgentInventory(); |
232 | userInventory.CreateRootFolder(userID, false); | 252 | userInventory.CreateRootFolder(userID, false); |
233 | 253 | ||
@@ -248,4 +268,4 @@ namespace OpenSim.Grid.UserServer | |||
248 | } | 268 | } |
249 | } | 269 | } |
250 | } | 270 | } |
251 | } \ No newline at end of file | 271 | } |