aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs135
1 files changed, 129 insertions, 6 deletions
diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs
index b5a231e..5dac92f 100644
--- a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs
+++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs
@@ -52,6 +52,7 @@ namespace OpenSim.DataStore.MonoSqlite
52 private DataSet ds; 52 private DataSet ds;
53 private SqliteDataAdapter primDa; 53 private SqliteDataAdapter primDa;
54 private SqliteDataAdapter shapeDa; 54 private SqliteDataAdapter shapeDa;
55 private SqliteDataAdapter itemsDa;
55 private SqliteDataAdapter terrainDa; 56 private SqliteDataAdapter terrainDa;
56 private SqliteDataAdapter landDa; 57 private SqliteDataAdapter landDa;
57 private SqliteDataAdapter landAccessListDa; 58 private SqliteDataAdapter landAccessListDa;
@@ -88,8 +89,11 @@ namespace OpenSim.DataStore.MonoSqlite
88 89
89 SqliteCommand shapeSelectCmd = new SqliteCommand(shapeSelect, conn); 90 SqliteCommand shapeSelectCmd = new SqliteCommand(shapeSelect, conn);
90 shapeDa = new SqliteDataAdapter(shapeSelectCmd); 91 shapeDa = new SqliteDataAdapter(shapeSelectCmd);
91 // SqliteCommandBuilder shapeCb = new SqliteCommandBuilder(shapeDa); 92 // SqliteCommandBuilder shapeCb = new SqliteCommandBuilder(shapeDa);
92 93
94 SqliteCommand itemsSelectCmd = new SqliteCommand(itemsSelect, conn);
95 itemsDa = new SqliteDataAdapter(itemsSelectCmd);
96
93 SqliteCommand terrainSelectCmd = new SqliteCommand(terrainSelect, conn); 97 SqliteCommand terrainSelectCmd = new SqliteCommand(terrainSelect, conn);
94 terrainDa = new SqliteDataAdapter(terrainSelectCmd); 98 terrainDa = new SqliteDataAdapter(terrainSelectCmd);
95 99
@@ -112,6 +116,12 @@ namespace OpenSim.DataStore.MonoSqlite
112 116
113 ds.Tables.Add(createShapeTable()); 117 ds.Tables.Add(createShapeTable());
114 setupShapeCommands(shapeDa, conn); 118 setupShapeCommands(shapeDa, conn);
119
120 if (persistPrimInventories)
121 {
122 ds.Tables.Add(createItemsTable());
123 setupItemsCommands(itemsDa, conn);
124 }
115 125
116 ds.Tables.Add(createTerrainTable()); 126 ds.Tables.Add(createTerrainTable());
117 setupTerrainCommands(terrainDa, conn); 127 setupTerrainCommands(terrainDa, conn);
@@ -489,6 +499,7 @@ namespace OpenSim.DataStore.MonoSqlite
489 { 499 {
490 primDa.Update(ds, "prims"); 500 primDa.Update(ds, "prims");
491 shapeDa.Update(ds, "primshapes"); 501 shapeDa.Update(ds, "primshapes");
502 itemsDa.Update(ds, "primitems");
492 terrainDa.Update(ds, "terrain"); 503 terrainDa.Update(ds, "terrain");
493 landDa.Update(ds, "land"); 504 landDa.Update(ds, "land");
494 landAccessListDa.Update(ds, "landaccesslist"); 505 landAccessListDa.Update(ds, "landaccesslist");
@@ -635,11 +646,13 @@ namespace OpenSim.DataStore.MonoSqlite
635 { 646 {
636 DataTable items = new DataTable("primitems"); 647 DataTable items = new DataTable("primitems");
637 648
638 createCol(items, "UUID", typeof (String)); 649 createCol(items, "itemID", typeof (String));
639 createCol(items, "invType", typeof (Int32)); 650 createCol(items, "primID", typeof (String));
640 createCol(items, "assetID", typeof (String)); 651 createCol(items, "assetID", typeof (String));
641 createCol(items, "assetType", typeof (Int32));
642 createCol(items, "parentFolderID", typeof (String)); 652 createCol(items, "parentFolderID", typeof (String));
653
654 createCol(items, "invType", typeof (String));
655 createCol(items, "assetType", typeof (String));
643 656
644 createCol(items, "name", typeof (String)); 657 createCol(items, "name", typeof (String));
645 createCol(items, "description", typeof (String)); 658 createCol(items, "description", typeof (String));
@@ -656,7 +669,7 @@ namespace OpenSim.DataStore.MonoSqlite
656 createCol(items, "everyonePermissions", typeof (Int32)); 669 createCol(items, "everyonePermissions", typeof (Int32));
657 createCol(items, "groupPermissions", typeof (Int32)); 670 createCol(items, "groupPermissions", typeof (Int32));
658 671
659 items.PrimaryKey = new DataColumn[] {items.Columns["UUID"]}; 672 items.PrimaryKey = new DataColumn[] {items.Columns["itemID"]};
660 673
661 return items; 674 return items;
662 } 675 }
@@ -971,6 +984,30 @@ namespace OpenSim.DataStore.MonoSqlite
971 row["SitTargetOrientY"] = sitTargetOrient.Y; 984 row["SitTargetOrientY"] = sitTargetOrient.Y;
972 row["SitTargetOrientZ"] = sitTargetOrient.Z; 985 row["SitTargetOrientZ"] = sitTargetOrient.Z;
973 } 986 }
987
988 private void fillItemRow(DataRow row, SceneObjectPart.TaskInventoryItem taskItem)
989 {
990 row["itemID"] = taskItem.item_id;
991 row["primID"] = taskItem.ParentPartID;
992 row["assetID"] = taskItem.asset_id;
993 row["parentFolderID"] = taskItem.parent_id;
994
995 row["invType"] = taskItem.inv_type;
996 row["assetType"] = taskItem.type;
997
998 row["name"] = taskItem.name;
999 row["description"] = taskItem.desc;
1000 row["creationDate"] = taskItem.creation_date;
1001 row["creatorID"] = taskItem.creator_id;
1002 row["ownerID"] = taskItem.owner_id;
1003 row["lastOwnerID"] = taskItem.last_owner_id;
1004 row["groupID"] = taskItem.group_id;
1005 row["nextPermissions"] = taskItem.next_owner_mask;
1006 row["currentPermissions"] = taskItem.owner_mask;
1007 row["basePermissions"] = taskItem.base_mask;
1008 row["everyonePermissions"] = taskItem.everyone_mask;
1009 row["groupPermissions"] = taskItem.group_mask;
1010 }
974 1011
975 private void fillLandRow(DataRow row, LandData land, LLUUID regionUUID) 1012 private void fillLandRow(DataRow row, LandData land, LLUUID regionUUID)
976 { 1013 {
@@ -1137,6 +1174,78 @@ namespace OpenSim.DataStore.MonoSqlite
1137 { 1174 {
1138 fillShapeRow(shapeRow, prim); 1175 fillShapeRow(shapeRow, prim);
1139 } 1176 }
1177
1178 if (persistPrimInventories)
1179 {
1180 addPrimInventory(prim.UUID, prim.TaskInventory);
1181 }
1182 }
1183
1184 /// <summary>
1185 /// Persist prim inventory. Deletes, updates and inserts rows.
1186 /// </summary>
1187 /// <param name="primID"></param>
1188 /// <param name="items"></param>
1189 /// <returns></returns>
1190 private void addPrimInventory(LLUUID primID, Dictionary<LLUUID, SceneObjectPart.TaskInventoryItem> items)
1191 {
1192 MainLog.Instance.Verbose("DATASTORE", "Entered addPrimInventory with prim ID {0}", primID);
1193
1194 // Find all existing inventory rows for this prim
1195 DataTable dbItems = ds.Tables["primitems"];
1196
1197 String sql = String.Format("primID = '{0}'", primID);
1198 DataRow[] dbItemRows = dbItems.Select(sql);
1199
1200 // Build structures for manipulation purposes
1201 IDictionary<String, DataRow> dbItemsToRemove = new Dictionary<String, DataRow>();
1202 ICollection<SceneObjectPart.TaskInventoryItem> itemsToAdd
1203 = new List<SceneObjectPart.TaskInventoryItem>();
1204
1205 foreach (DataRow row in dbItemRows)
1206 {
1207 dbItemsToRemove.Add((String)row["itemID"], row);
1208 }
1209
1210 // Eliminate rows from the deletion set which already exist for this prim's inventory
1211 // TODO Very temporary, need to take account of simple metadata changes soon
1212 foreach (LLUUID itemId in items.Keys)
1213 {
1214 String rawItemId = itemId.ToString();
1215
1216 if (dbItemsToRemove.ContainsKey(rawItemId))
1217 {
1218 dbItemsToRemove.Remove(rawItemId);
1219 }
1220 else
1221 {
1222 itemsToAdd.Add(items[itemId]);
1223 }
1224 }
1225
1226 // Delete excess rows
1227 foreach (DataRow row in dbItemsToRemove.Values)
1228 {
1229 MainLog.Instance.Verbose(
1230 "DATASTORE",
1231 "Removing item {0}, {1} from prim ID {2}",
1232 row["name"], row["itemID"], row["primID"]);
1233
1234 row.Delete();
1235 }
1236
1237 // Insert items not already present
1238 foreach (SceneObjectPart.TaskInventoryItem newItem in itemsToAdd)
1239 {
1240 MainLog.Instance.Verbose(
1241 "DATASTORE",
1242 "Adding item {0}, {1} to prim ID {1}",
1243 newItem.name, newItem.item_id, newItem.ParentPartID);
1244
1245 DataRow newItemRow = dbItems.NewRow();
1246 fillItemRow(newItemRow, newItem);
1247 dbItems.Rows.Add(newItemRow);
1248 }
1140 } 1249 }
1141 1250
1142 /*********************************************************************** 1251 /***********************************************************************
@@ -1263,6 +1372,20 @@ namespace OpenSim.DataStore.MonoSqlite
1263 param.SourceVersion = DataRowVersion.Current; 1372 param.SourceVersion = DataRowVersion.Current;
1264 return param; 1373 return param;
1265 } 1374 }
1375
1376 private void setupItemsCommands(SqliteDataAdapter da, SqliteConnection conn)
1377 {
1378 da.InsertCommand = createInsertCommand("primitems", ds.Tables["primitems"]);
1379 da.InsertCommand.Connection = conn;
1380
1381 da.UpdateCommand = createUpdateCommand("primitems", "itemID = :itemID", ds.Tables["primitems"]);
1382 da.UpdateCommand.Connection = conn;
1383
1384 SqliteCommand delete = new SqliteCommand("delete from primitems where itemID = :itemID");
1385 delete.Parameters.Add(createSqliteParameter("itemID", typeof (String)));
1386 delete.Connection = conn;
1387 da.DeleteCommand = delete;
1388 }
1266 1389
1267 private void setupPrimCommands(SqliteDataAdapter da, SqliteConnection conn) 1390 private void setupPrimCommands(SqliteDataAdapter da, SqliteConnection conn)
1268 { 1391 {
@@ -1561,4 +1684,4 @@ namespace OpenSim.DataStore.MonoSqlite
1561 } 1684 }
1562 } 1685 }
1563 } 1686 }
1564} \ No newline at end of file 1687}