public async Task ExecuteAsync(IPluginJobContext context) { if (!CliUtils.ParseArgs(_options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } if (string.IsNullOrEmpty(_directory)) { await WriteUtils.PrintErrorAsync("Backup folder name not specified: --directory"); return; } var oldTreeInfo = new TreeInfo(_settingsManager, _directory); var newTreeInfo = new TreeInfo(_settingsManager, Folder); if (!DirectoryUtils.IsDirectoryExists(oldTreeInfo.DirectoryPath)) { await WriteUtils.PrintErrorAsync($"The backup folder does not exist: {oldTreeInfo.DirectoryPath}"); return; } DirectoryUtils.CreateDirectoryIfNotExists(newTreeInfo.DirectoryPath); _updateService.Load(oldTreeInfo, newTreeInfo); await Console.Out.WriteLineAsync($"Backup folder: {oldTreeInfo.DirectoryPath}, Update folder: {newTreeInfo.DirectoryPath}, Update to SSCMS version: {_settingsManager.Version}"); var oldTableNames = TranslateUtils.JsonDeserialize <List <string> >(await FileUtils.ReadTextAsync(oldTreeInfo.TablesFilePath, Encoding.UTF8)); var newTableNames = new List <string>(); await WriteUtils.PrintRowLineAsync(); await WriteUtils.PrintRowAsync("Backup table name", "Update table Name", "Count"); await WriteUtils.PrintRowLineAsync(); var siteIdList = new List <int>(); var tableNames = new List <string>(); UpdateUtils.LoadSites(_settingsManager, oldTreeInfo, siteIdList, tableNames); var table = new TableContentConverter(_settingsManager); var splitSiteTableDict = new Dictionary <int, TableInfo>(); if (_contentSplit) { var converter = table.GetSplitConverter(); foreach (var siteId in siteIdList) { splitSiteTableDict.Add(siteId, new TableInfo { Columns = converter.NewColumns, TotalCount = 0, RowFiles = new List <string>() }); } } foreach (var oldTableName in oldTableNames) { var oldMetadataFilePath = oldTreeInfo.GetTableMetadataFilePath(oldTableName); if (!FileUtils.IsFileExists(oldMetadataFilePath)) { continue; } var oldTableInfo = TranslateUtils.JsonDeserialize <TableInfo>(await FileUtils.ReadTextAsync(oldMetadataFilePath, Encoding.UTF8)); if (ListUtils.ContainsIgnoreCase(tableNames, oldTableName)) { if (_contentSplit) { var converter = table.GetConverter(oldTableName, oldTableInfo.Columns); await _updateService.UpdateSplitContentsTableInfoAsync(splitSiteTableDict, siteIdList, oldTableName, oldTableInfo, converter); } else { var converter = table.GetConverter(oldTableName, oldTableInfo.Columns); var tuple = await _updateService.GetNewTableInfoAsync(oldTableName, oldTableInfo, converter); if (tuple != null) { newTableNames.Add(tuple.Item1); await FileUtils.WriteTextAsync(newTreeInfo.GetTableMetadataFilePath(tuple.Item1), TranslateUtils.JsonSerialize(tuple.Item2)); } } } else { var tuple = await _updateService.UpdateTableInfoAsync(oldTableName, oldTableInfo); if (tuple != null) { newTableNames.Add(tuple.Item1); await FileUtils.WriteTextAsync(newTreeInfo.GetTableMetadataFilePath(tuple.Item1), TranslateUtils.JsonSerialize(tuple.Item2)); } } } if (_contentSplit) { foreach (var siteId in siteIdList) { var siteTableInfo = splitSiteTableDict[siteId]; var siteTableName = UpdateUtils.GetSplitContentTableName(siteId); newTableNames.Add(siteTableName); await FileUtils.WriteTextAsync(newTreeInfo.GetTableMetadataFilePath(siteTableName), TranslateUtils.JsonSerialize(siteTableInfo)); } await UpdateUtils.UpdateSitesSplitTableNameAsync(_databaseManager, newTreeInfo, splitSiteTableDict); } await FileUtils.WriteTextAsync(newTreeInfo.TablesFilePath, TranslateUtils.JsonSerialize(newTableNames)); await WriteUtils.PrintRowLineAsync(); await WriteUtils.PrintSuccessAsync("Update the backup data to the new version successfully!"); }
public async Task UpdateSplitContentsTableInfoAsync(Dictionary <int, TableInfo> splitSiteTableDict, List <int> siteIdList, string oldTableName, TableInfo oldTableInfo, ConvertInfo converter) { if (converter == null) { converter = new ConvertInfo(); } if (converter.IsAbandon) { await WriteUtils.PrintRowAsync(oldTableName, "Abandon", "--"); return; } if (converter.NewColumns == null || converter.NewColumns.Count == 0) { converter.NewColumns = oldTableInfo.Columns; } await WriteUtils.PrintRowAsync(oldTableName, "#split-content#", oldTableInfo.TotalCount.ToString("#,0")); if (oldTableInfo.RowFiles.Count > 0) { var i = 0; using var progress = new ProgressBar(); foreach (var fileName in oldTableInfo.RowFiles) { progress.Report((double)i++ / oldTableInfo.RowFiles.Count); var newRows = new List <Dictionary <string, object> >(); var oldFilePath = OldTreeInfo.GetTableContentFilePath(oldTableName, fileName); var oldRows = TranslateUtils.JsonDeserialize <List <JObject> >(await FileUtils.ReadTextAsync(oldFilePath, Encoding.UTF8)); newRows.AddRange(UpdateUtils.UpdateRows(oldRows, converter.ConvertKeyDict, converter.ConvertValueDict, converter.Process)); var siteIdWithRows = new Dictionary <int, List <Dictionary <string, object> > >(); foreach (var siteId in siteIdList) { siteIdWithRows.Add(siteId, new List <Dictionary <string, object> >()); } foreach (var newRow in newRows) { if (newRow.ContainsKey(nameof(Content.SiteId))) { var siteId = Convert.ToInt32(newRow[nameof(Content.SiteId)]); if (siteIdList.Contains(siteId)) { var rows = siteIdWithRows[siteId]; rows.Add(newRow); } } } foreach (var siteId in siteIdList) { var siteRows = siteIdWithRows[siteId]; var siteTableName = UpdateUtils.GetSplitContentTableName(siteId); var siteTableInfo = splitSiteTableDict[siteId]; siteTableInfo.TotalCount += siteRows.Count; foreach (var tableColumn in converter.NewColumns) { if (!siteTableInfo.Columns.Any(t => StringUtils.EqualsIgnoreCase(t.AttributeName, tableColumn.AttributeName))) { siteTableInfo.Columns.Add(tableColumn); } } if (siteRows.Count > 0) { var siteTableFileName = $"{siteTableInfo.RowFiles.Count + 1}.json"; siteTableInfo.RowFiles.Add(siteTableFileName); var filePath = NewTreeInfo.GetTableContentFilePath(siteTableName, siteTableFileName); await FileUtils.WriteTextAsync(filePath, TranslateUtils.JsonSerialize(siteRows)); } } } } }