Prim inventory storage phase 2. Add a prim inventory script item to sqlite experimentally. This is not yet enabled in the codebase. No user functionality yet - next
phase is to write the code to restore the script in prim inventory on region loadafrisby
parent
b96da29d1a
commit
52666e64c8
|
@ -52,6 +52,7 @@ namespace OpenSim.DataStore.MonoSqlite
|
||||||
private DataSet ds;
|
private DataSet ds;
|
||||||
private SqliteDataAdapter primDa;
|
private SqliteDataAdapter primDa;
|
||||||
private SqliteDataAdapter shapeDa;
|
private SqliteDataAdapter shapeDa;
|
||||||
|
private SqliteDataAdapter itemsDa;
|
||||||
private SqliteDataAdapter terrainDa;
|
private SqliteDataAdapter terrainDa;
|
||||||
private SqliteDataAdapter landDa;
|
private SqliteDataAdapter landDa;
|
||||||
private SqliteDataAdapter landAccessListDa;
|
private SqliteDataAdapter landAccessListDa;
|
||||||
|
@ -88,8 +89,11 @@ namespace OpenSim.DataStore.MonoSqlite
|
||||||
|
|
||||||
SqliteCommand shapeSelectCmd = new SqliteCommand(shapeSelect, conn);
|
SqliteCommand shapeSelectCmd = new SqliteCommand(shapeSelect, conn);
|
||||||
shapeDa = new SqliteDataAdapter(shapeSelectCmd);
|
shapeDa = new SqliteDataAdapter(shapeSelectCmd);
|
||||||
// SqliteCommandBuilder shapeCb = new SqliteCommandBuilder(shapeDa);
|
// SqliteCommandBuilder shapeCb = new SqliteCommandBuilder(shapeDa);
|
||||||
|
|
||||||
|
SqliteCommand itemsSelectCmd = new SqliteCommand(itemsSelect, conn);
|
||||||
|
itemsDa = new SqliteDataAdapter(itemsSelectCmd);
|
||||||
|
|
||||||
SqliteCommand terrainSelectCmd = new SqliteCommand(terrainSelect, conn);
|
SqliteCommand terrainSelectCmd = new SqliteCommand(terrainSelect, conn);
|
||||||
terrainDa = new SqliteDataAdapter(terrainSelectCmd);
|
terrainDa = new SqliteDataAdapter(terrainSelectCmd);
|
||||||
|
|
||||||
|
@ -112,6 +116,12 @@ namespace OpenSim.DataStore.MonoSqlite
|
||||||
|
|
||||||
ds.Tables.Add(createShapeTable());
|
ds.Tables.Add(createShapeTable());
|
||||||
setupShapeCommands(shapeDa, conn);
|
setupShapeCommands(shapeDa, conn);
|
||||||
|
|
||||||
|
if (persistPrimInventories)
|
||||||
|
{
|
||||||
|
ds.Tables.Add(createItemsTable());
|
||||||
|
setupItemsCommands(itemsDa, conn);
|
||||||
|
}
|
||||||
|
|
||||||
ds.Tables.Add(createTerrainTable());
|
ds.Tables.Add(createTerrainTable());
|
||||||
setupTerrainCommands(terrainDa, conn);
|
setupTerrainCommands(terrainDa, conn);
|
||||||
|
@ -489,6 +499,7 @@ namespace OpenSim.DataStore.MonoSqlite
|
||||||
{
|
{
|
||||||
primDa.Update(ds, "prims");
|
primDa.Update(ds, "prims");
|
||||||
shapeDa.Update(ds, "primshapes");
|
shapeDa.Update(ds, "primshapes");
|
||||||
|
itemsDa.Update(ds, "primitems");
|
||||||
terrainDa.Update(ds, "terrain");
|
terrainDa.Update(ds, "terrain");
|
||||||
landDa.Update(ds, "land");
|
landDa.Update(ds, "land");
|
||||||
landAccessListDa.Update(ds, "landaccesslist");
|
landAccessListDa.Update(ds, "landaccesslist");
|
||||||
|
@ -635,11 +646,13 @@ namespace OpenSim.DataStore.MonoSqlite
|
||||||
{
|
{
|
||||||
DataTable items = new DataTable("primitems");
|
DataTable items = new DataTable("primitems");
|
||||||
|
|
||||||
createCol(items, "UUID", typeof (String));
|
createCol(items, "itemID", typeof (String));
|
||||||
createCol(items, "invType", typeof (Int32));
|
createCol(items, "primID", typeof (String));
|
||||||
createCol(items, "assetID", typeof (String));
|
createCol(items, "assetID", typeof (String));
|
||||||
createCol(items, "assetType", typeof (Int32));
|
|
||||||
createCol(items, "parentFolderID", typeof (String));
|
createCol(items, "parentFolderID", typeof (String));
|
||||||
|
|
||||||
|
createCol(items, "invType", typeof (String));
|
||||||
|
createCol(items, "assetType", typeof (String));
|
||||||
|
|
||||||
createCol(items, "name", typeof (String));
|
createCol(items, "name", typeof (String));
|
||||||
createCol(items, "description", typeof (String));
|
createCol(items, "description", typeof (String));
|
||||||
|
@ -656,7 +669,7 @@ namespace OpenSim.DataStore.MonoSqlite
|
||||||
createCol(items, "everyonePermissions", typeof (Int32));
|
createCol(items, "everyonePermissions", typeof (Int32));
|
||||||
createCol(items, "groupPermissions", typeof (Int32));
|
createCol(items, "groupPermissions", typeof (Int32));
|
||||||
|
|
||||||
items.PrimaryKey = new DataColumn[] {items.Columns["UUID"]};
|
items.PrimaryKey = new DataColumn[] {items.Columns["itemID"]};
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
@ -971,6 +984,30 @@ namespace OpenSim.DataStore.MonoSqlite
|
||||||
row["SitTargetOrientY"] = sitTargetOrient.Y;
|
row["SitTargetOrientY"] = sitTargetOrient.Y;
|
||||||
row["SitTargetOrientZ"] = sitTargetOrient.Z;
|
row["SitTargetOrientZ"] = sitTargetOrient.Z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void fillItemRow(DataRow row, SceneObjectPart.TaskInventoryItem taskItem)
|
||||||
|
{
|
||||||
|
row["itemID"] = taskItem.item_id;
|
||||||
|
row["primID"] = taskItem.ParentPartID;
|
||||||
|
row["assetID"] = taskItem.asset_id;
|
||||||
|
row["parentFolderID"] = taskItem.parent_id;
|
||||||
|
|
||||||
|
row["invType"] = taskItem.inv_type;
|
||||||
|
row["assetType"] = taskItem.type;
|
||||||
|
|
||||||
|
row["name"] = taskItem.name;
|
||||||
|
row["description"] = taskItem.desc;
|
||||||
|
row["creationDate"] = taskItem.creation_date;
|
||||||
|
row["creatorID"] = taskItem.creator_id;
|
||||||
|
row["ownerID"] = taskItem.owner_id;
|
||||||
|
row["lastOwnerID"] = taskItem.last_owner_id;
|
||||||
|
row["groupID"] = taskItem.group_id;
|
||||||
|
row["nextPermissions"] = taskItem.next_owner_mask;
|
||||||
|
row["currentPermissions"] = taskItem.owner_mask;
|
||||||
|
row["basePermissions"] = taskItem.base_mask;
|
||||||
|
row["everyonePermissions"] = taskItem.everyone_mask;
|
||||||
|
row["groupPermissions"] = taskItem.group_mask;
|
||||||
|
}
|
||||||
|
|
||||||
private void fillLandRow(DataRow row, LandData land, LLUUID regionUUID)
|
private void fillLandRow(DataRow row, LandData land, LLUUID regionUUID)
|
||||||
{
|
{
|
||||||
|
@ -1137,6 +1174,78 @@ namespace OpenSim.DataStore.MonoSqlite
|
||||||
{
|
{
|
||||||
fillShapeRow(shapeRow, prim);
|
fillShapeRow(shapeRow, prim);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (persistPrimInventories)
|
||||||
|
{
|
||||||
|
addPrimInventory(prim.UUID, prim.TaskInventory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Persist prim inventory. Deletes, updates and inserts rows.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="primID"></param>
|
||||||
|
/// <param name="items"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private void addPrimInventory(LLUUID primID, Dictionary<LLUUID, SceneObjectPart.TaskInventoryItem> items)
|
||||||
|
{
|
||||||
|
MainLog.Instance.Verbose("DATASTORE", "Entered addPrimInventory with prim ID {0}", primID);
|
||||||
|
|
||||||
|
// Find all existing inventory rows for this prim
|
||||||
|
DataTable dbItems = ds.Tables["primitems"];
|
||||||
|
|
||||||
|
String sql = String.Format("primID = '{0}'", primID);
|
||||||
|
DataRow[] dbItemRows = dbItems.Select(sql);
|
||||||
|
|
||||||
|
// Build structures for manipulation purposes
|
||||||
|
IDictionary<String, DataRow> dbItemsToRemove = new Dictionary<String, DataRow>();
|
||||||
|
ICollection<SceneObjectPart.TaskInventoryItem> itemsToAdd
|
||||||
|
= new List<SceneObjectPart.TaskInventoryItem>();
|
||||||
|
|
||||||
|
foreach (DataRow row in dbItemRows)
|
||||||
|
{
|
||||||
|
dbItemsToRemove.Add((String)row["itemID"], row);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Eliminate rows from the deletion set which already exist for this prim's inventory
|
||||||
|
// TODO Very temporary, need to take account of simple metadata changes soon
|
||||||
|
foreach (LLUUID itemId in items.Keys)
|
||||||
|
{
|
||||||
|
String rawItemId = itemId.ToString();
|
||||||
|
|
||||||
|
if (dbItemsToRemove.ContainsKey(rawItemId))
|
||||||
|
{
|
||||||
|
dbItemsToRemove.Remove(rawItemId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
itemsToAdd.Add(items[itemId]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete excess rows
|
||||||
|
foreach (DataRow row in dbItemsToRemove.Values)
|
||||||
|
{
|
||||||
|
MainLog.Instance.Verbose(
|
||||||
|
"DATASTORE",
|
||||||
|
"Removing item {0}, {1} from prim ID {2}",
|
||||||
|
row["name"], row["itemID"], row["primID"]);
|
||||||
|
|
||||||
|
row.Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert items not already present
|
||||||
|
foreach (SceneObjectPart.TaskInventoryItem newItem in itemsToAdd)
|
||||||
|
{
|
||||||
|
MainLog.Instance.Verbose(
|
||||||
|
"DATASTORE",
|
||||||
|
"Adding item {0}, {1} to prim ID {1}",
|
||||||
|
newItem.name, newItem.item_id, newItem.ParentPartID);
|
||||||
|
|
||||||
|
DataRow newItemRow = dbItems.NewRow();
|
||||||
|
fillItemRow(newItemRow, newItem);
|
||||||
|
dbItems.Rows.Add(newItemRow);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -1263,6 +1372,20 @@ namespace OpenSim.DataStore.MonoSqlite
|
||||||
param.SourceVersion = DataRowVersion.Current;
|
param.SourceVersion = DataRowVersion.Current;
|
||||||
return param;
|
return param;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupItemsCommands(SqliteDataAdapter da, SqliteConnection conn)
|
||||||
|
{
|
||||||
|
da.InsertCommand = createInsertCommand("primitems", ds.Tables["primitems"]);
|
||||||
|
da.InsertCommand.Connection = conn;
|
||||||
|
|
||||||
|
da.UpdateCommand = createUpdateCommand("primitems", "itemID = :itemID", ds.Tables["primitems"]);
|
||||||
|
da.UpdateCommand.Connection = conn;
|
||||||
|
|
||||||
|
SqliteCommand delete = new SqliteCommand("delete from primitems where itemID = :itemID");
|
||||||
|
delete.Parameters.Add(createSqliteParameter("itemID", typeof (String)));
|
||||||
|
delete.Connection = conn;
|
||||||
|
da.DeleteCommand = delete;
|
||||||
|
}
|
||||||
|
|
||||||
private void setupPrimCommands(SqliteDataAdapter da, SqliteConnection conn)
|
private void setupPrimCommands(SqliteDataAdapter da, SqliteConnection conn)
|
||||||
{
|
{
|
||||||
|
@ -1561,4 +1684,4 @@ namespace OpenSim.DataStore.MonoSqlite
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue