diff options
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 13 | ||||
-rw-r--r-- | OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs | 92 |
2 files changed, 77 insertions, 28 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index c0cfe9f..051884d 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -60,14 +60,21 @@ namespace OpenSim.Region.Environment.Scenes | |||
60 | 60 | ||
61 | [XmlIgnore] public PhysicsActor PhysActor = null; | 61 | [XmlIgnore] public PhysicsActor PhysActor = null; |
62 | 62 | ||
63 | // Holds in memory prim inventory | 63 | /// <summary> |
64 | protected Dictionary<LLUUID, TaskInventoryItem> m_taskInventory | 64 | /// Holds in memory prim inventory |
65 | /// </summary> | ||
66 | protected IDictionary<LLUUID, TaskInventoryItem> m_taskInventory | ||
65 | = new Dictionary<LLUUID, TaskInventoryItem>(); | 67 | = new Dictionary<LLUUID, TaskInventoryItem>(); |
66 | 68 | ||
67 | [XmlIgnore] | 69 | [XmlIgnore] |
68 | public Dictionary<LLUUID, TaskInventoryItem> TaskInventory | 70 | /// <summary> |
71 | /// Not really ideal to allow this to be set, but currently expedient for inserting a prim inventory | ||
72 | /// from persistence. | ||
73 | /// </summary> | ||
74 | public IDictionary<LLUUID, TaskInventoryItem> TaskInventory | ||
69 | { | 75 | { |
70 | get { return m_taskInventory; } | 76 | get { return m_taskInventory; } |
77 | set { m_taskInventory = value; } | ||
71 | } | 78 | } |
72 | 79 | ||
73 | public LLUUID LastOwnerID; | 80 | public LLUUID LastOwnerID; |
diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs index 2de7e25..f9ab0c5 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs | |||
@@ -121,6 +121,7 @@ namespace OpenSim.DataStore.MonoSqlite | |||
121 | { | 121 | { |
122 | ds.Tables.Add(createItemsTable()); | 122 | ds.Tables.Add(createItemsTable()); |
123 | setupItemsCommands(itemsDa, conn); | 123 | setupItemsCommands(itemsDa, conn); |
124 | itemsDa.Fill(ds.Tables["primitems"]); | ||
124 | } | 125 | } |
125 | 126 | ||
126 | ds.Tables.Add(createTerrainTable()); | 127 | ds.Tables.Add(createTerrainTable()); |
@@ -265,12 +266,14 @@ namespace OpenSim.DataStore.MonoSqlite | |||
265 | { | 266 | { |
266 | try | 267 | try |
267 | { | 268 | { |
269 | SceneObjectPart prim = null; | ||
270 | |||
268 | string uuid = (string) primRow["UUID"]; | 271 | string uuid = (string) primRow["UUID"]; |
269 | string objID = (string) primRow["SceneGroupID"]; | 272 | string objID = (string) primRow["SceneGroupID"]; |
270 | if (uuid == objID) //is new SceneObjectGroup ? | 273 | if (uuid == objID) //is new SceneObjectGroup ? |
271 | { | 274 | { |
272 | SceneObjectGroup group = new SceneObjectGroup(); | 275 | SceneObjectGroup group = new SceneObjectGroup(); |
273 | SceneObjectPart prim = buildPrim(primRow); | 276 | prim = buildPrim(primRow); |
274 | DataRow shapeRow = shapes.Rows.Find(Util.ToRawUuidString(prim.UUID)); | 277 | DataRow shapeRow = shapes.Rows.Find(Util.ToRawUuidString(prim.UUID)); |
275 | if (shapeRow != null) | 278 | if (shapeRow != null) |
276 | { | 279 | { |
@@ -290,7 +293,7 @@ namespace OpenSim.DataStore.MonoSqlite | |||
290 | } | 293 | } |
291 | else | 294 | else |
292 | { | 295 | { |
293 | SceneObjectPart prim = buildPrim(primRow); | 296 | prim = buildPrim(primRow); |
294 | DataRow shapeRow = shapes.Rows.Find(Util.ToRawUuidString(prim.UUID)); | 297 | DataRow shapeRow = shapes.Rows.Find(Util.ToRawUuidString(prim.UUID)); |
295 | if (shapeRow != null) | 298 | if (shapeRow != null) |
296 | { | 299 | { |
@@ -305,8 +308,10 @@ namespace OpenSim.DataStore.MonoSqlite | |||
305 | createdObjects[new LLUUID(objID)].AddPart(prim); | 308 | createdObjects[new LLUUID(objID)].AddPart(prim); |
306 | } | 309 | } |
307 | 310 | ||
308 | // Add inventory restore code here, probably in a separate method. | 311 | if (persistPrimInventories) |
309 | 312 | { | |
313 | LoadItems(prim); | ||
314 | } | ||
310 | } | 315 | } |
311 | catch (Exception e) | 316 | catch (Exception e) |
312 | { | 317 | { |
@@ -326,25 +331,28 @@ namespace OpenSim.DataStore.MonoSqlite | |||
326 | /// Load in a prim's persisted inventory. | 331 | /// Load in a prim's persisted inventory. |
327 | /// </summary> | 332 | /// </summary> |
328 | /// <param name="prim"></param> | 333 | /// <param name="prim"></param> |
329 | /* | 334 | private void LoadItems(SceneObjectPart prim) |
330 | private void LoadPrimInventory(SceneObjectPart prim) | ||
331 | { | 335 | { |
332 | String sql = String.Format("primID = '{0}'", primID); | 336 | MainLog.Instance.Verbose("DATASTORE", "Loading inventory for {0}, {1}", prim.Name, prim.UUID); |
337 | |||
338 | DataTable dbItems = ds.Tables["primitems"]; | ||
339 | |||
340 | String sql = String.Format("primID = '{0}'", prim.UUID.ToString()); | ||
333 | DataRow[] dbItemRows = dbItems.Select(sql); | 341 | DataRow[] dbItemRows = dbItems.Select(sql); |
334 | 342 | ||
335 | DataRow shapeRow = shapes.Rows.Find(Util.ToRawUuidString(prim.UUID)); | 343 | IDictionary<LLUUID, SceneObjectPart.TaskInventoryItem> inventory |
336 | if (shapeRow != null) | 344 | = new Dictionary<LLUUID, SceneObjectPart.TaskInventoryItem>(); |
337 | { | 345 | |
338 | prim.Shape = buildShape(shapeRow); | 346 | foreach (DataRow row in dbItemRows) |
339 | } | 347 | { |
340 | else | 348 | SceneObjectPart.TaskInventoryItem item = buildItem(row); |
341 | { | 349 | inventory.Add(item.item_id, item); |
342 | MainLog.Instance.Notice( | 350 | |
343 | "No shape found for prim in storage, so setting default box shape"); | 351 | MainLog.Instance.Verbose("DATASTORE", "Restored item {0}, {1}", item.name, item.item_id); |
344 | prim.Shape = PrimitiveBaseShape.Default; | 352 | } |
345 | } | 353 | |
354 | prim.TaskInventory = inventory; | ||
346 | } | 355 | } |
347 | */ | ||
348 | 356 | ||
349 | public void StoreTerrain(double[,] ter, LLUUID regionID) | 357 | public void StoreTerrain(double[,] ter, LLUUID regionID) |
350 | { | 358 | { |
@@ -699,11 +707,11 @@ namespace OpenSim.DataStore.MonoSqlite | |||
699 | createCol(items, "lastOwnerID", typeof (String)); | 707 | createCol(items, "lastOwnerID", typeof (String)); |
700 | createCol(items, "groupID", typeof (String)); | 708 | createCol(items, "groupID", typeof (String)); |
701 | 709 | ||
702 | createCol(items, "nextPermissions", typeof (Int32)); | 710 | createCol(items, "nextPermissions", typeof (UInt32)); |
703 | createCol(items, "currentPermissions", typeof (Int32)); | 711 | createCol(items, "currentPermissions", typeof (UInt32)); |
704 | createCol(items, "basePermissions", typeof (Int32)); | 712 | createCol(items, "basePermissions", typeof (UInt32)); |
705 | createCol(items, "everyonePermissions", typeof (Int32)); | 713 | createCol(items, "everyonePermissions", typeof (UInt32)); |
706 | createCol(items, "groupPermissions", typeof (Int32)); | 714 | createCol(items, "groupPermissions", typeof (UInt32)); |
707 | 715 | ||
708 | items.PrimaryKey = new DataColumn[] {items.Columns["itemID"]}; | 716 | items.PrimaryKey = new DataColumn[] {items.Columns["itemID"]}; |
709 | 717 | ||
@@ -877,6 +885,40 @@ namespace OpenSim.DataStore.MonoSqlite | |||
877 | 885 | ||
878 | return prim; | 886 | return prim; |
879 | } | 887 | } |
888 | |||
889 | /// <summary> | ||
890 | /// Build a prim inventory item from the persisted data. | ||
891 | /// </summary> | ||
892 | /// <param name="row"></param> | ||
893 | /// <returns></returns> | ||
894 | private SceneObjectPart.TaskInventoryItem buildItem(DataRow row) | ||
895 | { | ||
896 | SceneObjectPart.TaskInventoryItem taskItem = new SceneObjectPart.TaskInventoryItem(); | ||
897 | |||
898 | taskItem.item_id = new LLUUID((String)row["itemID"]); | ||
899 | taskItem.ParentPartID = new LLUUID((String)row["primID"]); | ||
900 | taskItem.asset_id = new LLUUID((String)row["assetID"]); | ||
901 | taskItem.parent_id = new LLUUID((String)row["parentFolderID"]); | ||
902 | |||
903 | taskItem.inv_type = (String)row["invType"]; | ||
904 | taskItem.type = (String)row["assetType"]; | ||
905 | |||
906 | taskItem.name = (String)row["name"]; | ||
907 | taskItem.desc = (String)row["description"]; | ||
908 | taskItem.creation_date = Convert.ToUInt32(row["creationDate"]); | ||
909 | taskItem.creator_id = new LLUUID((String)row["creatorID"]); | ||
910 | taskItem.owner_id = new LLUUID((String)row["ownerID"]); | ||
911 | taskItem.last_owner_id = new LLUUID((String)row["lastOwnerID"]); | ||
912 | taskItem.group_id = new LLUUID((String)row["groupID"]); | ||
913 | |||
914 | taskItem.next_owner_mask = Convert.ToUInt32(row["nextPermissions"]); | ||
915 | taskItem.owner_mask = Convert.ToUInt32(row["currentPermissions"]); | ||
916 | taskItem.base_mask = Convert.ToUInt32(row["basePermissions"]); | ||
917 | taskItem.everyone_mask = Convert.ToUInt32(row["everyonePermissions"]); | ||
918 | taskItem.group_mask = Convert.ToUInt32(row["groupPermissions"]); | ||
919 | |||
920 | return taskItem; | ||
921 | } | ||
880 | 922 | ||
881 | private LandData buildLandData(DataRow row) | 923 | private LandData buildLandData(DataRow row) |
882 | { | 924 | { |
@@ -1223,7 +1265,7 @@ namespace OpenSim.DataStore.MonoSqlite | |||
1223 | /// <param name="primID"></param> | 1265 | /// <param name="primID"></param> |
1224 | /// <param name="items"></param> | 1266 | /// <param name="items"></param> |
1225 | /// <returns></returns> | 1267 | /// <returns></returns> |
1226 | private void addPrimInventory(LLUUID primID, Dictionary<LLUUID, SceneObjectPart.TaskInventoryItem> items) | 1268 | private void addPrimInventory(LLUUID primID, IDictionary<LLUUID, SceneObjectPart.TaskInventoryItem> items) |
1227 | { | 1269 | { |
1228 | MainLog.Instance.Verbose("DATASTORE", "Entered addPrimInventory with prim ID {0}", primID); | 1270 | MainLog.Instance.Verbose("DATASTORE", "Entered addPrimInventory with prim ID {0}", primID); |
1229 | 1271 | ||