fix an issue I found where primshapes weren't every being removed

because of a logic error.
attempt to speed up deletes a bit by batching up all the primitem
deletes and primshape deletes into single delete statements.  This
removes the lock/release/lock/release/lock/release for loop.
0.6.1-post-fixes
Sean Dague 2008-12-08 16:29:48 +00:00
parent b4a725ed87
commit a260466147
1 changed files with 82 additions and 9 deletions

View File

@ -300,17 +300,19 @@ namespace OpenSim.Data.MySQL
reader.Close(); reader.Close();
} }
foreach (UUID uuid in uuids) // delete the main prims
RemoveItems(uuid);
cmd.CommandText = "delete from prims where SceneGroupID= ?UUID"; cmd.CommandText = "delete from prims where SceneGroupID= ?UUID";
ExecuteNonQuery(cmd);
cmd.CommandText = "delete from primshapes where UUID = ?UUID";
ExecuteNonQuery(cmd); ExecuteNonQuery(cmd);
cmd.Dispose(); cmd.Dispose();
// there is no way this should be < 1 unless there is
// a very corrupt database, but in that case be extra
// safe anyway.
if (uuids.Count > 0)
{
RemoveShapes(uuids);
RemoveItems(uuids);
}
} }
} }
@ -335,6 +337,77 @@ namespace OpenSim.Data.MySQL
} }
} }
/// <summary>
/// Remove all persisted shapes for a list of prims
/// The caller must acquire the necessrary synchronization locks
/// </summary>
/// <param name="uuids">the list of UUIDs</param>
private void RemoveShapes(List<UUID> uuids)
{
lock (m_Connection)
{
string sql = "delete from primshapes where ";
MySqlCommand cmd = m_Connection.CreateCommand();
for (int i = 0; i < uuids.Count; i++)
{
if ((i + 1) == uuids.Count)
{// end of the list
sql += "(UUID = ?UUID" + i + ")";
}
else
{
sql += "(UUID = ?UUID" + i + ") or ";
}
}
cmd.CommandText = sql;
for (int i = 0; i < uuids.Count; i++)
{
cmd.Parameters.AddWithValue("UUID" + i, uuids[i].ToString());
}
ExecuteNonQuery(cmd);
cmd.Dispose();
}
}
/// <summary>
/// Remove all persisted items for a list of prims
/// The caller must acquire the necessrary synchronization locks
/// </summary>
/// <param name="uuids">the list of UUIDs</param>
private void RemoveItems(List<UUID> uuids)
{
lock (m_Connection)
{
string sql = "delete from primitems where ";
MySqlCommand cmd = m_Connection.CreateCommand();
for (int i = 0; i < uuids.Count; i++)
{
if ((i + 1) == uuids.Count)
{// end of the list
sql += "(PrimID = ?PrimID" + i + ")";
}
else
{
sql += "(PrimID = ?PrimID" + i + ") or ";
}
}
cmd.CommandText = sql;
for (int i = 0; i < uuids.Count; i++)
{
cmd.Parameters.AddWithValue("PrimID" + i, uuids[i].ToString());
}
ExecuteNonQuery(cmd);
cmd.Dispose();
}
}
public List<SceneObjectGroup> LoadObjects(UUID regionUUID) public List<SceneObjectGroup> LoadObjects(UUID regionUUID)
{ {
UUID lastGroupID = UUID.Zero; UUID lastGroupID = UUID.Zero;