From d1c3f8eef58b29eb8760eeb1ac03852a2387f927 Mon Sep 17 00:00:00 2001
From: Oren Hurvitz
Date: Mon, 31 Mar 2014 11:53:12 +0300
Subject: Added assets service method AssetsExist(), which returns whether the
given list of assets exist.
This method is used to optimize sending assets with embedded assets: e.g., when a Hypergrid visitor takes an item into the inventory.
---
OpenSim/Data/SQLite/SQLiteAssetData.cs | 37 ++++++++++++++++++++--------------
1 file changed, 22 insertions(+), 15 deletions(-)
(limited to 'OpenSim/Data/SQLite/SQLiteAssetData.cs')
diff --git a/OpenSim/Data/SQLite/SQLiteAssetData.cs b/OpenSim/Data/SQLite/SQLiteAssetData.cs
index c32982e..1f32376 100644
--- a/OpenSim/Data/SQLite/SQLiteAssetData.cs
+++ b/OpenSim/Data/SQLite/SQLiteAssetData.cs
@@ -152,7 +152,7 @@ namespace OpenSim.Data.SQLite
}
//m_log.Info("[ASSET DB]: Creating Asset " + asset.FullID.ToString());
- if (ExistsAsset(asset.FullID))
+ if (AssetsExist(new[] { asset.FullID })[0])
{
//LogAssetLoad(asset);
@@ -214,32 +214,39 @@ namespace OpenSim.Data.SQLite
// }
///
- /// Check if an asset exist in database
+ /// Check if the assets exist in the database.
///
- /// The asset UUID
- /// True if exist, or false.
- override public bool ExistsAsset(UUID uuid)
+ /// The assets' IDs
+ /// For each asset: true if it exists, false otherwise
+ public override bool[] AssetsExist(UUID[] uuids)
{
- lock (this)
+ if (uuids.Length == 0)
+ return new bool[0];
+
+ HashSet exist = new HashSet();
+
+ string ids = "'" + string.Join("','", uuids) + "'";
+ string sql = string.Format("SELECT id FROM assets WHERE id IN ({0})", ids);
+
+ lock (this)
{
using (SqliteCommand cmd = new SqliteCommand(SelectAssetSQL, m_conn))
{
- cmd.Parameters.Add(new SqliteParameter(":UUID", uuid.ToString()));
using (IDataReader reader = cmd.ExecuteReader())
{
- if (reader.Read())
- {
- reader.Close();
- return true;
- }
- else
+ while (reader.Read())
{
- reader.Close();
- return false;
+ UUID id = new UUID((string)reader["UUID"]);
+ exist.Add(id);
}
}
}
}
+
+ bool[] results = new bool[uuids.Length];
+ for (int i = 0; i < uuids.Length; i++)
+ results[i] = exist.Contains(uuids[i]);
+ return results;
}
///
--
cgit v1.1