Add a QueryItem method to the inventory subsystem. Currently implemented for

MySQL only, stubs for the others. This allows updating the cache with a single
item from the database.
0.6.5-rc1
Melanie Thielker 2009-03-21 17:46:58 +00:00
parent 2d387c25b8
commit 1121a214b9
11 changed files with 115 additions and 0 deletions

View File

@ -108,6 +108,12 @@ namespace OpenSim.Data
/// <param name="item"></param>
void deleteInventoryItem(UUID item);
/// <summary>
///
/// </summary>
/// <param name="item"></param>
InventoryItemBase queryInventoryItem(UUID item);
/// <summary>
/// Adds a new folder specified by folder
/// </summary>

View File

@ -530,6 +530,11 @@ namespace OpenSim.Data.MSSQL
}
}
public InventoryItemBase queryInventoryItem(UUID itemID)
{
return null;
}
/// <summary>
/// Returns all activated gesture-items in the inventory of the specified avatar.
/// </summary>

View File

@ -539,6 +539,11 @@ namespace OpenSim.Data.MySQL
}
}
public InventoryItemBase queryInventoryItem(UUID itemID)
{
return getInventoryItem(itemID);
}
/// <summary>
/// Creates a new inventory folder
/// </summary>

View File

@ -177,6 +177,11 @@ namespace OpenSim.Data.NHibernate
}
public InventoryItemBase queryInventoryItem(UUID itemID)
{
return null;
}
/// <summary>
/// Returns an inventory folder by its UUID
/// </summary>

View File

@ -618,6 +618,11 @@ namespace OpenSim.Data.SQLite
}
}
public InventoryItemBase queryInventoryItem(UUID itemID)
{
return null;
}
/// <summary>
/// Delete all items in the specified folder
/// </summary>

View File

@ -36,6 +36,7 @@ namespace OpenSim.Framework.Communications.Cache
internal delegate void AddItemDelegate(InventoryItemBase itemInfo);
internal delegate void UpdateItemDelegate(InventoryItemBase itemInfo);
internal delegate void DeleteItemDelegate(UUID itemID);
internal delegate void QueryItemDelegate(UUID itemID);
internal delegate void CreateFolderDelegate(string folderName, UUID folderID, ushort folderType, UUID parentID);
internal delegate void MoveFolderDelegate(UUID folderID, UUID parentID);
@ -767,6 +768,47 @@ namespace OpenSim.Framework.Communications.Cache
return RootFolder.FindFolderForType(type);
}
// Load additional items that other regions have put into the database
// The item will be added tot he local cache. Returns true if the item
// was found and can be sent to the client
//
public bool QueryItem(UUID itemID)
{
if (m_hasReceivedInventory)
{
InventoryItemBase item = RootFolder.FindItem(itemID);
if (item != null)
{
// Item is in local cache, just update client
//
return true;
}
InventoryItemBase itemInfo = m_commsManager.InventoryService.QueryItem(item);
if (itemInfo != null)
{
InventoryFolderImpl folder = RootFolder.FindFolder(itemInfo.Folder);
ItemReceive(itemInfo, folder);
return true;
}
return false;
}
else
{
AddRequest(
new InventoryRequest(
Delegate.CreateDelegate(typeof(QueryItemDelegate), this, "QueryItem"),
new object[] { itemID }));
return true;
}
return false;
}
}
/// <summary>

View File

@ -104,6 +104,14 @@ namespace OpenSim.Framework.Communications
/// <returns>true if the item was successfully deleted</returns>
bool DeleteItem(InventoryItemBase item);
/// <summary>
/// Query the server for an item that may have been added by
/// another region
/// </summary>
/// <param name="item"></param>
/// <returns>true if the item was found in local cache</returns>
InventoryItemBase QueryItem(InventoryItemBase item);
/// <summary>
/// Does the given user have an inventory structure?
/// </summary>

View File

@ -278,6 +278,20 @@ namespace OpenSim.Framework.Communications
return true;
}
public virtual InventoryItemBase QueryItem(InventoryItemBase item)
{
foreach (IInventoryDataPlugin plugin in m_plugins)
{
InventoryItemBase result = plugin.queryInventoryItem(item.ID);
if (result != null)
{
return result;
}
}
return null;
}
/// <summary>
/// Purge a folder of all items items and subfolders.
///

View File

@ -127,6 +127,10 @@ namespace OpenSim.Grid.InventoryServer
new RestDeserialiseSecureHandler<InventoryItemBase, bool>(
"POST", "/DeleteItem/", m_inventoryService.DeleteItem, m_inventoryService.CheckAuthSession));
m_httpServer.AddStreamHandler(
new RestDeserialiseSecureHandler<InventoryItemBase, InventoryItemBase>(
"POST", "/QueryItem/", m_inventoryService.QueryItem, m_inventoryService.CheckAuthSession));
// WARNING: Root folders no longer just delivers the root and immediate child folders (e.g
// system folders such as Objects, Textures), but it now returns the entire inventory skeleton.
// It would have been better to rename this request, but complexities in the BaseHttpServer

View File

@ -296,6 +296,22 @@ namespace OpenSim.Region.Communications.OGS1
return false;
}
public InventoryItemBase QueryItem(InventoryItemBase item)
{
try
{
return SynchronousRestObjectPoster.BeginPostObject<InventoryItemBase, InventoryItemBase>(
"POST", _inventoryServerUrl + "/QueryItem/", item);
}
catch (WebException e)
{
m_log.ErrorFormat("[OGS1 INVENTORY SERVICE]: Query inventory item operation failed, {0} {1}",
e.Source, e.Message);
}
return null;
}
public bool HasInventoryForUser(UUID userID)
{
return false;

View File

@ -115,6 +115,11 @@ namespace OpenSim.Tests.Common.Mock
public void updateInventoryItem(InventoryItemBase item) {}
public void deleteInventoryItem(UUID item) {}
public InventoryItemBase queryInventoryItem(UUID item)
{
return null;
}
public void addInventoryFolder(InventoryFolderBase folder)
{
m_folders[folder.ID] = folder;