From 1458fab82c4dab9901d81419e6b515f47ea7320f Mon Sep 17 00:00:00 2001 From: Kevin Houlihan Date: Mon, 12 Sep 2011 23:08:16 +0100 Subject: Reattaching a region was failing if the estate name had not changed (issue 5035). Using the RemoteAdmin API to close then recreate a region would fail if the estate name had not changed. If the estate name /was/ changed then the existing estate would be renamed rather than a new one being created. The problem really arose from a lack of distinction in the data storage layer between creating new estates and loading existing ones. --- OpenSim/Data/MySQL/MySQLEstateData.cs | 123 ++++++++++++++++++++++------------ 1 file changed, 79 insertions(+), 44 deletions(-) (limited to 'OpenSim/Data/MySQL') diff --git a/OpenSim/Data/MySQL/MySQLEstateData.cs b/OpenSim/Data/MySQL/MySQLEstateData.cs index 9dcf5e2..3d647ca 100644 --- a/OpenSim/Data/MySQL/MySQLEstateData.cs +++ b/OpenSim/Data/MySQL/MySQLEstateData.cs @@ -149,6 +149,22 @@ namespace OpenSim.Data.MySQL } } + public EstateSettings CreateNewEstate() + { + EstateSettings es = new EstateSettings(); + es.OnSave += StoreEstateSettings; + + DoCreate(es); + + LoadBanList(es); + + es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers"); + es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users"); + es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups"); + + return es; + } + private EstateSettings DoLoad(MySqlCommand cmd, UUID regionID, bool create) { EstateSettings es = new EstateSettings(); @@ -188,63 +204,65 @@ namespace OpenSim.Data.MySQL if (!found && create) { - // Migration case - List names = new List(FieldList); + DoCreate(es); + LinkRegion(regionID, (int)es.EstateID); + } + } - names.Remove("EstateID"); + LoadBanList(es); - string sql = "insert into estate_settings (" + String.Join(",", names.ToArray()) + ") values ( ?" + String.Join(", ?", names.ToArray()) + ")"; + es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers"); + es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users"); + es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups"); + return es; + } - using (MySqlCommand cmd2 = dbcon.CreateCommand()) - { - cmd2.CommandText = sql; - cmd2.Parameters.Clear(); + private void DoCreate(EstateSettings es) + { + // Migration case + List names = new List(FieldList); - foreach (string name in FieldList) - { - if (m_FieldMap[name].GetValue(es) is bool) - { - if ((bool)m_FieldMap[name].GetValue(es)) - cmd2.Parameters.AddWithValue("?" + name, "1"); - else - cmd2.Parameters.AddWithValue("?" + name, "0"); - } - else - { - cmd2.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString()); - } - } + names.Remove("EstateID"); - cmd2.ExecuteNonQuery(); + string sql = "insert into estate_settings (" + String.Join(",", names.ToArray()) + ") values ( ?" + String.Join(", ?", names.ToArray()) + ")"; - cmd2.CommandText = "select LAST_INSERT_ID() as id"; - cmd2.Parameters.Clear(); + using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) + { + dbcon.Open(); + using (MySqlCommand cmd2 = dbcon.CreateCommand()) + { + cmd2.CommandText = sql; + cmd2.Parameters.Clear(); - using (IDataReader r = cmd2.ExecuteReader()) + foreach (string name in FieldList) + { + if (m_FieldMap[name].GetValue(es) is bool) + { + if ((bool)m_FieldMap[name].GetValue(es)) + cmd2.Parameters.AddWithValue("?" + name, "1"); + else + cmd2.Parameters.AddWithValue("?" + name, "0"); + } + else { - r.Read(); - es.EstateID = Convert.ToUInt32(r["id"]); + cmd2.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString()); } + } - cmd2.CommandText = "insert into estate_map values (?RegionID, ?EstateID)"; - cmd2.Parameters.AddWithValue("?RegionID", regionID.ToString()); - cmd2.Parameters.AddWithValue("?EstateID", es.EstateID.ToString()); + cmd2.ExecuteNonQuery(); - // This will throw on dupe key - try { cmd2.ExecuteNonQuery(); } - catch (Exception) { } + cmd2.CommandText = "select LAST_INSERT_ID() as id"; + cmd2.Parameters.Clear(); - es.Save(); + using (IDataReader r = cmd2.ExecuteReader()) + { + r.Read(); + es.EstateID = Convert.ToUInt32(r["id"]); } + + es.Save(); } } - - LoadBanList(es); - - es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers"); - es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users"); - es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups"); - return es; } public void StoreEstateSettings(EstateSettings es) @@ -477,7 +495,6 @@ namespace OpenSim.Data.MySQL } } - dbcon.Close(); } @@ -507,7 +524,6 @@ namespace OpenSim.Data.MySQL } } - dbcon.Close(); } @@ -519,16 +535,34 @@ namespace OpenSim.Data.MySQL using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); + MySqlTransaction transaction = dbcon.BeginTransaction(); try { + // Delete any existing association of this region with an estate. + using (MySqlCommand cmd = dbcon.CreateCommand()) + { + cmd.Transaction = transaction; + cmd.CommandText = "delete from estate_map where RegionID = ?RegionID"; + cmd.Parameters.AddWithValue("?RegionID", regionID); + + cmd.ExecuteNonQuery(); + } + using (MySqlCommand cmd = dbcon.CreateCommand()) { + cmd.Transaction = transaction; cmd.CommandText = "insert into estate_map values (?RegionID, ?EstateID)"; cmd.Parameters.AddWithValue("?RegionID", regionID); cmd.Parameters.AddWithValue("?EstateID", estateID); int ret = cmd.ExecuteNonQuery(); + + if (ret != 0) + transaction.Commit(); + else + transaction.Rollback(); + dbcon.Close(); return (ret != 0); @@ -537,6 +571,7 @@ namespace OpenSim.Data.MySQL catch (MySqlException ex) { m_log.Error("[REGION DB]: LinkRegion failed: " + ex.Message); + transaction.Rollback(); } dbcon.Close(); -- cgit v1.1