* Committing Ahzz's patch number 620.
* Description SQLITE Inventory Table locks. *Provided by Openlfiegrid.com * Provides missing inventory table locks in SQLite.ThreadPoolClientBranch
parent
75fe826d57
commit
01cf9d8b7e
|
@ -47,6 +47,11 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
private SqliteDataAdapter invItemsDa;
|
||||
private SqliteDataAdapter invFoldersDa;
|
||||
|
||||
/// <summary>
|
||||
/// used to manage concurrent access tothe sqlite database files. Only one thread may open, read, write at a time.
|
||||
/// </summary>
|
||||
private object InventoryLock = new object();
|
||||
|
||||
/// <summary>
|
||||
/// Initialises the interface
|
||||
/// </summary>
|
||||
|
@ -125,6 +130,8 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
}
|
||||
|
||||
private void addFolder(InventoryFolderBase folder)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
|
||||
|
@ -142,8 +149,11 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
|
||||
invFoldersDa.Update(ds, "inventoryfolders");
|
||||
}
|
||||
}
|
||||
|
||||
private void moveFolder(InventoryFolderBase folder)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
|
||||
|
@ -161,8 +171,11 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
|
||||
invFoldersDa.Update(ds, "inventoryfolders");
|
||||
}
|
||||
}
|
||||
|
||||
private void addItem(InventoryItemBase item)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
DataTable inventoryItemTable = ds.Tables["inventoryitems"];
|
||||
|
||||
|
@ -179,6 +192,7 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
}
|
||||
invItemsDa.Update(ds, "inventoryitems");
|
||||
}
|
||||
}
|
||||
|
||||
public void Shutdown()
|
||||
{
|
||||
|
@ -223,6 +237,8 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
/// <param name="folderID">The UUID of the target folder</param>
|
||||
/// <returns>A List of InventoryItemBase items</returns>
|
||||
public List<InventoryItemBase> getInventoryInFolder(LLUUID folderID)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
List<InventoryItemBase> retval = new List<InventoryItemBase>();
|
||||
DataTable inventoryItemTable = ds.Tables["inventoryitems"];
|
||||
|
@ -235,6 +251,7 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of the root folders within a users inventory
|
||||
|
@ -248,6 +265,8 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
|
||||
// see InventoryItemBase.getUserRootFolder
|
||||
public InventoryFolderBase getUserRootFolder(LLUUID user)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
|
@ -271,6 +290,7 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Append a list of all the child folders of a parent folder
|
||||
|
@ -278,6 +298,8 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
/// <param name="folders">list where folders will be appended</param>
|
||||
/// <param name="parentID">ID of parent</param>
|
||||
protected void getInventoryFolders(ref List<InventoryFolderBase> folders, LLUUID parentID)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
string selectExp = "parentID = '" + Util.ToRawUuidString(parentID) + "'";
|
||||
|
@ -287,6 +309,7 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
folders.Add(buildFolder(row));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of inventory folders contained in the folder 'parentID'
|
||||
|
@ -322,6 +345,8 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
/// <param name="item">The UUID of the item to be returned</param>
|
||||
/// <returns>A class containing item information</returns>
|
||||
public InventoryItemBase getInventoryItem(LLUUID item)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
DataRow row = ds.Tables["inventoryitems"].Rows.Find(Util.ToRawUuidString(item));
|
||||
if (row != null)
|
||||
|
@ -333,6 +358,7 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a specified inventory folder by its UUID
|
||||
|
@ -346,7 +372,8 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
// better to leave multi region at this point. It does mean
|
||||
// that you don't get to see system textures why creating
|
||||
// clothes and the like. :(
|
||||
|
||||
lock (InventoryLock)
|
||||
{
|
||||
DataRow row = ds.Tables["inventoryfolders"].Rows.Find(Util.ToRawUuidString(folder));
|
||||
if (row != null)
|
||||
{
|
||||
|
@ -357,6 +384,7 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new inventory item based on item
|
||||
|
@ -381,6 +409,8 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
public void deleteInventoryItem(LLUUID itemID)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
DataTable inventoryItemTable = ds.Tables["inventoryitems"];
|
||||
|
||||
|
@ -392,7 +422,7 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
|
||||
invItemsDa.Update(ds, "inventoryitems");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete all items in the specified folder
|
||||
|
@ -442,6 +472,8 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
/// </remarks>
|
||||
/// <param name="item"></param>
|
||||
public void deleteInventoryFolder(LLUUID folderID)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
List<InventoryFolderBase> subFolders = getFolderHierarchy(Util.ToRawUuidString(folderID));
|
||||
|
||||
|
@ -469,6 +501,7 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
|
||||
invFoldersDa.Update(ds, "inventoryfolders");
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
|
@ -516,6 +549,8 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
}
|
||||
|
||||
private void setupItemsCommands(SqliteDataAdapter da, SqliteConnection conn)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
da.InsertCommand = createInsertCommand("inventoryitems", ds.Tables["inventoryitems"]);
|
||||
da.InsertCommand.Connection = conn;
|
||||
|
@ -524,12 +559,15 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
da.UpdateCommand.Connection = conn;
|
||||
|
||||
SqliteCommand delete = new SqliteCommand("delete from inventoryitems where UUID = :UUID");
|
||||
delete.Parameters.Add(createSqliteParameter("UUID", typeof (String)));
|
||||
delete.Parameters.Add(createSqliteParameter("UUID", typeof(String)));
|
||||
delete.Connection = conn;
|
||||
da.DeleteCommand = delete;
|
||||
}
|
||||
}
|
||||
|
||||
private void setupFoldersCommands(SqliteDataAdapter da, SqliteConnection conn)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
da.InsertCommand = createInsertCommand("inventoryfolders", ds.Tables["inventoryfolders"]);
|
||||
da.InsertCommand.Connection = conn;
|
||||
|
@ -538,10 +576,11 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
da.UpdateCommand.Connection = conn;
|
||||
|
||||
SqliteCommand delete = new SqliteCommand("delete from inventoryfolders where UUID = :UUID");
|
||||
delete.Parameters.Add(createSqliteParameter("UUID", typeof (String)));
|
||||
delete.Parameters.Add(createSqliteParameter("UUID", typeof(String)));
|
||||
delete.Connection = conn;
|
||||
da.DeleteCommand = delete;
|
||||
}
|
||||
}
|
||||
|
||||
private InventoryFolderBase buildFolder(DataRow row)
|
||||
{
|
||||
|
@ -578,6 +617,8 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
**********************************************************************/
|
||||
|
||||
private void InitDB(SqliteConnection conn)
|
||||
{
|
||||
lock (InventoryLock)
|
||||
{
|
||||
string createInventoryItems = defineTable(createInventoryItemsTable());
|
||||
string createInventoryFolders = defineTable(createInventoryFoldersTable());
|
||||
|
@ -589,6 +630,7 @@ namespace OpenSim.Framework.Data.SQLite
|
|||
scmd.ExecuteNonQuery();
|
||||
conn.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private bool TestTables(SqliteConnection conn)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue