[PTRun]Don't clear config data on upgrade (#30187)

* [PTRun] Implemented a new JSON storage method for PTRun settings files.

* [PTRun] Removed uncessary parts.

* [PTRun] Spell checks.

* [PTRun] New JsonSerializerOptions added for information files.

* [PTRun] Unnecessary null check is removed.

* [PT Run] - ExtractFields function removed.
- Creating instance is used instead of deserializing.

* [PTRun] Build fix

* [PTRun] Removed unncessary parts

* [PTRun] CheckWithInformationFileToClear reversed.

* [PTRun] Build fix.

* [PTRun] Deserialization is used instead of key by key comparison.

* [PTRun] Removed unncessary parts.

* [PTRun] Removed unncessary parts.

* [PTRun] Remove entry if query is null or empty.
This commit is contained in:
gokcekantarci
2024-02-06 18:33:19 +03:00
committed by GitHub
parent 4426df671e
commit 1c7c100a42
7 changed files with 174 additions and 28 deletions

View File

@@ -41,5 +41,23 @@ namespace PowerLauncher.Storage
}); });
} }
} }
public void Update()
{
for (int i = Items.Count - 1; i >= 0; i--)
{
if (string.IsNullOrEmpty(Items[i].Query))
{
Items.RemoveAt(i);
}
else
{
if (Items[i].ExecutedDateTime == DateTime.MinValue)
{
Items[i].ExecutedDateTime = DateTime.Now;
}
}
}
}
} }
} }

View File

@@ -9,6 +9,7 @@ using System.Globalization;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using System.Text.Json;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
@@ -1033,7 +1034,24 @@ namespace PowerLauncher.ViewModel
{ {
if (!_saved) if (!_saved)
{ {
if (_historyItemsStorage.CheckVersionMismatch())
{
if (!_historyItemsStorage.TryLoadData())
{
_history.Update();
}
}
_historyItemsStorage.Save(); _historyItemsStorage.Save();
if (_userSelectedRecordStorage.CheckVersionMismatch())
{
if (!_userSelectedRecordStorage.TryLoadData())
{
_userSelectedRecord.Update();
}
}
_userSelectedRecordStorage.Save(); _userSelectedRecordStorage.Save();
_saved = true; _saved = true;

View File

@@ -2,9 +2,11 @@
// The Microsoft Corporation licenses this file to you under the MIT license. // The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using System.Text.Json;
using Wox.Infrastructure.Storage; using Wox.Infrastructure.Storage;
using Wox.Infrastructure.UserSettings; using Wox.Infrastructure.UserSettings;
using Wox.Plugin; using Wox.Plugin;
using Wox.Plugin.Logger;
namespace PowerLauncher.ViewModel namespace PowerLauncher.ViewModel
{ {
@@ -16,6 +18,22 @@ namespace PowerLauncher.ViewModel
{ {
_storage = new WoxJsonStorage<PowerToysRunSettings>(); _storage = new WoxJsonStorage<PowerToysRunSettings>();
Settings = _storage.Load(); Settings = _storage.Load();
// Check information file for version mismatch
try
{
if (_storage.CheckVersionMismatch())
{
if (!_storage.TryLoadData())
{
_storage.Clear();
}
}
}
catch (JsonException e)
{
Log.Exception($"Error in Load of PowerToysRunSettings: {e.Message}", e, GetType());
}
} }
public PowerToysRunSettings Settings { get; } public PowerToysRunSettings Settings { get; }

View File

@@ -24,9 +24,8 @@ public class Alphabet : IAlphabet
PinyinFormat.WITHOUT_TONE; PinyinFormat.WITHOUT_TONE;
private ConcurrentDictionary<string, string[][]> _pinyinCache; private ConcurrentDictionary<string, string[][]> _pinyinCache;
private WoxJsonStorage<Dictionary<string, string[][]>> _pinyinStorage; private WoxJsonStorage<ConcurrentDictionary<string, string[][]>> _pinyinStorage;
private PowerToysRunSettings _settings; private PowerToysRunSettings _settings;
private Dictionary<string, string[][]> __cache;
public void Initialize(PowerToysRunSettings settings) public void Initialize(PowerToysRunSettings settings)
{ {
@@ -38,8 +37,8 @@ public class Alphabet : IAlphabet
{ {
Stopwatch.Normal("|Wox.Infrastructure.Alphabet.Initialize|Preload pinyin cache", () => Stopwatch.Normal("|Wox.Infrastructure.Alphabet.Initialize|Preload pinyin cache", () =>
{ {
_pinyinStorage = new WoxJsonStorage<Dictionary<string, string[][]>>("Pinyin"); _pinyinStorage = new WoxJsonStorage<ConcurrentDictionary<string, string[][]>>("Pinyin");
SetPinyinCacheAsDictionary(__cache = _pinyinStorage.Load()); _pinyinCache = _pinyinStorage.Load();
// force pinyin library static constructor initialize // force pinyin library static constructor initialize
Pinyin4Net.GetPinyin('一', _pinyinFormat); Pinyin4Net.GetPinyin('一', _pinyinFormat);
@@ -204,9 +203,4 @@ public class Alphabet : IAlphabet
{ {
return new Dictionary<string, string[][]>(_pinyinCache); return new Dictionary<string, string[][]>(_pinyinCache);
} }
private void SetPinyinCacheAsDictionary(Dictionary<string, string[][]> usage)
{
_pinyinCache = new ConcurrentDictionary<string, string[][]>(usage);
}
} }

View File

@@ -3,9 +3,11 @@
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using System; using System;
using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.IO.Abstractions; using System.IO.Abstractions;
using System.Linq;
using System.Text.Json; using System.Text.Json;
using Wox.Plugin.Logger; using Wox.Plugin.Logger;
@@ -20,6 +22,8 @@ namespace Wox.Infrastructure.Storage
private static readonly IPath Path = FileSystem.Path; private static readonly IPath Path = FileSystem.Path;
private static readonly IFile File = FileSystem.File; private static readonly IFile File = FileSystem.File;
private readonly object _saveLock = new object();
// use property initialization instead of DefaultValueAttribute // use property initialization instead of DefaultValueAttribute
// easier and flexible for default value of object // easier and flexible for default value of object
private static readonly JsonSerializerOptions _serializerOptions = new JsonSerializerOptions private static readonly JsonSerializerOptions _serializerOptions = new JsonSerializerOptions
@@ -28,6 +32,15 @@ namespace Wox.Infrastructure.Storage
IncludeFields = true, IncludeFields = true,
PropertyNameCaseInsensitive = true, PropertyNameCaseInsensitive = true,
WriteIndented = true, WriteIndented = true,
UnmappedMemberHandling = System.Text.Json.Serialization.JsonUnmappedMemberHandling.Disallow,
};
private static readonly JsonSerializerOptions _deserializerOptions = new JsonSerializerOptions
{
DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.Never,
IncludeFields = true,
PropertyNameCaseInsensitive = true,
WriteIndented = true,
}; };
private T _data; private T _data;
@@ -44,20 +57,10 @@ namespace Wox.Infrastructure.Storage
private const int _jsonStorage = 1; private const int _jsonStorage = 1;
private StoragePowerToysVersionInfo _storageHelper; private StoragePowerToysVersionInfo _storageHelper;
public T Load() public virtual T Load()
{ {
_storageHelper = new StoragePowerToysVersionInfo(FilePath, _jsonStorage); _storageHelper = new StoragePowerToysVersionInfo(FilePath, _jsonStorage);
// Depending on the version number of the previously installed PT Run, delete the cache if it is found to be incompatible
if (_storageHelper.ClearCache)
{
if (File.Exists(FilePath))
{
File.Delete(FilePath);
Log.Info($"Deleting cached data at <{FilePath}>", GetType());
}
}
if (File.Exists(FilePath)) if (File.Exists(FilePath))
{ {
var serialized = File.ReadAllText(FilePath); var serialized = File.ReadAllText(FilePath);
@@ -82,7 +85,7 @@ namespace Wox.Infrastructure.Storage
{ {
try try
{ {
_data = JsonSerializer.Deserialize<T>(serialized, _serializerOptions); _data = JsonSerializer.Deserialize<T>(serialized, _deserializerOptions);
} }
catch (JsonException e) catch (JsonException e)
{ {
@@ -121,18 +124,59 @@ namespace Wox.Infrastructure.Storage
} }
public void Save() public void Save()
{
lock (_saveLock)
{
try
{
string serialized = JsonSerializer.Serialize(_data, _serializerOptions);
File.WriteAllText(FilePath, serialized);
_storageHelper.Close();
Log.Info($"Saving cached data at <{FilePath}>", GetType());
}
catch (IOException e)
{
Log.Exception($"Error in saving data at <{FilePath}>", e, GetType());
}
}
}
public void Clear()
{
if (File.Exists(FilePath))
{
File.Delete(FilePath);
LoadDefault();
Log.Info($"Deleting cached data at <{FilePath}>", GetType());
}
}
public bool CheckVersionMismatch()
{
// Skip the fields check if the version hasn't changed.
// This optimization prevents unnecessary fields processing when the cache
// is already up to date, enhancing performance and reducing IO operations
if (!_storageHelper.ClearCache)
{
return false;
}
_storageHelper.ClearCache = false;
return true;
}
public bool TryLoadData()
{ {
try try
{ {
string serialized = JsonSerializer.Serialize(_data, _serializerOptions); JsonSerializer.Deserialize<T>(File.ReadAllText(FilePath), _serializerOptions);
File.WriteAllText(FilePath, serialized); return true;
_storageHelper.Close();
Log.Info($"Saving cached data at <{FilePath}>", GetType());
} }
catch (IOException e) catch (JsonException e)
{ {
Log.Exception($"Error in saving data at <{FilePath}>", e, GetType()); Log.Exception($"Error in TryLoadData at <{FilePath}>", e, GetType());
return false;
} }
} }
} }

View File

@@ -3,7 +3,9 @@
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using System.IO.Abstractions; using System.IO.Abstractions;
using System.Text.Json;
using Wox.Plugin; using Wox.Plugin;
using Wox.Plugin.Logger;
namespace Wox.Infrastructure.Storage namespace Wox.Infrastructure.Storage
{ {
@@ -23,5 +25,28 @@ namespace Wox.Infrastructure.Storage
FilePath = Path.Combine(DirectoryPath, $"{dataType.Name}{FileSuffix}"); FilePath = Path.Combine(DirectoryPath, $"{dataType.Name}{FileSuffix}");
} }
public override T Load()
{
var data = base.Load();
// Check information file for version mismatch
try
{
if (CheckVersionMismatch())
{
if (!TryLoadData())
{
Clear();
}
}
}
catch (JsonException e)
{
Log.Exception($"Error in Load of PluginJsonStorage: {e.Message}", e, GetType());
}
return data.NonNull();
}
} }
} }

View File

@@ -4,6 +4,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace Wox.Plugin namespace Wox.Plugin
@@ -73,6 +74,34 @@ namespace Wox.Plugin
} }
} }
public void Update()
{
foreach (var key in Records.Keys.ToList())
{
// Check if any of the specified fields are empty
if (string.IsNullOrEmpty(Records[key].IconPath) ||
string.IsNullOrEmpty(Records[key].Title) ||
string.IsNullOrEmpty(Records[key].SubTitle) ||
string.IsNullOrEmpty(Records[key].Search) ||
string.IsNullOrEmpty(Records[key].PluginID))
{
Records.Remove(key);
}
else
{
if (Records[key].SelectedCount == 0)
{
Records[key].SelectedCount = 1;
}
if (Records[key].LastSelected == DateTime.MinValue)
{
Records[key].LastSelected = DateTime.UtcNow;
}
}
}
}
public UserSelectedRecordItem GetSelectedData(Result result) public UserSelectedRecordItem GetSelectedData(Result result)
{ {
ArgumentNullException.ThrowIfNull(result); ArgumentNullException.ThrowIfNull(result);