From 1121a214b9258487dae0d84dad1a0b495d2f80bd Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sat, 21 Mar 2009 17:46:58 +0000 Subject: 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. --- .../Communications/Cache/CachedUserInfo.cs | 42 ++++++++++++++++++++++ .../Framework/Communications/IInventoryServices.cs | 8 +++++ .../Communications/InventoryServiceBase.cs | 14 ++++++++ 3 files changed, 64 insertions(+) (limited to 'OpenSim/Framework/Communications') diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs index c5bbd6a..57c3ece 100644 --- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs +++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs @@ -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; + } + } /// diff --git a/OpenSim/Framework/Communications/IInventoryServices.cs b/OpenSim/Framework/Communications/IInventoryServices.cs index aead3be..fc9d8af 100644 --- a/OpenSim/Framework/Communications/IInventoryServices.cs +++ b/OpenSim/Framework/Communications/IInventoryServices.cs @@ -105,6 +105,14 @@ namespace OpenSim.Framework.Communications bool DeleteItem(InventoryItemBase item); /// + /// Query the server for an item that may have been added by + /// another region + /// + /// + /// true if the item was found in local cache + InventoryItemBase QueryItem(InventoryItemBase item); + + /// /// Does the given user have an inventory structure? /// /// diff --git a/OpenSim/Framework/Communications/InventoryServiceBase.cs b/OpenSim/Framework/Communications/InventoryServiceBase.cs index 8068080..cad7989 100644 --- a/OpenSim/Framework/Communications/InventoryServiceBase.cs +++ b/OpenSim/Framework/Communications/InventoryServiceBase.cs @@ -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; + } + /// /// Purge a folder of all items items and subfolders. /// -- cgit v1.1