added database to store metadata
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using ParadoxSaveParser.WebAPI.SaveDataFilters;
|
||||
using ParadoxSaveParser.WebAPI.Database;
|
||||
using ParadoxSaveParser.WebAPI.SaveDataFilters;
|
||||
|
||||
namespace ParadoxSaveParser.WebAPI.BackgroundTasks;
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using System.IO.Compression;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Linq;
|
||||
using System.Text.Encodings.Web;
|
||||
using System.Text.Json.Serialization;
|
||||
using ParadoxSaveParser.WebAPI.Database;
|
||||
using ParadoxSaveParser.WebAPI.SaveDataFilters;
|
||||
|
||||
namespace ParadoxSaveParser.WebAPI.BackgroundTasks;
|
||||
@@ -13,9 +15,9 @@ public class SaveParsingOperation
|
||||
private readonly SaveFileMetadata _meta;
|
||||
private readonly ISaveDataFilter _filter;
|
||||
private readonly ContextLogger _logger;
|
||||
private readonly CancellationToken _cancelToken;
|
||||
private readonly CancellationToken _ct;
|
||||
|
||||
private static readonly JsonSerializerOptions _saveSerializerOptions = new()
|
||||
private static readonly JsonSerializerOptions _jsonOptions = new()
|
||||
{
|
||||
WriteIndented = false,
|
||||
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
|
||||
@@ -24,13 +26,13 @@ public class SaveParsingOperation
|
||||
};
|
||||
|
||||
public SaveParsingOperation(long operationId, SaveFileMetadata meta, ISaveDataFilter filter,
|
||||
ContextLogger logger, CancellationToken cancelToken)
|
||||
ContextLogger logger, CancellationToken ct)
|
||||
{
|
||||
OperationId = operationId;
|
||||
_meta = meta;
|
||||
_filter = filter;
|
||||
_logger = logger;
|
||||
_cancelToken = cancelToken;
|
||||
_ct = ct;
|
||||
}
|
||||
|
||||
public async void StartAsync()
|
||||
@@ -52,7 +54,14 @@ public class SaveParsingOperation
|
||||
{
|
||||
string errorMesage = ex.ToStringDemystified();
|
||||
_logger.LogError(errorMesage);
|
||||
_meta.errorMessage = errorMesage;
|
||||
try
|
||||
{
|
||||
await Program.DB.SetMetadataError(_meta, errorMesage);
|
||||
}
|
||||
catch (Exception ex2)
|
||||
{
|
||||
_logger.LogError(ex2);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -63,30 +72,31 @@ public class SaveParsingOperation
|
||||
private async Task ParseSaveEU4()
|
||||
{
|
||||
// wait for save file closing
|
||||
await Task.Delay(200, _cancelToken);
|
||||
string extractedGamestatePath = PathHelper.GetSaveFilePath(_meta.id) + ".gamestate";
|
||||
using (var zipArchive = ZipFile.Open(PathHelper.GetSaveFilePath(_meta.id).Str, ZipArchiveMode.Read))
|
||||
await Task.Delay(200, _ct);
|
||||
Dictionary<string, object> parsedData;
|
||||
await using (var gamestateStream = PathHelper.CreateTempFile())
|
||||
{
|
||||
var zipEntry = zipArchive.Entries.FirstOrDefault(e => e.Name == "gamestate");
|
||||
if (zipEntry is null)
|
||||
throw new Exception("Invalid save format: no 'gamestate' file found");
|
||||
using (var zipArchive = ZipFile.Open(_meta.GetSaveFilePath().Str, ZipArchiveMode.Read))
|
||||
{
|
||||
var zipEntry = zipArchive.Entries.FirstOrDefault(e => e.Name == "gamestate");
|
||||
if (zipEntry is null)
|
||||
throw new Exception("Invalid save format: no 'gamestate' file found");
|
||||
|
||||
zipEntry.ExtractToFile(extractedGamestatePath, true);
|
||||
await zipEntry.Open().CopyToAsync(gamestateStream, _ct);
|
||||
gamestateStream.Seek(0, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
await Program.DB.UpdateMetadataStatus(_meta, SaveFileProcessingStatus.Parsing);
|
||||
var parser = new SaveParserEU4(gamestateStream, _filter.SearchExpression);
|
||||
parsedData = parser.Parse();
|
||||
}
|
||||
|
||||
var gamestateStream = File.OpenRead(extractedGamestatePath);
|
||||
_filter.Apply(parsedData);
|
||||
|
||||
_meta.status = SaveFileProcessingStatus.Parsing;
|
||||
var parser = new SaveParserEU4(gamestateStream, _filter.SearchExpression);
|
||||
var result = parser.Parse();
|
||||
_filter.Apply(result);
|
||||
|
||||
_meta.status = SaveFileProcessingStatus.SavingResults;
|
||||
var resultFilePath = PathHelper.GetParsedSaveFilePath(_meta.id);
|
||||
await using var resultFile = File.OpenWrite(resultFilePath);
|
||||
await JsonSerializer.SerializeAsync(resultFile, result,
|
||||
_saveSerializerOptions, _cancelToken);
|
||||
_meta.status = SaveFileProcessingStatus.Done;
|
||||
_meta.SaveToFile();
|
||||
await Program.DB.UpdateMetadataStatus(_meta, SaveFileProcessingStatus.SavingResults);
|
||||
var resultFilePath = _meta.GetParsedDataPath();
|
||||
await using (var resultFile = File.OpenWrite(resultFilePath))
|
||||
await JsonSerializer.SerializeAsync(resultFile, parsedData, _jsonOptions, _ct);
|
||||
await Program.DB.UpdateMetadataStatus(_meta, SaveFileProcessingStatus.Done);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user