Flow.Launcher/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/IndexSearch.cs

103 lines
3.6 KiB
C#
Raw Normal View History

using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Plugin.SharedCommands;
using Microsoft.Search.Interop;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data.OleDb;
using System.Diagnostics;
using System.Text.RegularExpressions;
namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex
{
2020-05-25 09:06:09 +00:00
internal class IndexSearch
{
private readonly object _lock = new object();
public OleDbConnection conn;
public OleDbCommand command;
public OleDbDataReader dataReaderResults;
// Reserved keywords in oleDB
private string ReservedStringPattern = @"^[\/\\\$\%]+$";
2020-05-26 11:49:59 +00:00
internal List<Result> ExecuteWindowsIndexSearch(string indexQueryString, string connectionString, Query query)
{
var results = new List<Result>();
try
{
using (conn = new OleDbConnection(connectionString))
{
conn.Open();
2020-05-26 11:49:59 +00:00
using (command = new OleDbCommand(indexQueryString, conn))
{
// Results return as an OleDbDataReader.
using (dataReaderResults = command.ExecuteReader())
{
if (dataReaderResults.HasRows)
{
while (dataReaderResults.Read())
{
if (dataReaderResults.GetValue(0) != DBNull.Value && dataReaderResults.GetValue(1) != DBNull.Value)
{
2020-05-19 12:40:27 +00:00
results.Add(CreateResult(
dataReaderResults.GetString(0),
dataReaderResults.GetString(1),
2020-05-25 08:58:28 +00:00
dataReaderResults.GetString(2),
query));
}
}
}
}
}
}
}
catch (InvalidOperationException)
{
// Internal error from ExecuteReader(): Connection closed.
}
catch (Exception ex)
{
Log.Info(ex.ToString());//UPDATE THIS LOGGING
}
return results;
}
2020-05-25 08:58:28 +00:00
private Result CreateResult(string filename, string path, string fileType, Query query)
{
2020-05-25 08:58:28 +00:00
if (fileType == "Directory")
return ResultManager.CreateFolderResult(filename, path, path, query, true, true);
2020-05-25 08:58:28 +00:00
else
{
return ResultManager.CreateFileResult(path, query, true, true);
2020-05-25 08:58:28 +00:00
}
}
2020-05-25 08:58:28 +00:00
internal List<Result> WindowsIndexSearch(string searchString, string connectionString, Func<string, string> constructQuery, Query query)
{
var regexMatch = Regex.Match(searchString, ReservedStringPattern);
if (regexMatch.Success)
return new List<Result>();
lock (_lock)
{
2020-05-19 12:40:27 +00:00
var constructedQuery = constructQuery(searchString);
2020-05-25 08:58:28 +00:00
return ExecuteWindowsIndexSearch(constructedQuery, connectionString, query);
}
}
internal bool PathIsIndexed(string path)
{
var csm = new CSearchManager();
var indexManager = csm.GetCatalog("SystemIndex").GetCrawlScopeManager();
return indexManager.IncludedInCrawlScope(path) > 0;
}
}
}