From d897e44f3b926df165625c6de60838fbc9b46124 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 29 Feb 2024 02:03:41 +0100 Subject: [PATCH] AppDbUpdater: Actually check foreign key violations after updating --- Elwig/Helpers/AppDbContext.cs | 16 ++++++++++++++++ Elwig/Helpers/AppDbUpdater.cs | 7 ++++++- Elwig/Resources/Sql/17-18.sql | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Elwig/Helpers/AppDbContext.cs b/Elwig/Helpers/AppDbContext.cs index e06fa77..5be781e 100644 --- a/Elwig/Helpers/AppDbContext.cs +++ b/Elwig/Helpers/AppDbContext.cs @@ -11,6 +11,7 @@ using System.Text.RegularExpressions; using System.Collections.Generic; using Elwig.Models.Dtos; using System.Reflection; +using System.Data; namespace Elwig.Helpers { @@ -123,6 +124,21 @@ namespace Elwig.Helpers { return await cmd.ExecuteScalarAsync(); } + public static async Task<(string Table, long RowId, string Parent, long FkId)[]> ForeignKeyCheck(SqliteConnection cnx) { + using var cmd = cnx.CreateCommand(); + cmd.CommandText = "PRAGMA foreign_key_check"; + using var reader = await cmd.ExecuteReaderAsync(); + var list = new List<(string, long, string, long)>(); + while (await reader.ReadAsync()) { + var table = reader.GetString(0); + var rowid = reader.GetInt64(1); + var parent = reader.GetString(2); + var fkid = reader.GetInt64(3); + list.Add((table, rowid, parent, fkid)); + } + return [.. list]; + } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite(ConnectionString); optionsBuilder.UseLazyLoadingProxies(); diff --git a/Elwig/Helpers/AppDbUpdater.cs b/Elwig/Helpers/AppDbUpdater.cs index 0a3c6ca..76dfb50 100644 --- a/Elwig/Helpers/AppDbUpdater.cs +++ b/Elwig/Helpers/AppDbUpdater.cs @@ -79,8 +79,13 @@ namespace Elwig.Helpers { foreach (var script in toExecute) { await AppDbContext.ExecuteEmbeddedScript(cnx, asm, script); } + var violations = await AppDbContext.ForeignKeyCheck(cnx); + if (violations.Length > 0) { + throw new Exception($"Foreign key violations ({violations.Length}):\n" + string.Join("\n", violations + .Select(v => $"{v.Table} - {v.RowId} - {v.Parent} - {v.FkId}"))); + } + await AppDbContext.ExecuteBatch(cnx, $""" - PRAGMA foreign_key_check; COMMIT; PRAGMA foreign_keys = ON; VACUUM; diff --git a/Elwig/Resources/Sql/17-18.sql b/Elwig/Resources/Sql/17-18.sql index 8bf793a..c14054c 100644 --- a/Elwig/Resources/Sql/17-18.sql +++ b/Elwig/Resources/Sql/17-18.sql @@ -84,6 +84,7 @@ UPDATE area_commitment SET cultid = NULL WHERE cultid = 'N'; DELETE FROM wine_cultivation WHERE cultid = 'N'; UPDATE wine_cultivation SET cultid = 'B', name = 'Bio', description = 'AT-BIO-302' WHERE cultid = 'BIO'; UPDATE wine_cultivation SET description = 'Kontrollierte Integrierte Produktion' WHERE cultid = 'KIP'; +UPDATE area_commitment SET cultid = 'B' WHERE cultid = 'BIO'; UPDATE area_commitment SET cultid = 'B', vtrgid = SUBSTR(vtrgid, 1, 2) WHERE vtrgid LIKE '__B'; UPDATE area_commitment SET cultid = 'B' WHERE vtrgid LIKE '__HU';