* Committing Ahzz's patch number 620.

* Description SQLITE Inventory Table locks. *Provided by Openlfiegrid.com 
* Provides missing inventory table locks in SQLite.
ThreadPoolClientBranch
Teravus Ovares 2008-02-19 00:08:28 +00:00
parent 75fe826d57
commit 01cf9d8b7e
1 changed files with 177 additions and 135 deletions

View File

@ -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)
{