aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Data.MySQL
diff options
context:
space:
mode:
authorJustin Clarke Casey2008-01-21 15:12:00 +0000
committerJustin Clarke Casey2008-01-21 15:12:00 +0000
commit7ca8e28a9a518e5ff646676713a7be46ba172ca3 (patch)
tree99bd4b5977b54a2120591629d7e47cb9d5ed7406 /OpenSim/Framework/Data.MySQL
parent* Make object persistence more granular by separating prim and prim inventory... (diff)
downloadopensim-SC_OLD-7ca8e28a9a518e5ff646676713a7be46ba172ca3.zip
opensim-SC_OLD-7ca8e28a9a518e5ff646676713a7be46ba172ca3.tar.gz
opensim-SC_OLD-7ca8e28a9a518e5ff646676713a7be46ba172ca3.tar.bz2
opensim-SC_OLD-7ca8e28a9a518e5ff646676713a7be46ba172ca3.tar.xz
Properly lock new separate database accesses
Diffstat (limited to 'OpenSim/Framework/Data.MySQL')
-rw-r--r--OpenSim/Framework/Data.MySQL/MySQLDataStore.cs121
1 files changed, 62 insertions, 59 deletions
diff --git a/OpenSim/Framework/Data.MySQL/MySQLDataStore.cs b/OpenSim/Framework/Data.MySQL/MySQLDataStore.cs
index 698569a..a752236 100644
--- a/OpenSim/Framework/Data.MySQL/MySQLDataStore.cs
+++ b/OpenSim/Framework/Data.MySQL/MySQLDataStore.cs
@@ -1203,72 +1203,75 @@ namespace OpenSim.Framework.Data.MySQL
1203 1203
1204 MainLog.Instance.Verbose("DATASTORE", "Entered StorePrimInventory with prim ID {0}", primID); 1204 MainLog.Instance.Verbose("DATASTORE", "Entered StorePrimInventory with prim ID {0}", primID);
1205 1205
1206 // Find all existing inventory rows for this prim 1206 lock (m_dataSet)
1207 DataTable dbItems = m_itemsTable; 1207 {
1208 1208 // Find all existing inventory rows for this prim
1209 String sql = String.Format("primID = '{0}'", primID); 1209 DataTable dbItems = m_itemsTable;
1210 DataRow[] dbItemRows = dbItems.Select(sql); 1210
1211 1211 String sql = String.Format("primID = '{0}'", primID);
1212 // Build structures for manipulation purposes 1212 DataRow[] dbItemRows = dbItems.Select(sql);
1213 IDictionary<String, DataRow> dbItemsToRemove = new Dictionary<String, DataRow>();
1214 ICollection<TaskInventoryItem> itemsToAdd = new List<TaskInventoryItem>();
1215
1216 foreach (DataRow row in dbItemRows)
1217 {
1218// MainLog.Instance.Verbose(
1219// "DATASTORE",
1220// "Found item {0}, {1} in prim id {2}",
1221// row["name"], row["itemID"], primID);
1222 1213
1223 dbItemsToRemove.Add((String)row["itemID"], row); 1214 // Build structures for manipulation purposes
1224 } 1215 IDictionary<String, DataRow> dbItemsToRemove = new Dictionary<String, DataRow>();
1225 1216 ICollection<TaskInventoryItem> itemsToAdd = new List<TaskInventoryItem>();
1226 // Eliminate rows from the deletion set which already exist for this prim's inventory 1217
1227 // TODO Very temporary, need to take account of simple metadata changes soon 1218 foreach (DataRow row in dbItemRows)
1228 lock (items)
1229 {
1230 foreach (LLUUID itemId in items.Keys)
1231 { 1219 {
1232 String rawItemId = itemId.ToString(); 1220 // MainLog.Instance.Verbose(
1221 // "DATASTORE",
1222 // "Found item {0}, {1} in prim id {2}",
1223 // row["name"], row["itemID"], primID);
1233 1224
1234 if (dbItemsToRemove.ContainsKey(rawItemId)) 1225 dbItemsToRemove.Add((String)row["itemID"], row);
1226 }
1227
1228 // Eliminate rows from the deletion set which already exist for this prim's inventory
1229 // TODO Very temporary, need to take account of simple metadata changes soon
1230 lock (items)
1231 {
1232 foreach (LLUUID itemId in items.Keys)
1235 { 1233 {
1236// MainLog.Instance.Verbose( 1234 String rawItemId = itemId.ToString();
1237// "DATASTORE",
1238// "Discarding item {0}, {1} from remove candidates for prim id {2}",
1239// items[itemId].Name, rawItemId, primID);
1240 1235
1241 dbItemsToRemove.Remove(rawItemId); 1236 if (dbItemsToRemove.ContainsKey(rawItemId))
1242 } 1237 {
1243 else 1238 // MainLog.Instance.Verbose(
1244 { 1239 // "DATASTORE",
1245 itemsToAdd.Add(items[itemId]); 1240 // "Discarding item {0}, {1} from remove candidates for prim id {2}",
1246 } 1241 // items[itemId].Name, rawItemId, primID);
1247 } 1242
1248 } 1243 dbItemsToRemove.Remove(rawItemId);
1249 1244 }
1250 // Delete excess rows 1245 else
1251 foreach (DataRow row in dbItemsToRemove.Values) 1246 {
1252 { 1247 itemsToAdd.Add(items[itemId]);
1253 MainLog.Instance.Verbose( 1248 }
1254 "DATASTORE", 1249 }
1255 "Removing item {0}, {1} from prim ID {2}", 1250 }
1256 row["name"], row["itemID"], row["primID"]);
1257 1251
1258 row.Delete(); 1252 // Delete excess rows
1259 } 1253 foreach (DataRow row in dbItemsToRemove.Values)
1260 1254 {
1261 // Insert items not already present 1255 MainLog.Instance.Verbose(
1262 foreach (TaskInventoryItem newItem in itemsToAdd) 1256 "DATASTORE",
1263 { 1257 "Removing item {0}, {1} from prim ID {2}",
1264 MainLog.Instance.Verbose( 1258 row["name"], row["itemID"], row["primID"]);
1265 "DATASTORE", 1259
1266 "Adding item {0}, {1} to prim ID {2}", 1260 row.Delete();
1267 newItem.Name, newItem.ItemID, newItem.ParentPartID); 1261 }
1268 1262
1269 DataRow newItemRow = dbItems.NewRow(); 1263 // Insert items not already present
1270 fillItemRow(newItemRow, newItem); 1264 foreach (TaskInventoryItem newItem in itemsToAdd)
1271 dbItems.Rows.Add(newItemRow); 1265 {
1266 MainLog.Instance.Verbose(
1267 "DATASTORE",
1268 "Adding item {0}, {1} to prim ID {2}",
1269 newItem.Name, newItem.ItemID, newItem.ParentPartID);
1270
1271 DataRow newItemRow = dbItems.NewRow();
1272 fillItemRow(newItemRow, newItem);
1273 dbItems.Rows.Add(newItemRow);
1274 }
1272 } 1275 }
1273 } 1276 }
1274 1277