This patch fixes mantis 105. Basically, it stops the index exception when

no root folder is found and it makes the user server wait longer for the
inventory server to do its work.

From Justin Casey (IBM)
This commit is contained in:
Sean Dague
2007-12-08 14:27:12 +00:00
parent 5e08911400
commit 0855066968
6 changed files with 75 additions and 47 deletions

View File

@@ -82,10 +82,12 @@ namespace OpenSim.Framework.Communications
/// <returns></returns>
public List<InventoryFolderBase> RequestFirstLevelFolders(LLUUID userID)
{
List<InventoryFolderBase> inventoryList = new List<InventoryFolderBase>();
List<InventoryFolderBase> inventoryList = new List<InventoryFolderBase>();
InventoryFolderBase rootFolder = null;
foreach (KeyValuePair<string, IInventoryData> plugin in m_plugins)
{
InventoryFolderBase rootFolder = plugin.Value.getUserRootFolder(userID);
rootFolder = plugin.Value.getUserRootFolder(userID);
if (rootFolder != null)
{
inventoryList = plugin.Value.getInventoryFolders(rootFolder.folderID);
@@ -93,6 +95,13 @@ namespace OpenSim.Framework.Communications
return inventoryList;
}
}
if (null == rootFolder)
{
MainLog.Instance.Warn(
"INVENTORY", "Could not find a root folder belonging to user with ID " + userID);
}
return inventoryList;
}
@@ -235,4 +244,4 @@ namespace OpenSim.Framework.Communications
public abstract void AddNewInventoryItem(LLUUID userID, InventoryItemBase item);
public abstract void DeleteInventoryItem(LLUUID userID, InventoryItemBase item);
}
}
}

View File

@@ -201,11 +201,7 @@ namespace OpenSim.Framework.Data.MSSQL
}
}
/// <summary>
/// Returns the users inventory root folder.
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
// see InventoryItemBase.getUserRootFolder
public InventoryFolderBase getUserRootFolder(LLUUID user)
{
try
@@ -224,8 +220,14 @@ namespace OpenSim.Framework.Data.MSSQL
items.Add(readInventoryFolder(reader));
InventoryFolderBase rootFolder = null;
// There should only ever be one root folder for a user. However, if there's more
// than one we'll simply use the first one rather than failing. It would be even
// nicer to print some message to this effect, but this feels like it's too low a
// to put such a message out, and it's too minor right now to spare the time to
// suitably refactor.
if (items.Count > 0) {
rootFolder = items[0]; //should only be one folder with parent set to zero (the root one).
rootFolder = items[0];
}
reader.Close();
@@ -694,4 +696,4 @@ namespace OpenSim.Framework.Data.MSSQL
}
}
}
}
}

View File

@@ -211,11 +211,7 @@ namespace OpenSim.Framework.Data.MySQL
}
}
/// <summary>
/// Returns the users inventory root folder.
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
// see InventoryItemBase.getUserRootFolder
public InventoryFolderBase getUserRootFolder(LLUUID user)
{
try
@@ -234,9 +230,19 @@ namespace OpenSim.Framework.Data.MySQL
List<InventoryFolderBase> items = new List<InventoryFolderBase>();
while (reader.Read())
items.Add(readInventoryFolder(reader));
InventoryFolderBase rootFolder = null;
// There should only ever be one root folder for a user. However, if there's more
// than one we'll simply use the first one rather than failing. It would be even
// nicer to print some message to this effect, but this feels like it's too low a
// to put such a message out, and it's too minor right now to spare the time to
// suitably refactor.
if (items.Count > 0)
{
rootFolder = items[0];
}
InventoryFolderBase rootFolder = items[0];
//should only be one folder with parent set to zero (the root one).
reader.Close();
result.Dispose();
@@ -252,7 +258,9 @@ namespace OpenSim.Framework.Data.MySQL
}
/// <summary>
/// Returns a list of folders in a users inventory contained within the specified folder
/// Return a list of folders in a users inventory contained within the specified folder.
/// This method is only used in tests - in normal operation the user always have one,
/// and only one, root folder.
/// </summary>
/// <param name="parentID">The folder to search</param>
/// <returns>A list of inventory folders</returns>
@@ -605,4 +613,4 @@ namespace OpenSim.Framework.Data.MySQL
}
}
}
}
}

View File

@@ -226,11 +226,7 @@ namespace OpenSim.Framework.Data.SQLite
return new List<InventoryFolderBase>();
}
/// <summary>
/// Returns the users inventory root folder.
/// </summary>
/// <param name="user">The UUID of the user who is having inventory being returned</param>
/// <returns>Root inventory folder</returns>
// see InventoryItemBase.getUserRootFolder
public InventoryFolderBase getUserRootFolder(LLUUID user)
{
List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
@@ -242,22 +238,15 @@ namespace OpenSim.Framework.Data.SQLite
folders.Add(buildFolder(row));
}
if (folders.Count == 1)
// There should only ever be one root folder for a user. However, if there's more
// than one we'll simply use the first one rather than failing. It would be even
// nicer to print some message to this effect, but this feels like it's too low a
// to put such a message out, and it's too minor right now to spare the time to
// suitably refactor.
if (folders.Count > 1)
{
//we found the root
//System.Console.WriteLine("found root inventory folder");
return folders[0];
}
else if (folders.Count > 1)
{
//err shouldn't be more than one root
//System.Console.WriteLine("found more than one root inventory folder");
}
else if (folders.Count == 0)
{
// no root?
//System.Console.WriteLine("couldn't find root inventory folder");
}
return null;
}
@@ -608,4 +597,4 @@ namespace OpenSim.Framework.Data.SQLite
return true;
}
}
}
}

View File

@@ -184,7 +184,7 @@ namespace OpenSim.Framework
/// Returns the users inventory root folder.
/// </summary>
/// <param name="user">The UUID of the user who is having inventory being returned</param>
/// <returns>Root inventory folder</returns>
/// <returns>Root inventory folder, null if no root inventory folder was found</returns>
InventoryFolderBase getUserRootFolder(LLUUID user);
/// <summary>
@@ -285,4 +285,4 @@ namespace OpenSim.Framework
[XmlElement(ElementName = "folder", IsNullable = true)] public SerializableFolder root;
}
}
}