diff --git a/OpenSim/Data/MSSQL/MSSQLRegionData.cs b/OpenSim/Data/MSSQL/MSSQLRegionData.cs index 5ab29ff5a9..2388207ee2 100644 --- a/OpenSim/Data/MSSQL/MSSQLRegionData.cs +++ b/OpenSim/Data/MSSQL/MSSQLRegionData.cs @@ -79,7 +79,6 @@ namespace OpenSim.Data.MSSQL //Migration settings _Database.CheckMigration(_migrationStore); - } /// @@ -124,10 +123,9 @@ namespace OpenSim.Data.MSSQL else sceneObjectPart.Shape = BuildShape(reader); - sceneObjectPart.FolderID = sceneObjectPart.UUID; // A relic from when we - // we thought prims contained - // folder objects. In - // reality, prim == folder + // A relic from when we we thought that prims contained folder objects. In + // reality, prim == folder + sceneObjectPart.FolderID = sceneObjectPart.UUID; sceneObjectParts.Add(sceneObjectPart); UUID groupID = new UUID(reader["SceneGroupID"].ToString()); @@ -138,6 +136,20 @@ namespace OpenSim.Data.MSSQL sceneObjectGroups.Add(grp); lastGroupID = groupID; + + // There sometimes exist OpenSim bugs that 'orphan groups' so that none of the prims are + // recorded as the root prim (for which the UUID must equal the persisted group UUID). In + // this case, force the UUID to be the same as the group UUID so that at least these can be + // deleted (we need to change the UUID so that any other prims in the linkset can also be + // deleted). + if (sceneObjectPart.UUID != groupID && groupID != UUID.Zero) + { + _Log.WarnFormat( + "[REGION DB]: Found root prim {0} {1} at {2} where group was actually {3}. Forcing UUID to group UUID", + sceneObjectPart.Name, sceneObjectPart.UUID, sceneObjectPart.GroupPosition, groupID); + + sceneObjectPart.UUID = groupID; + } grp = new SceneObjectGroup(sceneObjectPart); } @@ -162,10 +174,9 @@ namespace OpenSim.Data.MSSQL //Load the inventory off all sceneobjects within the region LoadItems(sceneObjectParts); - _Log.DebugFormat("[DATABASE] Loaded {0} objects using {1} prims", sceneObjectGroups.Count, sceneObjectParts.Count); + _Log.DebugFormat("[REGION DB]: Loaded {0} objects using {1} prims", sceneObjectGroups.Count, sceneObjectParts.Count); return sceneObjectGroups; - } /// @@ -216,7 +227,7 @@ namespace OpenSim.Data.MSSQL /// public void StoreObject(SceneObjectGroup obj, UUID regionUUID) { - _Log.InfoFormat("[REGION DB]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Children.Count); + _Log.InfoFormat("[MSSQL]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Children.Count); using (SqlConnection conn = _Database.DatabaseConnection()) { @@ -404,7 +415,7 @@ ELSE /// regionUUID (is this used anyway public void RemoveObject(UUID objectID, UUID regionUUID) { - _Log.InfoFormat("[REGION DB]: Removing obj: {0} from region: {1}", objectID, regionUUID); + _Log.InfoFormat("[MSSQL]: Removing obj: {0} from region: {1}", objectID, regionUUID); //Remove from prims and primsitem table string sqlPrims = string.Format("DELETE FROM PRIMS WHERE SceneGroupID = '{0}'", objectID); @@ -1482,9 +1493,7 @@ VALUES return parameters.ToArray(); } - - - + #endregion #endregion diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index a06dbb36c0..e1ddb54717 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs @@ -455,6 +455,20 @@ namespace OpenSim.Data.MySQL objects.Add(grp); lastGroupID = groupID; + + // There sometimes exist OpenSim bugs that 'orphan groups' so that none of the prims are + // recorded as the root prim (for which the UUID must equal the persisted group UUID). In + // this case, force the UUID to be the same as the group UUID so that at least these can be + // deleted (we need to change the UUID so that any other prims in the linkset can also be + // deleted). + if (prim.UUID != groupID && groupID != UUID.Zero) + { + m_log.WarnFormat( + "[REGION DB]: Found root prim {0} {1} at {2} where group was actually {3}. Forcing UUID to group UUID", + prim.Name, prim.UUID, prim.GroupPosition, groupID); + + prim.UUID = groupID; + } grp = new SceneObjectGroup(prim); } @@ -484,7 +498,7 @@ namespace OpenSim.Data.MySQL foreach (SceneObjectPart part in prims) LoadItems(part); - m_log.DebugFormat("[DATABASE] Loaded {0} objects using {1} prims", objects.Count, prims.Count); + m_log.DebugFormat("[REGION DB]: Loaded {0} objects using {1} prims", objects.Count, prims.Count); return objects; } diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs index fce98a224b..306dcb8fa7 100644 --- a/OpenSim/Data/SQLite/SQLiteRegionData.cs +++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs @@ -419,6 +419,7 @@ namespace OpenSim.Data.SQLite string uuid = (string) primRow["UUID"]; string objID = (string) primRow["SceneGroupID"]; + if (uuid == objID) //is new SceneObjectGroup ? { SceneObjectGroup group = new SceneObjectGroup(); @@ -451,6 +452,7 @@ namespace OpenSim.Data.SQLite } } } + // Now fill the groups with part data foreach (DataRow primRow in primsForRegion) { @@ -470,10 +472,11 @@ namespace OpenSim.Data.SQLite } else { - m_log.Info( + m_log.Warn( "[REGION DB]: No shape found for prim in storage, so setting default box shape"); prim.Shape = PrimitiveBaseShape.Default; } + createdObjects[new UUID(objID)].AddPart(prim); LoadItems(prim); }