diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Main.cs b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Main.cs index 8d6af797e9..b547815e76 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Main.cs +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/Main.cs @@ -87,11 +87,15 @@ namespace Wox.Plugin.Indexer results.Add(r); } } + catch(InvalidOperationException) + { + //The connection has closed, internal error of ExecuteReader() + //Not showing this exception to the users + } catch (Exception ex) { results.Add(new Result { - // TODO: Localize the string Title = ex.ToString(), IcoPath = "Images\\WindowsIndexerImg.bmp" }); diff --git a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs index fb7b6ffcd1..857baea11b 100644 --- a/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs +++ b/src/modules/launcher/Plugins/Wox.Plugin.Indexer/SearchHelper/WindowsSearchAPI.cs @@ -10,9 +10,12 @@ namespace Wox.Plugin.Indexer.SearchHelper public OleDbConnection conn; public OleDbCommand command; public OleDbDataReader WDSResults; + private readonly object _lock = new object(); + - public IEnumerable ExecuteQuery(ISearchQueryHelper queryHelper, string keyword) + public List ExecuteQuery(ISearchQueryHelper queryHelper, string keyword) { + List _Result = new List(); // Generate SQL from our parameters, converting the userQuery from AQS->WHERE clause string sqlQuery = queryHelper.GenerateSQLFromUserQuery(keyword); @@ -29,19 +32,19 @@ namespace Wox.Plugin.Indexer.SearchHelper // execute the command, which returns the results as an OleDbDataReader. using (WDSResults = command.ExecuteReader()) { - while (WDSResults.Read()) + if(WDSResults.HasRows) { - // col 0 is our path in display format - if (WDSResults.GetString(0) != null) + while (WDSResults.Read() && WDSResults.GetValue(0) != DBNull.Value) { var result = new SearchResult { Path = WDSResults.GetString(0) }; - yield return result; + _Result.Add(result); } } } - } } + + return _Result; } @@ -91,10 +94,12 @@ namespace Wox.Plugin.Indexer.SearchHelper public IEnumerable Search(string keyword, string pattern = "*", int maxCount = 100) { - ISearchQueryHelper queryHelper; - InitQueryHelper(out queryHelper, maxCount); - ModifyQueryHelper(ref queryHelper, pattern); - return ExecuteQuery(queryHelper, keyword); + lock(_lock){ + ISearchQueryHelper queryHelper; + InitQueryHelper(out queryHelper, maxCount); + ModifyQueryHelper(ref queryHelper, pattern); + return ExecuteQuery(queryHelper, keyword); + } } } } diff --git a/src/modules/launcher/Wox.Test/Plugins/WindowsIndexerTest.cs b/src/modules/launcher/Wox.Test/Plugins/WindowsIndexerTest.cs index 9df2aa5892..fae98e9ab8 100644 --- a/src/modules/launcher/Wox.Test/Plugins/WindowsIndexerTest.cs +++ b/src/modules/launcher/Wox.Test/Plugins/WindowsIndexerTest.cs @@ -132,14 +132,33 @@ namespace Wox.Test.Plugins _api.InitQueryHelper(out queryHelper, 10); _api.ModifyQueryHelper(ref queryHelper, "*"); string keyword = "test"; + bool commandDisposed = false; + bool resultDisposed = false; // Act _api.ExecuteQuery(queryHelper, keyword); + try + { + _api.command.ExecuteReader(); + } + catch(InvalidOperationException) + { + commandDisposed = true; + } + + try + { + _api.WDSResults.Read(); + } + catch(InvalidOperationException) + { + resultDisposed = true; + } // Assert - Assert.IsNull(_api.conn); - Assert.IsNull(_api.command); - Assert.IsNull(_api.WDSResults); + Assert.IsTrue(_api.conn.State == System.Data.ConnectionState.Closed); + Assert.IsTrue(commandDisposed); + Assert.IsTrue(resultDisposed); } } } diff --git a/src/modules/launcher/Wox/Wox.csproj b/src/modules/launcher/Wox/Wox.csproj index 9cd729e8a3..d91f963f3f 100644 --- a/src/modules/launcher/Wox/Wox.csproj +++ b/src/modules/launcher/Wox/Wox.csproj @@ -66,11 +66,12 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + + -