public async Task RunAsync(IJobContext context) { if (!CliUtils.ParseArgs(_options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } var version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); await Console.Out.WriteLineAsync($"SiteServer CLI 版本号: {version.Substring(0, version.Length - 2)}"); await Console.Out.WriteLineAsync($"当前文件夹: {_settings.ContentRootPath}"); await Console.Out.WriteLineAsync(); await Console.Out.WriteLineAsync($"数据库类型: {_settings.Database.DatabaseType.GetValue()}"); await Console.Out.WriteLineAsync($"连接字符串: {_settings.Database.ConnectionString}"); var(isConnectionWorks, errorMessage) = await CliUtils.CheckSettingsAsync(_settings); if (!isConnectionWorks) { await Console.Out.WriteLineAsync($"数据库连接错误: {errorMessage}"); } else { await Console.Out.WriteLineAsync("数据库连接成功!"); } }
public async Task RunAsync(IJobContext context) { if (!CliUtils.ParseArgs(_options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } var version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); await Console.Out.WriteLineAsync($"SiteServer CLI 版本号: {version.Substring(0, version.Length - 2)}"); await Console.Out.WriteLineAsync($"当前文件夹: {_settings.ContentRootPath}"); await Console.Out.WriteLineAsync(); var(isConnectionWorks, errorMessage) = await CliUtils.CheckSettingsAsync(_settings); if (!isConnectionWorks) { try { var cmsVersion = FileVersionInfo.GetVersionInfo(Path.Combine(_settings.ContentRootPath, "Bin", "SiteServer.CMS.dll")).ProductVersion; await Console.Out.WriteLineAsync($"SitServer CMS Version: {cmsVersion}"); } catch { // ignored } await Console.Out.WriteLineAsync($"数据库类型: {_settings.Database.DatabaseType.GetValue()}"); await Console.Out.WriteLineAsync($"连接字符串: {_settings.Database.ConnectionString}"); } }
private async Task RunAsync(IJobContext context) { if (!CliUtils.ParseArgs(_options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } var directory = _directory; if (string.IsNullOrEmpty(directory)) { directory = $"backup/{DateTime.Now:yyyy-MM-dd}"; } var treeInfo = new TreeInfo(_settings.ContentRootPath, directory); if (!Directory.Exists(treeInfo.DirectoryPath)) { Directory.CreateDirectory(treeInfo.DirectoryPath); } var(isConnectionWorks, errorMessage) = await CliUtils.CheckSettingsAsync(_settings); if (!isConnectionWorks) { await CliUtils.PrintErrorAsync(errorMessage); return; } await Console.Out.WriteLineAsync($"数据库类型: {_settings.Database.DatabaseType.GetDisplayName()}"); await Console.Out.WriteLineAsync($"连接字符串: {_settings.Database.ConnectionString}"); await Console.Out.WriteLineAsync($"备份文件夹: {treeInfo.DirectoryPath}"); var includes = new List <string>(_settings.Includes); var excludes = new List <string>(_settings.Excludes); var allTableNames = await _settings.Database.GetTableNamesAsync(); var tableNames = new List <string>(); foreach (var tableName in allTableNames) { if (includes.Count > 0 && !Utilities.ContainsIgnoreCase(includes, tableName)) { continue; } if (excludes.Count > 0 && Utilities.ContainsIgnoreCase(excludes, tableName)) { continue; } if (Utilities.ContainsIgnoreCase(tableNames, tableName)) { continue; } tableNames.Add(tableName); } await CliUtils.WriteAllTextAsync(treeInfo.TablesFilePath, Utilities.JsonSerialize(tableNames)); await CliUtils.PrintRowLineAsync(); await CliUtils.PrintRowAsync("备份表名称", "总条数"); await CliUtils.PrintRowLineAsync(); foreach (var tableName in tableNames) { treeInfo.CreateTableDirectoryPath(tableName); var repository = new Repository(_settings.Database, tableName); var tableInfo = new TableInfo { Columns = await _settings.Database.GetTableColumnsAsync(tableName), TotalCount = await repository.CountAsync(), RowFiles = new List <string>() }; if (_maxRows > 0 && tableInfo.TotalCount > _maxRows) { tableInfo.TotalCount = _maxRows; } await CliUtils.PrintRowAsync(tableName, tableInfo.TotalCount.ToString("#,0")); var identityColumnName = await _settings.Database.AddIdentityColumnIdIfNotExistsAsync(tableName, tableInfo.Columns); if (tableInfo.TotalCount > 0) { var current = 1; if (tableInfo.TotalCount > CliUtils.PageSize) { var pageCount = (int)Math.Ceiling((double)tableInfo.TotalCount / CliUtils.PageSize); using (var progress = new ProgressBar()) { for (; current <= pageCount; current++) { progress.Report((double)(current - 1) / pageCount); var fileName = $"{current}.json"; tableInfo.RowFiles.Add(fileName); var offset = (current - 1) * CliUtils.PageSize; var limit = tableInfo.TotalCount - offset < CliUtils.PageSize ? tableInfo.TotalCount - offset : CliUtils.PageSize; var rows = GetPageObjects(repository.Database, tableName, identityColumnName, offset, limit); await CliUtils.WriteAllTextAsync(treeInfo.GetTableContentFilePath(tableName, fileName), Utilities.JsonSerialize(rows)); } } } else { var fileName = $"{current}.json"; tableInfo.RowFiles.Add(fileName); var rows = GetObjects(repository.Database, tableName); await CliUtils.WriteAllTextAsync(treeInfo.GetTableContentFilePath(tableName, fileName), Utilities.JsonSerialize(rows)); } } await CliUtils.WriteAllTextAsync(treeInfo.GetTableMetadataFilePath(tableName), Utilities.JsonSerialize(tableInfo)); } await CliUtils.PrintRowLineAsync(); await Console.Out.WriteLineAsync($"恭喜,成功备份数据库至文件夹:{treeInfo.DirectoryPath}!"); }
private async Task RunAsync(IJobContext context) { if (!CliUtils.ParseArgs(_options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } if (string.IsNullOrEmpty(_directory)) { await CliUtils.PrintErrorAsync("需要指定恢复数据的文件夹名称:directory"); return; } var treeInfo = new TreeInfo(_settings.ContentRootPath, _directory); if (!Directory.Exists(treeInfo.DirectoryPath)) { await CliUtils.PrintErrorAsync($"恢复数据的文件夹 {treeInfo.DirectoryPath} 不存在"); return; } var tablesFilePath = treeInfo.TablesFilePath; if (!CliUtils.FileExists(tablesFilePath)) { await CliUtils.PrintErrorAsync($"恢复文件 {treeInfo.TablesFilePath} 不存在"); return; } var(isConnectionWorks, errorMessage) = await CliUtils.CheckSettingsAsync(_settings); if (!isConnectionWorks) { await CliUtils.PrintErrorAsync(errorMessage); return; } await Console.Out.WriteLineAsync($"数据库类型: {_settings.Database.DatabaseType.GetDisplayName()}"); await Console.Out.WriteLineAsync($"连接字符串: {_settings.Database.ConnectionString}"); await Console.Out.WriteLineAsync($"恢复文件夹: {treeInfo.DirectoryPath}"); var tableNames = Utilities.JsonDeserialize <List <string> >(await CliUtils.ReadAllTextAsync(tablesFilePath)); await CliUtils.PrintRowLineAsync(); await CliUtils.PrintRowAsync("恢复表名称", "总条数"); await CliUtils.PrintRowLineAsync(); var includes = new List <string>(_settings.Includes); var excludes = new List <string>(_settings.Excludes); var errorLogFilePath = CliUtils.CreateErrorLogFile(_settings.ContentRootPath, CommandName); foreach (var tableName in tableNames) { try { if (includes.Count > 0 && !Utilities.ContainsIgnoreCase(includes, tableName)) { continue; } if (excludes.Count > 0 && Utilities.ContainsIgnoreCase(excludes, tableName)) { continue; } var metadataFilePath = treeInfo.GetTableMetadataFilePath(tableName); if (!CliUtils.FileExists(metadataFilePath)) { continue; } var tableInfo = Utilities.JsonDeserialize <TableInfo>(await CliUtils.ReadAllTextAsync(metadataFilePath)); var repository = new Repository(_settings.Database, tableName, tableInfo.Columns); await CliUtils.PrintRowAsync(tableName, tableInfo.TotalCount.ToString("#,0")); if (!await _settings.Database.IsTableExistsAsync(tableName)) { try { await _settings.Database.CreateTableAsync(tableName, tableInfo.Columns); } catch (Exception ex) { await CliUtils.AppendErrorLogAsync(errorLogFilePath, new TextLogInfo { DateTime = DateTime.Now, Detail = $"创建表 {tableName}", Exception = ex }); continue; } } else { await _settings.Database.AlterTableAsync(tableName, tableInfo.Columns); } if (tableInfo.RowFiles.Count > 0) { using (var progress = new ProgressBar()) { for (var i = 0; i < tableInfo.RowFiles.Count; i++) { progress.Report((double)i / tableInfo.RowFiles.Count); var fileName = tableInfo.RowFiles[i]; var objects = Utilities.JsonDeserialize <List <JObject> >( await CliUtils.ReadAllTextAsync(treeInfo.GetTableContentFilePath(tableName, fileName))); try { await repository.BulkInsertAsync(objects); } catch (Exception ex) { await CliUtils.AppendErrorLogAsync(errorLogFilePath, new TextLogInfo { DateTime = DateTime.Now, Detail = $"插入表 {tableName}, 文件名 {fileName}", Exception = ex }); } } } } } catch (Exception ex) { await CliUtils.AppendErrorLogAsync(errorLogFilePath, new TextLogInfo { DateTime = DateTime.Now, Detail = $"插入表 {tableName}", Exception = ex }); } } await CliUtils.PrintRowLineAsync(); await Console.Out.WriteLineAsync($"恭喜,成功从文件夹:{treeInfo.DirectoryPath} 恢复数据!"); }