Files
Argus/Infrastructure/SqliteSchemaMigrator.cs
T
Курнат Андрей 5f80c4bf6a Initial Argus web catalog
2026-06-20 19:55:11 +03:00

68 lines
1.8 KiB
C#

using System.Data;
using Argus.Data;
using Microsoft.EntityFrameworkCore;
namespace Argus.Infrastructure;
public static class SqliteSchemaMigrator
{
public static async Task EnsureCurrentSchemaAsync(
ArgusDbContext dbContext,
CancellationToken cancellationToken = default)
{
await dbContext.Database.EnsureCreatedAsync(cancellationToken);
await ExecuteNonQueryAsync(
dbContext,
"""
CREATE INDEX IF NOT EXISTS "IX_Apps_IsListed_Name"
ON "Apps" ("IsListed", "Name")
""",
cancellationToken);
await ExecuteNonQueryAsync(
dbContext,
"""
CREATE INDEX IF NOT EXISTS "IX_Releases_PublishedAt"
ON "Releases" ("PublishedAt")
""",
cancellationToken);
await ExecuteNonQueryAsync(
dbContext,
"""
CREATE INDEX IF NOT EXISTS "IX_Releases_CatalogAppId_PublishedAt"
ON "Releases" ("CatalogAppId", "PublishedAt")
""",
cancellationToken);
}
private static async Task ExecuteNonQueryAsync(
ArgusDbContext dbContext,
string commandText,
CancellationToken cancellationToken)
{
var connection = dbContext.Database.GetDbConnection();
var mustClose = connection.State != ConnectionState.Open;
if (mustClose)
{
await connection.OpenAsync(cancellationToken);
}
try
{
await using var command = connection.CreateCommand();
command.CommandText = commandText;
await command.ExecuteNonQueryAsync(cancellationToken);
}
finally
{
if (mustClose)
{
await connection.CloseAsync();
}
}
}
}