From ab61edc402e66a7efce27c20a6ec4676d22a21aa Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Fri, 5 Jan 2024 10:20:53 +0100 Subject: [PATCH] AppDbUpdater: Using async/await --- Elwig/App.xaml.cs | 4 +- Elwig/Helpers/AppDbUpdater.cs | 353 +++++++++++++++++----------------- 2 files changed, 179 insertions(+), 178 deletions(-) diff --git a/Elwig/App.xaml.cs b/Elwig/App.xaml.cs index eeb3805..bd45359 100644 --- a/Elwig/App.xaml.cs +++ b/Elwig/App.xaml.cs @@ -66,7 +66,7 @@ namespace Elwig { CurrentApp = this; } - protected override void OnStartup(StartupEventArgs evt) { + protected override async void OnStartup(StartupEventArgs evt) { var locale = new CultureInfo("de-AT"); locale.NumberFormat.CurrencyGroupSeparator = "\u202f"; locale.NumberFormat.NumberGroupSeparator = "\u202f"; @@ -83,7 +83,7 @@ namespace Elwig { Version = typeof(App).GetTypeInfo().Assembly.GetCustomAttribute()?.InformationalVersion.Split("+")[0] ?? "0.0.0"; try { - AppDbUpdater.CheckDb(); + await AppDbUpdater.CheckDb(); } catch (Exception e) { MessageBox.Show($"Invalid Database:\n\n{e.Message}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error); Shutdown(); diff --git a/Elwig/Helpers/AppDbUpdater.cs b/Elwig/Helpers/AppDbUpdater.cs index 9c7b65a..2c1d5d1 100644 --- a/Elwig/Helpers/AppDbUpdater.cs +++ b/Elwig/Helpers/AppDbUpdater.cs @@ -1,5 +1,6 @@ using Microsoft.Data.Sqlite; using System; +using System.Threading.Tasks; namespace Elwig.Helpers { public static class AppDbUpdater { @@ -7,39 +8,39 @@ namespace Elwig.Helpers { public static readonly int RequiredSchemaVersion = 12; private static int _versionOffset = 0; - private static readonly Action[] _updaters = [ + private static readonly Func[] _updaters = [ UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3, UpdateDbSchema_3_To_4, UpdateDbSchema_4_To_5, UpdateDbSchema_5_To_6, UpdateDBSchema_6_To_7, UpdateDbSchema_7_To_8, UpdateDbSchema_8_To_9, UpdateDbSchema_9_To_10, UpdateDbSchema_10_To_11, UpdateDbSchema_11_To_12, ]; - private static void ExecuteNonQuery(SqliteConnection cnx, string sql) { + private static async Task ExNonQuery(SqliteConnection cnx, string sql) { using var cmd = cnx.CreateCommand(); cmd.CommandText = sql; - cmd.ExecuteNonQuery(); + await cmd.ExecuteNonQueryAsync(); } - private static object? ExecuteScalar(SqliteConnection cnx, string sql) { + private static async Task ExScalar(SqliteConnection cnx, string sql) { using var cmd = cnx.CreateCommand(); cmd.CommandText = sql; - return cmd.ExecuteScalar(); + return await cmd.ExecuteScalarAsync(); } - public static string CheckDb() { + public static async Task CheckDb() { using var cnx = AppDbContext.Connect(); - var applId = (long?)ExecuteScalar(cnx, "PRAGMA application_id") ?? 0; + var applId = (long?)await ExScalar(cnx, "PRAGMA application_id") ?? 0; if (applId != 0x454C5747) throw new Exception("Invalid application_id of database"); - var schemaVers = (long?)ExecuteScalar(cnx, "PRAGMA schema_version") ?? 0; + var schemaVers = (long?)await ExScalar(cnx, "PRAGMA schema_version") ?? 0; _versionOffset = (int)(schemaVers % 100); if (_versionOffset != 0) { // schema was modified manually/externally // TODO issue warning } - UpdateDbSchema(cnx, (int)(schemaVers / 100), RequiredSchemaVersion); + await UpdateDbSchema(cnx, (int)(schemaVers / 100), RequiredSchemaVersion); - var userVers = (long?)ExecuteScalar(cnx, "PRAGMA user_version") ?? 0; + var userVers = (long?)await ExScalar(cnx, "PRAGMA user_version") ?? 0; var major = userVers >> 24; var minor = (userVers >> 16) & 0xFF; var patch = userVers & 0xFFFF; @@ -48,13 +49,13 @@ namespace Elwig.Helpers { (App.VersionMajor == major && App.VersionMinor > minor) || (App.VersionMajor == major && App.VersionMinor == minor && App.VersionPatch > patch)) { long vers = (App.VersionMajor << 24) | (App.VersionMinor << 16) | App.VersionPatch; - ExecuteNonQuery(cnx, $"PRAGMA user_version = {vers}"); + await ExNonQuery(cnx, $"PRAGMA user_version = {vers}"); } return $"{major}.{minor}.{patch}"; } - private static void UpdateDbSchema(SqliteConnection cnx, int fromVersion, int toVersion) { + private static async Task UpdateDbSchema(SqliteConnection cnx, int fromVersion, int toVersion) { if (fromVersion == toVersion) { return; } else if (fromVersion > toVersion) { @@ -65,27 +66,27 @@ namespace Elwig.Helpers { throw new Exception("schema_version of database is invalid"); } - ExecuteNonQuery(cnx, "PRAGMA locking_mode = EXCLUSIVE"); - ExecuteNonQuery(cnx, "PRAGMA foreign_keys = OFF"); - ExecuteNonQuery(cnx, "BEGIN EXCLUSIVE"); + await ExNonQuery(cnx, "PRAGMA locking_mode = EXCLUSIVE"); + await ExNonQuery(cnx, "PRAGMA foreign_keys = OFF"); + await ExNonQuery(cnx, "BEGIN EXCLUSIVE"); for (int i = fromVersion; i < toVersion; i++) { - _updaters[i - 1](cnx); + await _updaters[i - 1](cnx); } - ExecuteNonQuery(cnx, "PRAGMA foreign_key_check"); - ExecuteNonQuery(cnx, "COMMIT"); - ExecuteNonQuery(cnx, "PRAGMA foreign_keys = ON"); - ExecuteNonQuery(cnx, "VACUUM"); - ExecuteNonQuery(cnx, $"PRAGMA schema_version = {toVersion * 100 + _versionOffset}"); + await ExNonQuery(cnx, "PRAGMA foreign_key_check"); + await ExNonQuery(cnx, "COMMIT"); + await ExNonQuery(cnx, "PRAGMA foreign_keys = ON"); + await ExNonQuery(cnx, "VACUUM"); + await ExNonQuery(cnx, $"PRAGMA schema_version = {toVersion * 100 + _versionOffset}"); } - private static void UpdateDbSchema_1_To_2(SqliteConnection cnx) { - ExecuteNonQuery(cnx, "DROP VIEW v_area_commitment"); - ExecuteNonQuery(cnx, "ALTER TABLE delivery_part DROP COLUMN weighing_reason"); - ExecuteNonQuery(cnx, "ALTER TABLE delivery_part ADD COLUMN weighing_reason TEXT CHECK(NOT (manual_weighing = FALSE AND weighing_reason IS NOT NULL))"); + private static async Task UpdateDbSchema_1_To_2(SqliteConnection cnx) { + await ExNonQuery(cnx, "DROP VIEW v_area_commitment"); + await ExNonQuery(cnx, "ALTER TABLE delivery_part DROP COLUMN weighing_reason"); + await ExNonQuery(cnx, "ALTER TABLE delivery_part ADD COLUMN weighing_reason TEXT CHECK(NOT (manual_weighing = FALSE AND weighing_reason IS NOT NULL))"); } - private static void UpdateDbSchema_2_To_3(SqliteConnection cnx) { - ExecuteNonQuery(cnx, """ + private static async Task UpdateDbSchema_2_To_3(SqliteConnection cnx) { + await ExNonQuery(cnx, """ CREATE TABLE delivery_part_bin ( year INTEGER NOT NULL, did INTEGER NOT NULL, @@ -101,14 +102,14 @@ namespace Elwig.Helpers { ON DELETE CASCADE ) STRICT; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO delivery_part_bin (year, did, dpnr, binnr, discr, value) SELECT year, did, dpnr, 0, '_', bucket_2 + bucket_3 FROM payment_delivery_part WHERE COALESCE(bucket_1, bucket_2, bucket_3, bucket_4, bucket_5, bucket_6, bucket_7, bucket_8, bucket_9) IS NOT NULL ON CONFLICT DO NOTHING; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO delivery_part_bin (year, did, dpnr, binnr, discr, value) SELECT d.year, d.did, d.dpnr, 1, COALESCE(attributes, ''), bucket_1 FROM payment_delivery_part p @@ -116,29 +117,29 @@ namespace Elwig.Helpers { WHERE COALESCE(bucket_1, bucket_2, bucket_3, bucket_4, bucket_5, bucket_6, bucket_7, bucket_8, bucket_9) IS NOT NULL ON CONFLICT DO NOTHING; """); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_1"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_2"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_3"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_4"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_5"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_6"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_7"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_8"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_9"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_1_name"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_2_name"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_3_name"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_4_name"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_5_name"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_6_name"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_7_name"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_8_name"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_9_name"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_1"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_2"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_3"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_4"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_5"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_6"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_7"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_8"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_9"); + await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_1_name"); + await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_2_name"); + await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_3_name"); + await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_4_name"); + await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_5_name"); + await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_6_name"); + await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_7_name"); + await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_8_name"); + await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_9_name"); - ExecuteNonQuery(cnx, "ALTER TABLE delivery_part ADD COLUMN gebunden INTEGER CHECK (gebunden IN (TRUE, FALSE)) DEFAULT NULL"); + await ExNonQuery(cnx, "ALTER TABLE delivery_part ADD COLUMN gebunden INTEGER CHECK (gebunden IN (TRUE, FALSE)) DEFAULT NULL"); - ExecuteNonQuery(cnx, "DROP VIEW v_delivery"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "DROP VIEW v_delivery"); + await ExNonQuery(cnx, """ CREATE VIEW v_delivery AS SELECT s.*, GROUP_CONCAT(o.modid) AS modifiers FROM (SELECT p.year, p.did, p.dpnr, @@ -163,8 +164,8 @@ namespace Elwig.Helpers { ORDER BY s.year, s.lsnr, s.dpnr, o.modid; """); - ExecuteNonQuery(cnx, "DROP VIEW v_bucket"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "DROP VIEW v_bucket"); + await ExNonQuery(cnx, """ CREATE VIEW v_delivery_bin AS SELECT year, mgnr, sortid || IIF(min_quw, REPLACE(COALESCE(attributes, ''), ',', ''), '_') AS bin, @@ -174,7 +175,7 @@ namespace Elwig.Helpers { ORDER BY year, mgnr, LENGTH(bin) DESC, bin; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_payment_bin AS SELECT d.year, d.mgnr, sortid || discr AS bin, @@ -186,12 +187,12 @@ namespace Elwig.Helpers { ORDER BY d.year, d.mgnr, bin; """); - ExecuteNonQuery(cnx, "ALTER TABLE wine_attribute ADD COLUMN fill_lower_bins INTEGER NOT NULL CHECK (fill_lower_bins IN (0, 1, 2)) DEFAULT 0"); + await ExNonQuery(cnx, "ALTER TABLE wine_attribute ADD COLUMN fill_lower_bins INTEGER NOT NULL CHECK (fill_lower_bins IN (0, 1, 2)) DEFAULT 0"); } - private static void UpdateDbSchema_3_To_4(SqliteConnection cnx) { - ExecuteNonQuery(cnx, "DROP VIEW v_payment_bin"); - ExecuteNonQuery(cnx, """ + private static async Task UpdateDbSchema_3_To_4(SqliteConnection cnx) { + await ExNonQuery(cnx, "DROP VIEW v_payment_bin"); + await ExNonQuery(cnx, """ CREATE VIEW v_payment_bin AS SELECT d.year, d.mgnr, sortid || discr AS bin, @@ -203,7 +204,7 @@ namespace Elwig.Helpers { ORDER BY d.year, d.mgnr, LENGTH(bin) DESC, bin; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_area_commitment_bin AS SELECT s.year, c.mgnr, c.vtrgid AS bin, @@ -218,8 +219,8 @@ namespace Elwig.Helpers { """); } - private static void UpdateDbSchema_4_To_5(SqliteConnection cnx) { - ExecuteNonQuery(cnx, """ + private static async Task UpdateDbSchema_4_To_5(SqliteConnection cnx) { + await ExNonQuery(cnx, """ CREATE TABLE _area_commitment_type ( vtrgid TEXT NOT NULL CHECK (vtrgid = sortid || COALESCE(attrid, '') || disc), sortid TEXT NOT NULL, @@ -240,22 +241,22 @@ namespace Elwig.Helpers { ON DELETE RESTRICT ) STRICT; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO _area_commitment_type (vtrgid, sortid, attrid, disc, min_kg_per_ha, max_kg_per_ha, penalty_amount) SELECT vtrgid, sortid, attrid_1, disc, min_kg_per_ha, max_kg_per_ha, penalty_amount FROM area_commitment_type """); - ExecuteNonQuery(cnx, "PRAGMA writable_schema = ON"); - ExecuteNonQuery(cnx, "DROP TABLE area_commitment_type"); - ExecuteNonQuery(cnx, "ALTER TABLE _area_commitment_type RENAME TO area_commitment_type"); - ExecuteNonQuery(cnx, "PRAGMA writable_schema = OFF"); + await ExNonQuery(cnx, "PRAGMA writable_schema = ON"); + await ExNonQuery(cnx, "DROP TABLE area_commitment_type"); + await ExNonQuery(cnx, "ALTER TABLE _area_commitment_type RENAME TO area_commitment_type"); + await ExNonQuery(cnx, "PRAGMA writable_schema = OFF"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ ALTER TABLE delivery_part ADD COLUMN attrid TEXT DEFAULT NULL REFERENCES wine_attribute (attrid) ON UPDATE CASCADE ON DELETE RESTRICT """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ UPDATE delivery_part SET attrid = (SELECT attrid FROM delivery_part_attribute a @@ -263,13 +264,13 @@ namespace Elwig.Helpers { ORDER BY attrid DESC LIMIT 1) """); - ExecuteNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_i_mtime_delivery_part"); - ExecuteNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_u_mtime_delivery_part"); - ExecuteNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_d_mtime_delivery_part"); - ExecuteNonQuery(cnx, "DROP TABLE delivery_part_attribute"); + await ExNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_i_mtime_delivery_part"); + await ExNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_u_mtime_delivery_part"); + await ExNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_d_mtime_delivery_part"); + await ExNonQuery(cnx, "DROP TABLE delivery_part_attribute"); - ExecuteNonQuery(cnx, "DROP VIEW v_delivery"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "DROP VIEW v_delivery"); + await ExNonQuery(cnx, """ CREATE VIEW v_delivery AS SELECT p.year, p.did, p.dpnr, d.date, d.time, d.zwstid, d.lnr, d.lsnr, @@ -292,8 +293,8 @@ namespace Elwig.Helpers { ORDER BY p.year, p.did, p.dpnr, o.modid; """); - ExecuteNonQuery(cnx, "DROP VIEW v_delivery_bin"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "DROP VIEW v_delivery_bin"); + await ExNonQuery(cnx, """ CREATE VIEW v_delivery_bin AS SELECT year, mgnr, sortid || IIF(min_quw, COALESCE(attrid, ''), '_') AS bin, @@ -303,8 +304,8 @@ namespace Elwig.Helpers { ORDER BY year, mgnr, LENGTH(bin) DESC, bin; """); - ExecuteNonQuery(cnx, "DROP VIEW v_stat_attr"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "DROP VIEW v_stat_attr"); + await ExNonQuery(cnx, """ CREATE VIEW v_stat_attr AS SELECT year, attrid, SUM(weight) as sum, @@ -317,8 +318,8 @@ namespace Elwig.Helpers { ORDER BY year, attrid; """); - ExecuteNonQuery(cnx, "DROP VIEW v_stat_sort_attr"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "DROP VIEW v_stat_sort_attr"); + await ExNonQuery(cnx, """ CREATE VIEW v_stat_sort_attr AS SELECT year, sortid, attrid, SUM(weight) as sum, @@ -332,15 +333,15 @@ namespace Elwig.Helpers { """); } - private static void UpdateDbSchema_5_To_6(SqliteConnection cnx) { - ExecuteNonQuery(cnx, "DROP VIEW IF EXISTS v_area_commitment"); + private static async Task UpdateDbSchema_5_To_6(SqliteConnection cnx) { + await ExNonQuery(cnx, "DROP VIEW IF EXISTS v_area_commitment"); - ExecuteNonQuery(cnx, "PRAGMA writable_schema = ON"); - ExecuteNonQuery(cnx, "ALTER TABLE wine_attribute DROP COLUMN fill_lower_bins"); - ExecuteNonQuery(cnx, "ALTER TABLE wine_attribute ADD COLUMN strict INTEGER NOT NULL CHECK (strict IN (TRUE, FALSE)) DEFAULT FALSE"); - ExecuteNonQuery(cnx, "ALTER TABLE wine_attribute ADD COLUMN fill_lower INTEGER NOT NULL CHECK (fill_lower IN (0, 1, 2)) DEFAULT 0"); - ExecuteNonQuery(cnx, "DROP VIEW v_delivery"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "PRAGMA writable_schema = ON"); + await ExNonQuery(cnx, "ALTER TABLE wine_attribute DROP COLUMN fill_lower_bins"); + await ExNonQuery(cnx, "ALTER TABLE wine_attribute ADD COLUMN strict INTEGER NOT NULL CHECK (strict IN (TRUE, FALSE)) DEFAULT FALSE"); + await ExNonQuery(cnx, "ALTER TABLE wine_attribute ADD COLUMN fill_lower INTEGER NOT NULL CHECK (fill_lower IN (0, 1, 2)) DEFAULT 0"); + await ExNonQuery(cnx, "DROP VIEW v_delivery"); + await ExNonQuery(cnx, """ CREATE VIEW v_delivery AS SELECT p.year, p.did, p.dpnr, d.date, d.time, d.zwstid, d.lnr, d.lsnr, @@ -362,31 +363,31 @@ namespace Elwig.Helpers { GROUP BY p.year, p.did, p.dpnr ORDER BY p.year, p.did, p.dpnr, o.modid; """); - ExecuteNonQuery(cnx, "PRAGMA writable_schema = OFF"); + await ExNonQuery(cnx, "PRAGMA writable_schema = OFF"); - ExecuteNonQuery(cnx, "DROP VIEW v_area_commitment_bin"); - ExecuteNonQuery(cnx, "DROP VIEW v_delivery_bin"); - ExecuteNonQuery(cnx, "DROP VIEW v_payment_bin"); + await ExNonQuery(cnx, "DROP VIEW v_area_commitment_bin"); + await ExNonQuery(cnx, "DROP VIEW v_delivery_bin"); + await ExNonQuery(cnx, "DROP VIEW v_payment_bin"); - ExecuteNonQuery(cnx, "ALTER TABLE area_commitment_type DROP COLUMN max_kg_per_ha"); - ExecuteNonQuery(cnx, "ALTER TABLE area_commitment_type ADD COLUMN penalty_per_kg INTEGER DEFAULT NULL"); - ExecuteNonQuery(cnx, "ALTER TABLE area_commitment_type ADD COLUMN penalty_none INTEGER DEFAULT NULL"); + await ExNonQuery(cnx, "ALTER TABLE area_commitment_type DROP COLUMN max_kg_per_ha"); + await ExNonQuery(cnx, "ALTER TABLE area_commitment_type ADD COLUMN penalty_per_kg INTEGER DEFAULT NULL"); + await ExNonQuery(cnx, "ALTER TABLE area_commitment_type ADD COLUMN penalty_none INTEGER DEFAULT NULL"); - ExecuteNonQuery(cnx, "ALTER TABLE wine_cultivation ADD COLUMN description TEXT DEFAULT NULL"); - ExecuteNonQuery(cnx, "ALTER TABLE member ADD COLUMN organic INTEGER NOT NULL CHECK (organic IN (TRUE, FALSE)) DEFAULT FALSE"); + await ExNonQuery(cnx, "ALTER TABLE wine_cultivation ADD COLUMN description TEXT DEFAULT NULL"); + await ExNonQuery(cnx, "ALTER TABLE member ADD COLUMN organic INTEGER NOT NULL CHECK (organic IN (TRUE, FALSE)) DEFAULT FALSE"); - ExecuteNonQuery(cnx, "ALTER TABLE season ADD COLUMN max_kg_per_ha INTEGER NOT NULL DEFAULT 10000"); - ExecuteNonQuery(cnx, "ALTER TABLE season ADD COLUMN vat_normal REAL NOT NULL DEFAULT 0.10"); - ExecuteNonQuery(cnx, "ALTER TABLE season ADD COLUMN vat_flatrate REAL NOT NULL DEFAULT 0.13"); - ExecuteNonQuery(cnx, "ALTER TABLE season ADD COLUMN min_kg_per_bs INTEGER NOT NULL DEFAULT 750"); - ExecuteNonQuery(cnx, "ALTER TABLE season ADD COLUMN max_kg_per_bs INTEGER NOT NULL DEFAULT 3000"); - ExecuteNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_per_kg INTEGER DEFAULT NULL"); - ExecuteNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_amount INTEGER DEFAULT NULL"); - ExecuteNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_none INTEGER DEFAULT NULL"); + await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN max_kg_per_ha INTEGER NOT NULL DEFAULT 10000"); + await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN vat_normal REAL NOT NULL DEFAULT 0.10"); + await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN vat_flatrate REAL NOT NULL DEFAULT 0.13"); + await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN min_kg_per_bs INTEGER NOT NULL DEFAULT 750"); + await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN max_kg_per_bs INTEGER NOT NULL DEFAULT 3000"); + await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_per_kg INTEGER DEFAULT NULL"); + await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_amount INTEGER DEFAULT NULL"); + await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_none INTEGER DEFAULT NULL"); - ExecuteNonQuery(cnx, "DELETE FROM client_parameter WHERE param IN ('DELIVERY_RIGHT', 'DELIVERY_OBLIGATION', 'VAT_NORMAL', 'VAT_REDUCED', 'VAT_FLATRATE')"); + await ExNonQuery(cnx, "DELETE FROM client_parameter WHERE param IN ('DELIVERY_RIGHT', 'DELIVERY_OBLIGATION', 'VAT_NORMAL', 'VAT_REDUCED', 'VAT_FLATRATE')"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE TABLE delivery_part_bucket ( year INTEGER NOT NULL, did INTEGER NOT NULL, @@ -402,14 +403,14 @@ namespace Elwig.Helpers { ON DELETE CASCADE ) STRICT; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO delivery_part_bucket (year, did, dpnr, bktnr, discr, value) SELECT year, did, dpnr, binnr, discr, value FROM delivery_part_bin """); - ExecuteNonQuery(cnx, "DROP TABLE delivery_part_bin"); + await ExNonQuery(cnx, "DROP TABLE delivery_part_bin"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_area_commitment_bucket_strict AS SELECT s.year, c.mgnr, t.sortid || COALESCE(a.attrid, '') AS bucket, @@ -425,7 +426,7 @@ namespace Elwig.Helpers { GROUP BY s.year, c.mgnr, bucket ORDER BY s.year, c.mgnr, bucket; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_area_commitment_bucket AS SELECT year, mgnr, bucket, min_kg, max_kg FROM v_area_commitment_bucket_strict @@ -440,7 +441,7 @@ namespace Elwig.Helpers { GROUP BY b.year, b.mgnr, b.sortid ORDER BY year, mgnr, bucket; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_delivery_bucket_strict AS SELECT year, mgnr, sortid || IIF(min_quw, COALESCE(attrid, ''), '_') AS bucket, @@ -451,7 +452,7 @@ namespace Elwig.Helpers { GROUP BY year, mgnr, bucket ORDER BY year, mgnr, bucket; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_delivery_bucket AS SELECT year, mgnr, bucket, weight FROM v_delivery_bucket_strict @@ -465,7 +466,7 @@ namespace Elwig.Helpers { GROUP BY b.year, b.mgnr, b.sortid ORDER BY year, mgnr, bucket; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_payment_bucket_strict AS SELECT d.year, d.mgnr, d.sortid || b.discr AS bucket, @@ -478,7 +479,7 @@ namespace Elwig.Helpers { HAVING SUM(b.value) > 0 ORDER BY d.year, d.mgnr, bucket; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_payment_bucket AS SELECT year, mgnr, bucket, weight FROM v_payment_bucket_strict @@ -494,9 +495,9 @@ namespace Elwig.Helpers { """); } - private static void UpdateDBSchema_6_To_7(SqliteConnection cnx) { - ExecuteNonQuery(cnx, "DROP VIEW v_area_commitment_bucket_strict"); - ExecuteNonQuery(cnx, """ + private static async Task UpdateDBSchema_6_To_7(SqliteConnection cnx) { + await ExNonQuery(cnx, "DROP VIEW v_area_commitment_bucket_strict"); + await ExNonQuery(cnx, """ CREATE VIEW v_area_commitment_bucket_strict AS SELECT s.year, c.mgnr, t.sortid || COALESCE(a.attrid, '') AS bucket, @@ -514,14 +515,14 @@ namespace Elwig.Helpers { ORDER BY s.year, c.mgnr, bucket; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_under_delivery_bucket_strict AS SELECT c.year, c.mgnr, c.bucket, c.min_kg, COALESCE(p.weight, 0) AS weight FROM v_area_commitment_bucket_strict c LEFT JOIN v_payment_bucket_strict p ON (p.year, p.mgnr, p.bucket) = (c.year, c.mgnr, c.bucket) ORDER BY c.year, c.mgnr, c.bucket; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_under_delivery_bucket AS SELECT u.year, u.mgnr, u.bucket, u.min_kg, u.weight + SUM(MAX(COALESCE(p.weight - s.min_kg, 0), 0)) AS weight @@ -533,7 +534,7 @@ namespace Elwig.Helpers { GROUP BY u.year, u.mgnr, u.bucket ORDER BY u.year, u.mgnr, u.bucket; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE VIEW v_under_delivery AS SELECT year, mgnr, bucket, min_kg, weight, weight - min_kg AS diff FROM v_under_delivery_bucket @@ -541,76 +542,76 @@ namespace Elwig.Helpers { """); } - private static void UpdateDbSchema_7_To_8(SqliteConnection cnx) { - ExecuteNonQuery(cnx, """ + private static async Task UpdateDbSchema_7_To_8(SqliteConnection cnx) { + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT a.gkz, 'WLNO' FROM AT_gem a LEFT JOIN wb_gem w ON w.gkz = a.gkz WHERE a.gkz / 10000 = 3 AND w.hkid IS NULL; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT gkz, 'SLVL' FROM AT_gem WHERE gkz / 100 IN (617, 622, 623); """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT gkz, 'SLSS' FROM AT_gem WHERE gkz / 100 = 610; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ UPDATE wb_gem SET hkid = 'SLVL' WHERE gkz IN (61007, 61052, 61001, 61055, 61027, 61057, 61008, 61057); """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT gkz, 'SLWS' FROM AT_gem WHERE gkz / 100 IN (603, 616) OR gkz IN (60101, 60663, 60651, 60659, 60664, 60647, 60641, 60639, 60665, 60669, 60618, 60629, 60608, 60670, 60624, 60660, 60656, 60655); """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT g.gkz, 'SLVL' FROM AT_gem g LEFT JOIN wb_gem w ON w.gkz = g.gkz WHERE g.gkz / 100 = 606 AND w.hkid IS NULL; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT g.gkz, 'SLST' FROM AT_gem g LEFT JOIN wb_gem w ON w.gkz = g.gkz WHERE g.gkz / 10000 = 6 AND w.hkid IS NULL; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT gkz, 'BLOO' FROM AT_gem WHERE gkz / 10000 = 4; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT gkz, 'BLKA' FROM AT_gem WHERE gkz / 10000 = 2; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT gkz, 'BLSB' FROM AT_gem WHERE gkz / 10000 = 5; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT gkz, 'BLTI' FROM AT_gem WHERE gkz / 10000 = 7; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ INSERT INTO wb_gem SELECT gkz, 'BLVO' FROM AT_gem @@ -618,8 +619,8 @@ namespace Elwig.Helpers { """); } - private static void UpdateDbSchema_8_To_9(SqliteConnection cnx) { - ExecuteNonQuery(cnx, """ + private static async Task UpdateDbSchema_8_To_9(SqliteConnection cnx) { + await ExNonQuery(cnx, """ CREATE TABLE payment_delivery_part_bucket ( year INTEGER NOT NULL, did INTEGER NOT NULL, @@ -640,13 +641,13 @@ namespace Elwig.Helpers { ) STRICT; """); - ExecuteNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_i"); - ExecuteNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_u"); - ExecuteNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_d"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part RENAME COLUMN amount TO net_amount"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL"); + await ExNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_i"); + await ExNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_u"); + await ExNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_d"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part RENAME COLUMN amount TO net_amount"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE TRIGGER t_payment_delivery_part_bucket_i AFTER INSERT ON payment_delivery_part_bucket FOR EACH ROW BEGIN @@ -655,7 +656,7 @@ namespace Elwig.Helpers { ON CONFLICT DO UPDATE SET net_amount = net_amount + NEW.amount; END; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE TRIGGER t_payment_delivery_part_bucket_u AFTER UPDATE OF amount ON payment_delivery_part_bucket FOR EACH ROW BEGIN @@ -667,7 +668,7 @@ namespace Elwig.Helpers { WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr); END; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE TRIGGER t_payment_delivery_part_bucket_d AFTER DELETE ON payment_delivery_part_bucket FOR EACH ROW BEGIN @@ -677,12 +678,12 @@ namespace Elwig.Helpers { END; """); - ExecuteNonQuery(cnx, "ALTER TABLE payment_member RENAME COLUMN amount TO net_amount"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN mod_abs INTEGER NOT NULL DEFAULT 0"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN mod_rel REAL NOT NULL DEFAULT 0"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_rel)) VIRTUAL"); + await ExNonQuery(cnx, "ALTER TABLE payment_member RENAME COLUMN amount TO net_amount"); + await ExNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN mod_abs INTEGER NOT NULL DEFAULT 0"); + await ExNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN mod_rel REAL NOT NULL DEFAULT 0"); + await ExNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_rel)) VIRTUAL"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE TRIGGER t_payment_delivery_part_i AFTER INSERT ON payment_delivery_part FOR EACH ROW BEGIN @@ -691,7 +692,7 @@ namespace Elwig.Helpers { ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount; END; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE TRIGGER t_payment_delivery_part_u AFTER UPDATE OF amount ON payment_delivery_part FOR EACH ROW BEGIN @@ -703,7 +704,7 @@ namespace Elwig.Helpers { WHERE (year, avnr, mgnr) = (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did))); END; """); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, """ CREATE TRIGGER t_payment_delivery_part_d AFTER DELETE ON payment_delivery_part FOR EACH ROW BEGIN @@ -714,10 +715,10 @@ namespace Elwig.Helpers { """); } - private static void UpdateDbSchema_9_To_10(SqliteConnection cnx) { - ExecuteNonQuery(cnx, "UPDATE wine_quality_level SET min_kmw = 10.6 WHERE qualid = 'RSW'"); - ExecuteNonQuery(cnx, "DROP VIEW v_area_commitment_bucket"); - ExecuteNonQuery(cnx, """ + private static async Task UpdateDbSchema_9_To_10(SqliteConnection cnx) { + await ExNonQuery(cnx, "UPDATE wine_quality_level SET min_kmw = 10.6 WHERE qualid = 'RSW'"); + await ExNonQuery(cnx, "DROP VIEW v_area_commitment_bucket"); + await ExNonQuery(cnx, """ CREATE VIEW v_area_commitment_bucket AS SELECT year, mgnr, bucket, area, min_kg, max_kg FROM v_area_commitment_bucket_strict @@ -735,20 +736,20 @@ namespace Elwig.Helpers { """); } - private static void UpdateDbSchema_10_To_11(SqliteConnection cnx) { + private static async Task UpdateDbSchema_10_To_11(SqliteConnection cnx) { // Drop columns, if they exist... - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_1"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_2"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_3"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_4"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_5"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_6"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_7"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_8"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_9"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_1"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_2"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_3"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_4"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_5"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_6"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_7"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_8"); + await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_9"); - ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_i"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_i"); + await ExNonQuery(cnx, """ CREATE TRIGGER t_payment_delivery_part_i AFTER INSERT ON payment_delivery_part FOR EACH ROW BEGIN @@ -758,8 +759,8 @@ namespace Elwig.Helpers { END; """); - ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_u"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_u"); + await ExNonQuery(cnx, """ CREATE TRIGGER t_payment_delivery_part_u AFTER UPDATE ON payment_delivery_part FOR EACH ROW BEGIN @@ -772,8 +773,8 @@ namespace Elwig.Helpers { END; """); - ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_d"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_d"); + await ExNonQuery(cnx, """ CREATE TRIGGER t_payment_delivery_part_d AFTER DELETE ON payment_delivery_part FOR EACH ROW BEGIN @@ -783,8 +784,8 @@ namespace Elwig.Helpers { END; """); - ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_bucket_u"); - ExecuteNonQuery(cnx, """ + await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_bucket_u"); + await ExNonQuery(cnx, """ CREATE TRIGGER t_payment_delivery_part_bucket_u AFTER UPDATE ON payment_delivery_part_bucket FOR EACH ROW BEGIN @@ -797,12 +798,12 @@ namespace Elwig.Helpers { END; """); - ExecuteNonQuery(cnx, "ALTER TABLE payment_member DROP COLUMN amount"); - ExecuteNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL"); + await ExNonQuery(cnx, "ALTER TABLE payment_member DROP COLUMN amount"); + await ExNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL"); } - private static void UpdateDbSchema_11_To_12(SqliteConnection cnx) { - ExecuteNonQuery(cnx, """ + private static async Task UpdateDbSchema_11_To_12(SqliteConnection cnx) { + await ExNonQuery(cnx, """ CREATE VIEW v_stat_member AS SELECT year, mgnr, SUM(weight) AS sum,