Fixed exceptions in indexer and delayed execution logic (#5912)

This commit is contained in:
Arjun Balgovind
2020-08-12 12:44:55 -07:00
committed by GitHub
parent 95e82ca359
commit f3babcb46e
2 changed files with 48 additions and 32 deletions

View File

@@ -28,26 +28,35 @@ namespace Microsoft.Plugin.Indexer.SearchHelper
// open the connection // open the connection
conn.Open(); conn.Open();
// now create an OleDB command object with the query we built above and the connection we just opened. try
using (command = new OleDbCommand(sqlQuery, conn))
{ {
using (wDSResults = command.ExecuteReader()) // now create an OleDB command object with the query we built above and the connection we just opened.
using (command = new OleDbCommand(sqlQuery, conn))
{ {
if (!wDSResults.IsClosed && wDSResults.HasRows) using (wDSResults = command.ExecuteReader())
{ {
while (!wDSResults.IsClosed && wDSResults.Read()) if (!wDSResults.IsClosed && wDSResults.HasRows)
{ {
List<object> fieldData = new List<object>(); while (!wDSResults.IsClosed && wDSResults.Read())
for (int i = 0; i < wDSResults.FieldCount; i++)
{ {
fieldData.Add(wDSResults.GetValue(i)); List<object> fieldData = new List<object>();
} for (int i = 0; i < wDSResults.FieldCount; i++)
{
fieldData.Add(wDSResults.GetValue(i));
}
result.Add(new OleDBResult(fieldData)); result.Add(new OleDBResult(fieldData));
}
} }
} }
} }
} }
// AccessViolationException can occur if another query is made before the current query completes. Since the old query would be cancelled we can ignore the exception
catch (System.AccessViolationException)
{
// do nothing
}
} }
return result; return result;

View File

@@ -512,33 +512,40 @@ namespace PowerLauncher.ViewModel
currentCancellationToken.ThrowIfCancellationRequested(); currentCancellationToken.ThrowIfCancellationRequested();
Parallel.ForEach(plugins, (plugin) => Parallel.ForEach(plugins, (plugin) =>
{ {
if (!plugin.Metadata.Disabled) try
{ {
var results = PluginManager.QueryForPlugin(plugin, query, true); if (!plugin.Metadata.Disabled)
currentCancellationToken.ThrowIfCancellationRequested();
if ((results?.Count ?? 0) != 0)
{ {
lock (_addResultsLock) var results = PluginManager.QueryForPlugin(plugin, query, true);
{
if (query.RawQuery == _currentQuery.RawQuery)
{
currentCancellationToken.ThrowIfCancellationRequested();
// Remove the original results from the plugin
Results.Results.RemoveAll(r => r.Result.PluginID == plugin.Metadata.ID);
currentCancellationToken.ThrowIfCancellationRequested();
// Add the new results from the plugin
UpdateResultView(results, query, currentCancellationToken);
currentCancellationToken.ThrowIfCancellationRequested();
Results.Sort();
}
}
currentCancellationToken.ThrowIfCancellationRequested(); currentCancellationToken.ThrowIfCancellationRequested();
UpdateResultsListViewAfterQuery(query, true); if ((results?.Count ?? 0) != 0)
{
lock (_addResultsLock)
{
if (query.RawQuery == _currentQuery.RawQuery)
{
currentCancellationToken.ThrowIfCancellationRequested();
// Remove the original results from the plugin
Results.Results.RemoveAll(r => r.Result.PluginID == plugin.Metadata.ID);
currentCancellationToken.ThrowIfCancellationRequested();
// Add the new results from the plugin
UpdateResultView(results, query, currentCancellationToken);
currentCancellationToken.ThrowIfCancellationRequested();
Results.Sort();
}
}
currentCancellationToken.ThrowIfCancellationRequested();
UpdateResultsListViewAfterQuery(query, true);
}
} }
} }
catch (OperationCanceledException)
{
// nothing to do here
}
}); });
} }