DocSpace-buildtools/common/services/ASC.Data.Backup/Tasks/DeletePortalTask.cs
SuhorukovAnton 6acb0d4208 creating
2020-05-20 18:14:44 +03:00

109 lines
5.1 KiB
C#

/*
*
* (c) Copyright Ascensio System Limited 2010-2020
*
* This program is freeware. You can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html).
* In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that
* Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights.
*
* THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR
* FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html
*
* You can contact Ascensio System SIA by email at sales@onlyoffice.com
*
* The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display
* Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3.
*
* Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains
* relevant author attributions when distributing the software. If the display of the logo in its graphic
* form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE"
* in every copy of the program you distribute.
* Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks.
*
*/
using System.Collections.Generic;
using System.Linq;
using ASC.Common.Logging;
using ASC.Data.Backup.Exceptions;
using ASC.Data.Backup.Extensions;
using ASC.Data.Backup.Tasks.Data;
using ASC.Data.Backup.Tasks.Modules;
using ASC.Data.Storage;
using Microsoft.Extensions.Options;
namespace ASC.Data.Backup.Tasks
{
public class DeletePortalTask : PortalTaskBase
{
private StorageFactory storageFactory;
private StorageFactoryConfig storageFactoryConfig;
public DeletePortalTask(IOptionsMonitor<ILog> options, int tenantId, string configPath, StorageFactory storageFactory, StorageFactoryConfig storageFactoryConfig)
: base(options, tenantId, configPath, storageFactory , storageFactoryConfig)
{
this.storageFactory = storageFactory;
this.storageFactoryConfig = storageFactoryConfig;
}
public override void RunJob()
{
Logger.DebugFormat("begin delete {0}", TenantId);
List<IModuleSpecifics> modulesToProcess = GetModulesToProcess().Reverse().ToList();
SetStepsCount(ProcessStorage ? modulesToProcess.Count + 1 : modulesToProcess.Count);
var dbFactory = new DbFactory(ConfigPath);
foreach (var module in modulesToProcess)
{
DoDeleteModule(dbFactory, module);
}
if (ProcessStorage)
{
DoDeleteStorage();
}
Logger.DebugFormat("end delete {0}", TenantId);
}
private void DoDeleteModule(DbFactory dbFactory, IModuleSpecifics module)
{
Logger.DebugFormat("begin delete data for module ({0})", module.ModuleName);
int tablesCount = module.Tables.Count();
int tablesProcessed = 0;
using (var connection = dbFactory.OpenConnection())
{
foreach (var table in module.GetTablesOrdered().Reverse().Where(t => !IgnoredTables.Contains(t.Name)))
{
ActionInvoker.Try(state =>
{
var t = (TableInfo)state;
module.CreateDeleteCommand(connection.Fix(), TenantId, t).WithTimeout(120).ExecuteNonQuery();
}, table, 5, onFailure: error => { throw ThrowHelper.CantDeleteTable(table.Name, error); });
SetCurrentStepProgress((int)((++tablesProcessed*100)/(double)tablesCount));
}
}
Logger.DebugFormat("end delete data for module ({0})", module.ModuleName);
}
private void DoDeleteStorage()
{
Logger.Debug("begin delete storage");
List<string> storageModules = storageFactoryConfig.GetModuleList(ConfigPath).Where(IsStorageModuleAllowed).ToList();
int modulesProcessed = 0;
foreach (string module in storageModules)
{
IDataStore storage = storageFactory.GetStorage(ConfigPath, TenantId.ToString(), module);
List<string> domains = storageFactoryConfig.GetDomainList(ConfigPath, module).ToList();
foreach (var domain in domains)
{
ActionInvoker.Try(state => storage.DeleteFiles((string)state, "\\", "*.*", true), domain, 5,
onFailure: error => Logger.WarnFormat("Can't delete files for domain {0}: \r\n{1}", domain, error));
}
storage.DeleteFiles("\\", "*.*", true);
SetCurrentStepProgress((int)((++modulesProcessed*100)/(double)storageModules.Count));
}
Logger.Debug("end delete storage");
}
}
}