using System;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Threading.Tasks;
using ColdMint.scripts.database;
using ColdMint.scripts.database.dataPackEntity;
using ColdMint.scripts.dataPack.local;
using ColdMint.scripts.serialization;
namespace ColdMint.scripts.dataPack.entryLoader;
///
/// Load the manifest file in the zip package and write it to the data table
/// 在zip包内加载清单文件,将其写入数据表
///
public class DataPackManifestLoader : IEntryLoader
{
public string Namespace => _namespace;
//清单文件的命名空间
private string _namespace;
public bool NeedLoad(ZipArchiveEntry archiveEntry)
{
return archiveEntry.FullName == Config.DataPackManifestName;
}
public async Task ExecutionLoad(string namespaceString, string zipFileName, DataPackDbContext dataPackDbContext,
ZipArchiveEntry archiveEntry)
{
//Do not use namespaceString within the DataPackManifestLoader's ExecutionLoad method, as this value is assigned in the following code.
//不要在DataPackManifestLoader的ExecutionLoad方法内使用namespaceString,因为这个值是在下面的代码内赋值的。
var nowDateTime = DateTime.Now;
IDataPackManifest? dataPackManifest = null;
//When the manifest file is obtained, load the file information
//在获取到清单文件时,加载文件信息
await using (var stream = archiveEntry.Open())
{
var localDataPackManifest =
await JsonSerialization.ReadJsonFileToObj(stream);
if (localDataPackManifest == null)
{
dataPackManifest = EmptyManifest.CreateEmptyManifest(zipFileName);
}
else
{
dataPackManifest = localDataPackManifest;
}
}
if (dataPackManifest != null)
{
var dataPackInfoDbSet = dataPackDbContext.DataPackInfo;
var dataPackQuery = from dataPack in dataPackInfoDbSet
where dataPack.ZipFileName == zipFileName
select dataPack;
var oldDataPackInfo = dataPackQuery.FirstOrDefault();
if (oldDataPackInfo == null)
{
//There was no list to record before, create one.
//之前没有清单记录,创建一份。
await dataPackDbContext.DataPackInfo.AddAsync(new DataPackInfo
{
ID = dataPackManifest.ID,
Author = dataPackManifest.Author,
Description = dataPackManifest.Description,
Name = dataPackManifest.Name,
Namespace = dataPackManifest.Namespace,
VersionCode = dataPackManifest.VersionCode,
VersionName = dataPackManifest.VersionName,
ZipFileName = zipFileName,
UpdateTime = nowDateTime,
CrateTime = nowDateTime
});
}
else
{
//It's already on the record. Update.
//已经有记录了,更新。
oldDataPackInfo.Name = dataPackManifest.Name;
oldDataPackInfo.Author = dataPackManifest.Author;
oldDataPackInfo.Description = dataPackManifest.Description;
oldDataPackInfo.Namespace = dataPackManifest.Namespace;
oldDataPackInfo.VersionCode = dataPackManifest.VersionCode;
oldDataPackInfo.VersionName = dataPackManifest.VersionName;
oldDataPackInfo.UpdateTime = nowDateTime;
dataPackDbContext.DataPackInfo.Update(oldDataPackInfo);
}
_namespace = dataPackManifest.Namespace ?? string.Empty;
}
}
}