If asset data already exists with the required hash then don't rewrite it

xassetservice
Justin Clark-Casey (justincc) 2012-03-03 00:05:02 +00:00
parent 94b323d1d8
commit 2535a4cafc
1 changed files with 59 additions and 17 deletions

View File

@ -168,7 +168,6 @@ namespace OpenSim.Data.MySQL
using (MySqlTransaction transaction = dbcon.BeginTransaction()) using (MySqlTransaction transaction = dbcon.BeginTransaction())
{ {
string assetName = asset.Name; string assetName = asset.Name;
if (asset.Name.Length > 64) if (asset.Name.Length > 64)
{ {
@ -220,26 +219,29 @@ namespace OpenSim.Data.MySQL
return; return;
} }
try if (!ExistsData(dbcon, transaction, hash))
{ {
using (MySqlCommand cmd = try
new MySqlCommand(
"replace INTO xassetsdata(hash, data) VALUES(?hash, ?data)",
dbcon))
{ {
cmd.Parameters.AddWithValue("?hash", hash); using (MySqlCommand cmd =
cmd.Parameters.AddWithValue("?data", asset.Data); new MySqlCommand(
cmd.ExecuteNonQuery(); "INSERT INTO xassetsdata(hash, data) VALUES(?hash, ?data)",
dbcon))
{
cmd.Parameters.AddWithValue("?hash", hash);
cmd.Parameters.AddWithValue("?data", asset.Data);
cmd.ExecuteNonQuery();
}
} }
} catch (Exception e)
catch (Exception e) {
{ m_log.ErrorFormat("[XASSET DB]: MySQL failure creating asset data {0} with name \"{1}\". Error: {2}",
m_log.ErrorFormat("[XASSET DB]: MySQL failure creating asset data {0} with name \"{1}\". Error: {2}", asset.FullID, asset.Name, e.Message);
asset.FullID, asset.Name, e.Message);
transaction.Rollback();
return; transaction.Rollback();
return;
}
} }
transaction.Commit(); transaction.Commit();
@ -284,6 +286,46 @@ namespace OpenSim.Data.MySQL
// //
// } // }
/// <summary>
/// We assume we already have the m_dbLock.
/// </summary>
/// TODO: need to actually use the transaction.
/// <param name="dbcon"></param>
/// <param name="transaction"></param>
/// <param name="hash"></param>
/// <returns></returns>
private bool ExistsData(MySqlConnection dbcon, MySqlTransaction transaction, string hash)
{
// m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid);
bool exists = false;
using (MySqlCommand cmd = new MySqlCommand("SELECT hash FROM xassetsdata WHERE hash=?hash", dbcon))
{
cmd.Parameters.AddWithValue("?hash", hash);
try
{
using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
if (dbReader.Read())
{
// m_log.DebugFormat("[ASSETS DB]: Found asset {0}", uuid);
exists = true;
}
}
}
catch (Exception e)
{
m_log.ErrorFormat(
"[XASSETS DB]: MySql failure in ExistsData fetching hash {0}. Exception {1}{2}",
hash, e.Message, e.StackTrace);
}
}
return exists;
}
/// <summary> /// <summary>
/// Check if the asset exists in the database /// Check if the asset exists in the database
/// </summary> /// </summary>