diff --git a/Pal.Client/Configuration/ConfigurationData.cs b/Pal.Client/Configuration/ConfigurationData.cs index 9fc3536..6696d07 100644 --- a/Pal.Client/Configuration/ConfigurationData.cs +++ b/Pal.Client/Configuration/ConfigurationData.cs @@ -1,9 +1,7 @@ -using Dalamud.Logging; -using System; +using System; using System.Linq; using System.Security.Cryptography; using Microsoft.Extensions.Logging; -using Pal.Client.DependencyInjection.Logging; namespace Pal.Client.Configuration { diff --git a/Pal.Client/DependencyContextInitializer.cs b/Pal.Client/DependencyContextInitializer.cs index 5af93c4..8308f3f 100644 --- a/Pal.Client/DependencyContextInitializer.cs +++ b/Pal.Client/DependencyContextInitializer.cs @@ -114,7 +114,7 @@ namespace Pal.Client var toDelete = backupFiles.OrderByDescending(x => x.Date) .Skip(configuration.Backups.MinimumBackupsToKeep) - .Where(x => (DateTime.Today.ToUniversalTime() - x.Date).Days > configuration.Backups.DaysToDeleteAfter) + .Where(x => (DateTime.Now.ToUniversalTime() - x.Date).Days > configuration.Backups.DaysToDeleteAfter) .Select(x => x.Path); foreach (var path in toDelete) { @@ -136,21 +136,28 @@ namespace Pal.Client var pluginInterface = scope.ServiceProvider.GetRequiredService(); string backupPath = Path.Join(pluginInterface.GetPluginConfigDirectory(), - $"backup-{DateTime.Today.ToUniversalTime():yyyy-MM-dd}.data.sqlite3"); + $"backup-{DateTime.Now.ToUniversalTime():yyyy-MM-dd}.data.sqlite3"); string sourcePath = Path.Join(pluginInterface.GetPluginConfigDirectory(), DependencyInjectionContext.DatabaseFileName); if (File.Exists(sourcePath) && !File.Exists(backupPath)) { - if (File.Exists(sourcePath + "-shm") || File.Exists(sourcePath + "-wal")) - { - _logger.LogWarning("Could not create backup, database is open in another program"); - return; - } - - _logger.LogInformation("Creating database backup '{Path}'", backupPath); try { - File.Copy(sourcePath, backupPath); + if (File.Exists(sourcePath + "-shm") || File.Exists(sourcePath + "-wal")) + { + _logger.LogInformation("Creating database backup '{Path}' (open db)", backupPath); + await using var db = scope.ServiceProvider.GetRequiredService(); + await using SqliteConnection source = new(db.Database.GetConnectionString()); + await source.OpenAsync(); + await using SqliteConnection backup = new($"Data Source={backupPath}"); + source.BackupDatabase(backup); + SqliteConnection.ClearPool(backup); + } + else + { + _logger.LogInformation("Creating database backup '{Path}' (file copy)", backupPath); + File.Copy(sourcePath, backupPath); + } } catch (Exception e) {