Db: Make backups work for open databases
This commit is contained in:
parent
f02aeffb26
commit
17f7dcdf12
@ -1,9 +1,7 @@
|
|||||||
using Dalamud.Logging;
|
using System;
|
||||||
using System;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Pal.Client.DependencyInjection.Logging;
|
|
||||||
|
|
||||||
namespace Pal.Client.Configuration
|
namespace Pal.Client.Configuration
|
||||||
{
|
{
|
||||||
|
@ -114,7 +114,7 @@ namespace Pal.Client
|
|||||||
|
|
||||||
var toDelete = backupFiles.OrderByDescending(x => x.Date)
|
var toDelete = backupFiles.OrderByDescending(x => x.Date)
|
||||||
.Skip(configuration.Backups.MinimumBackupsToKeep)
|
.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);
|
.Select(x => x.Path);
|
||||||
foreach (var path in toDelete)
|
foreach (var path in toDelete)
|
||||||
{
|
{
|
||||||
@ -136,21 +136,28 @@ namespace Pal.Client
|
|||||||
|
|
||||||
var pluginInterface = scope.ServiceProvider.GetRequiredService<DalamudPluginInterface>();
|
var pluginInterface = scope.ServiceProvider.GetRequiredService<DalamudPluginInterface>();
|
||||||
string backupPath = Path.Join(pluginInterface.GetPluginConfigDirectory(),
|
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(),
|
string sourcePath = Path.Join(pluginInterface.GetPluginConfigDirectory(),
|
||||||
DependencyInjectionContext.DatabaseFileName);
|
DependencyInjectionContext.DatabaseFileName);
|
||||||
if (File.Exists(sourcePath) && !File.Exists(backupPath))
|
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
|
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<PalClientContext>();
|
||||||
|
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)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user