Kavita/API/Data/ManualMigrations/v0.8.9/MigrateIncorrectUtcMidnightRollovers.cs
Joe Milazzo a7859e1a86
OPDS Performance Enhancements (#4332)
Co-authored-by: Amelia <77553571+Fesaa@users.noreply.github.com>
2026-01-08 07:25:05 -08:00

71 lines
2.0 KiB
C#

using System;
using System.Linq;
using System.Threading.Tasks;
using API.Data.Misc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace API.Data.ManualMigrations;
public class MigrateIncorrectUtcTimes: ManualMigration
{
private const int BatchSize = 1000;
protected override string MigrationName { get; } = nameof(MigrateIncorrectUtcTimes);
protected override async Task ExecuteAsync(DataContext context, ILogger<Program> logger)
{
var skip = 0;
var correctedEntries = 0;
while (true)
{
var batch = await context.AppUserReadingSession
.Where(s => s.EndTime != null && s.EndTimeUtc != null)
.OrderBy(s => s.Id)
.Skip(skip)
.Take(BatchSize)
.ToListAsync();
if (batch.Count == 0)
break;
foreach (var session in batch)
{
if (session.EndTimeUtc == null || session.EndTime == null)
{
continue;
}
var corrected = false;
var wantedUtc = TimeZoneInfo.ConvertTimeToUtc(session.EndTime.Value);
if (session.EndTimeUtc != wantedUtc)
{
session.EndTimeUtc = wantedUtc;
context.Entry(session).State = EntityState.Modified;
corrected = true;
}
var wantedStartUtc = TimeZoneInfo.ConvertTimeToUtc(session.StartTime);
if (session.StartTimeUtc != wantedStartUtc)
{
session.StartTimeUtc = wantedStartUtc;
context.Entry(session).State = EntityState.Modified;
corrected = true;
}
if (corrected)
correctedEntries++;
}
await context.SaveChangesAsync();
skip += BatchSize;
}
logger.LogInformation("Corrected {Count} session records", correctedEntries);
}
}