From 46fe6e2f978ef03a20768e629e9cd2437c707bba Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Mon, 21 Jan 2008 16:42:53 +0000 Subject: * Scripts edited within a prim will now be persisted correctly * On restart the latest save will be restored rather than the very first dragged in scripts * Also add previously missed out database commits to separate prim inventory commit path (sigh) --- OpenSim/Framework/Data.SQLite/SQLiteRegionData.cs | 93 ++++++++--------------- 1 file changed, 32 insertions(+), 61 deletions(-) (limited to 'OpenSim/Framework/Data.SQLite') diff --git a/OpenSim/Framework/Data.SQLite/SQLiteRegionData.cs b/OpenSim/Framework/Data.SQLite/SQLiteRegionData.cs index 0035311..6553192 100644 --- a/OpenSim/Framework/Data.SQLite/SQLiteRegionData.cs +++ b/OpenSim/Framework/Data.SQLite/SQLiteRegionData.cs @@ -209,7 +209,6 @@ namespace OpenSim.Framework.Data.SQLite DataTable prims = ds.Tables["prims"]; DataTable shapes = ds.Tables["primshapes"]; - DataTable items = ds.Tables["primitems"]; string selectExp = "SceneGroupID = '" + Util.ToRawUuidString(obj) + "'"; lock (ds) @@ -227,14 +226,7 @@ namespace OpenSim.Framework.Data.SQLite if (persistPrimInventories) { - // Remove items rows - String sql = String.Format("primID = '{0}'", uuid); - DataRow[] itemRows = items.Select(sql); - - foreach (DataRow itemRow in itemRows) - { - itemRow.Delete(); - } + RemoveItems(uuid); } // Remove prim row @@ -246,6 +238,23 @@ namespace OpenSim.Framework.Data.SQLite } /// + /// Remove all persisted items of the given prim. + /// The caller must acquire the necessrary synchronization locks and commit or rollback changes. + /// + private void RemoveItems(LLUUID uuid) + { + DataTable items = ds.Tables["primitems"]; + + String sql = String.Format("primID = '{0}'", uuid); + DataRow[] itemRows = items.Select(sql); + + foreach (DataRow itemRow in itemRows) + { + itemRow.Delete(); + } + } + + /// /// Load persisted objects from region storage. /// /// @@ -1251,74 +1260,36 @@ namespace OpenSim.Framework.Data.SQLite } // see IRegionDatastore - public void StorePrimInventory(LLUUID primID, IDictionary items) + public void StorePrimInventory(LLUUID primID, ICollection items) { if (!persistPrimInventories) return; MainLog.Instance.Verbose("DATASTORE", "Entered StorePrimInventory with prim ID {0}", primID); + DataTable dbItems = ds.Tables["primitems"]; + + // For now, we're just going to crudely remove all the previous inventory items + // no matter whether they have changed or not, and replace them with the current set. lock (ds) { - // Find all existing inventory rows for this prim - DataTable dbItems = ds.Tables["primitems"]; - - String sql = String.Format("primID = '{0}'", primID); - DataRow[] dbItemRows = dbItems.Select(sql); - - // Build structures for manipulation purposes - IDictionary dbItemsToRemove = new Dictionary(); - ICollection itemsToAdd - = new List(); + RemoveItems(primID); - foreach (DataRow row in dbItemRows) + // repalce with current inventory details + foreach (TaskInventoryItem newItem in items) { - dbItemsToRemove.Add((String)row["itemID"], row); - } - - // Eliminate rows from the deletion set which already exist for this prim's inventory - // TODO Very temporary, need to take account of simple metadata changes soon - lock (items) - { - foreach (LLUUID itemId in items.Keys) - { - String rawItemId = itemId.ToString(); - - if (dbItemsToRemove.ContainsKey(rawItemId)) - { - dbItemsToRemove.Remove(rawItemId); - } - else - { - itemsToAdd.Add(items[itemId]); - } - } - } - - // Delete excess rows - foreach (DataRow row in dbItemsToRemove.Values) - { - MainLog.Instance.Verbose( - "DATASTORE", - "Removing item {0}, {1} from prim ID {2}", - row["name"], row["itemID"], row["primID"]); - - row.Delete(); - } - - // Insert items not already present - foreach (TaskInventoryItem newItem in itemsToAdd) - { - MainLog.Instance.Verbose( - "DATASTORE", - "Adding item {0}, {1} to prim ID {2}", - newItem.Name, newItem.ItemID, newItem.ParentPartID); +// MainLog.Instance.Verbose( +// "DATASTORE", +// "Adding item {0}, {1} to prim ID {2}", +// newItem.Name, newItem.ItemID, newItem.ParentPartID); DataRow newItemRow = dbItems.NewRow(); fillItemRow(newItemRow, newItem); dbItems.Rows.Add(newItemRow); } } + + Commit(); } /*********************************************************************** -- cgit v1.1