AppDbUpdater: Using async/await

This commit is contained in:
2024-01-05 10:20:53 +01:00
parent ba55692cbe
commit ab61edc402
2 changed files with 179 additions and 178 deletions

View File

@ -66,7 +66,7 @@ namespace Elwig {
CurrentApp = this; CurrentApp = this;
} }
protected override void OnStartup(StartupEventArgs evt) { protected override async void OnStartup(StartupEventArgs evt) {
var locale = new CultureInfo("de-AT"); var locale = new CultureInfo("de-AT");
locale.NumberFormat.CurrencyGroupSeparator = "\u202f"; locale.NumberFormat.CurrencyGroupSeparator = "\u202f";
locale.NumberFormat.NumberGroupSeparator = "\u202f"; locale.NumberFormat.NumberGroupSeparator = "\u202f";
@ -83,7 +83,7 @@ namespace Elwig {
Version = typeof(App).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion.Split("+")[0] ?? "0.0.0"; Version = typeof(App).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion.Split("+")[0] ?? "0.0.0";
try { try {
AppDbUpdater.CheckDb(); await AppDbUpdater.CheckDb();
} catch (Exception e) { } catch (Exception e) {
MessageBox.Show($"Invalid Database:\n\n{e.Message}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error); MessageBox.Show($"Invalid Database:\n\n{e.Message}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error);
Shutdown(); Shutdown();

View File

@ -1,5 +1,6 @@
using Microsoft.Data.Sqlite; using Microsoft.Data.Sqlite;
using System; using System;
using System.Threading.Tasks;
namespace Elwig.Helpers { namespace Elwig.Helpers {
public static class AppDbUpdater { public static class AppDbUpdater {
@ -7,39 +8,39 @@ namespace Elwig.Helpers {
public static readonly int RequiredSchemaVersion = 12; public static readonly int RequiredSchemaVersion = 12;
private static int _versionOffset = 0; private static int _versionOffset = 0;
private static readonly Action<SqliteConnection>[] _updaters = [ private static readonly Func<SqliteConnection, Task>[] _updaters = [
UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3, UpdateDbSchema_3_To_4, UpdateDbSchema_4_To_5, 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_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, 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(); using var cmd = cnx.CreateCommand();
cmd.CommandText = sql; cmd.CommandText = sql;
cmd.ExecuteNonQuery(); await cmd.ExecuteNonQueryAsync();
} }
private static object? ExecuteScalar(SqliteConnection cnx, string sql) { private static async Task<object?> ExScalar(SqliteConnection cnx, string sql) {
using var cmd = cnx.CreateCommand(); using var cmd = cnx.CreateCommand();
cmd.CommandText = sql; cmd.CommandText = sql;
return cmd.ExecuteScalar(); return await cmd.ExecuteScalarAsync();
} }
public static string CheckDb() { public static async Task<string> CheckDb() {
using var cnx = AppDbContext.Connect(); 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"); 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); _versionOffset = (int)(schemaVers % 100);
if (_versionOffset != 0) { if (_versionOffset != 0) {
// schema was modified manually/externally // schema was modified manually/externally
// TODO issue warning // 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 major = userVers >> 24;
var minor = (userVers >> 16) & 0xFF; var minor = (userVers >> 16) & 0xFF;
var patch = userVers & 0xFFFF; var patch = userVers & 0xFFFF;
@ -48,13 +49,13 @@ namespace Elwig.Helpers {
(App.VersionMajor == major && App.VersionMinor > minor) || (App.VersionMajor == major && App.VersionMinor > minor) ||
(App.VersionMajor == major && App.VersionMinor == minor && App.VersionPatch > patch)) { (App.VersionMajor == major && App.VersionMinor == minor && App.VersionPatch > patch)) {
long vers = (App.VersionMajor << 24) | (App.VersionMinor << 16) | App.VersionPatch; 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}"; 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) { if (fromVersion == toVersion) {
return; return;
} else if (fromVersion > toVersion) { } else if (fromVersion > toVersion) {
@ -65,27 +66,27 @@ namespace Elwig.Helpers {
throw new Exception("schema_version of database is invalid"); throw new Exception("schema_version of database is invalid");
} }
ExecuteNonQuery(cnx, "PRAGMA locking_mode = EXCLUSIVE"); await ExNonQuery(cnx, "PRAGMA locking_mode = EXCLUSIVE");
ExecuteNonQuery(cnx, "PRAGMA foreign_keys = OFF"); await ExNonQuery(cnx, "PRAGMA foreign_keys = OFF");
ExecuteNonQuery(cnx, "BEGIN EXCLUSIVE"); await ExNonQuery(cnx, "BEGIN EXCLUSIVE");
for (int i = fromVersion; i < toVersion; i++) { for (int i = fromVersion; i < toVersion; i++) {
_updaters[i - 1](cnx); await _updaters[i - 1](cnx);
} }
ExecuteNonQuery(cnx, "PRAGMA foreign_key_check"); await ExNonQuery(cnx, "PRAGMA foreign_key_check");
ExecuteNonQuery(cnx, "COMMIT"); await ExNonQuery(cnx, "COMMIT");
ExecuteNonQuery(cnx, "PRAGMA foreign_keys = ON"); await ExNonQuery(cnx, "PRAGMA foreign_keys = ON");
ExecuteNonQuery(cnx, "VACUUM"); await ExNonQuery(cnx, "VACUUM");
ExecuteNonQuery(cnx, $"PRAGMA schema_version = {toVersion * 100 + _versionOffset}"); await ExNonQuery(cnx, $"PRAGMA schema_version = {toVersion * 100 + _versionOffset}");
} }
private static void UpdateDbSchema_1_To_2(SqliteConnection cnx) { private static async Task UpdateDbSchema_1_To_2(SqliteConnection cnx) {
ExecuteNonQuery(cnx, "DROP VIEW v_area_commitment"); await ExNonQuery(cnx, "DROP VIEW v_area_commitment");
ExecuteNonQuery(cnx, "ALTER TABLE delivery_part DROP COLUMN weighing_reason"); await ExNonQuery(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))"); 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) { private static async Task UpdateDbSchema_2_To_3(SqliteConnection cnx) {
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TABLE delivery_part_bin ( CREATE TABLE delivery_part_bin (
year INTEGER NOT NULL, year INTEGER NOT NULL,
did INTEGER NOT NULL, did INTEGER NOT NULL,
@ -101,14 +102,14 @@ namespace Elwig.Helpers {
ON DELETE CASCADE ON DELETE CASCADE
) STRICT; ) STRICT;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO delivery_part_bin (year, did, dpnr, binnr, discr, value) INSERT INTO delivery_part_bin (year, did, dpnr, binnr, discr, value)
SELECT year, did, dpnr, 0, '_', bucket_2 + bucket_3 SELECT year, did, dpnr, 0, '_', bucket_2 + bucket_3
FROM payment_delivery_part 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 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; ON CONFLICT DO NOTHING;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO delivery_part_bin (year, did, dpnr, binnr, discr, value) INSERT INTO delivery_part_bin (year, did, dpnr, binnr, discr, value)
SELECT d.year, d.did, d.dpnr, 1, COALESCE(attributes, ''), bucket_1 SELECT d.year, d.did, d.dpnr, 1, COALESCE(attributes, ''), bucket_1
FROM payment_delivery_part p 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 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; ON CONFLICT DO NOTHING;
"""); """);
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_1"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_1");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_2"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_2");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_3"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_3");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_4"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_4");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_5"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_5");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_6"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_6");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_7"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_7");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_8"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_8");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_9"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_9");
ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_1_name"); await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_1_name");
ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_2_name"); await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_2_name");
ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_3_name"); await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_3_name");
ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_4_name"); await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_4_name");
ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_5_name"); await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_5_name");
ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_6_name"); await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_6_name");
ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_7_name"); await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_7_name");
ExecuteNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_8_name"); await ExNonQuery(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_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"); await ExNonQuery(cnx, "DROP VIEW v_delivery");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_delivery AS CREATE VIEW v_delivery AS
SELECT s.*, GROUP_CONCAT(o.modid) AS modifiers SELECT s.*, GROUP_CONCAT(o.modid) AS modifiers
FROM (SELECT p.year, p.did, p.dpnr, 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; ORDER BY s.year, s.lsnr, s.dpnr, o.modid;
"""); """);
ExecuteNonQuery(cnx, "DROP VIEW v_bucket"); await ExNonQuery(cnx, "DROP VIEW v_bucket");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_delivery_bin AS CREATE VIEW v_delivery_bin AS
SELECT year, mgnr, SELECT year, mgnr,
sortid || IIF(min_quw, REPLACE(COALESCE(attributes, ''), ',', ''), '_') AS bin, sortid || IIF(min_quw, REPLACE(COALESCE(attributes, ''), ',', ''), '_') AS bin,
@ -174,7 +175,7 @@ namespace Elwig.Helpers {
ORDER BY year, mgnr, LENGTH(bin) DESC, bin; ORDER BY year, mgnr, LENGTH(bin) DESC, bin;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_payment_bin AS CREATE VIEW v_payment_bin AS
SELECT d.year, d.mgnr, SELECT d.year, d.mgnr,
sortid || discr AS bin, sortid || discr AS bin,
@ -186,12 +187,12 @@ namespace Elwig.Helpers {
ORDER BY d.year, d.mgnr, bin; 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) { private static async Task UpdateDbSchema_3_To_4(SqliteConnection cnx) {
ExecuteNonQuery(cnx, "DROP VIEW v_payment_bin"); await ExNonQuery(cnx, "DROP VIEW v_payment_bin");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_payment_bin AS CREATE VIEW v_payment_bin AS
SELECT d.year, d.mgnr, SELECT d.year, d.mgnr,
sortid || discr AS bin, sortid || discr AS bin,
@ -203,7 +204,7 @@ namespace Elwig.Helpers {
ORDER BY d.year, d.mgnr, LENGTH(bin) DESC, bin; ORDER BY d.year, d.mgnr, LENGTH(bin) DESC, bin;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_area_commitment_bin AS CREATE VIEW v_area_commitment_bin AS
SELECT s.year, c.mgnr, SELECT s.year, c.mgnr,
c.vtrgid AS bin, c.vtrgid AS bin,
@ -218,8 +219,8 @@ namespace Elwig.Helpers {
"""); """);
} }
private static void UpdateDbSchema_4_To_5(SqliteConnection cnx) { private static async Task UpdateDbSchema_4_To_5(SqliteConnection cnx) {
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TABLE _area_commitment_type ( CREATE TABLE _area_commitment_type (
vtrgid TEXT NOT NULL CHECK (vtrgid = sortid || COALESCE(attrid, '') || disc), vtrgid TEXT NOT NULL CHECK (vtrgid = sortid || COALESCE(attrid, '') || disc),
sortid TEXT NOT NULL, sortid TEXT NOT NULL,
@ -240,22 +241,22 @@ namespace Elwig.Helpers {
ON DELETE RESTRICT ON DELETE RESTRICT
) STRICT; ) 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) 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 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"); await ExNonQuery(cnx, "PRAGMA writable_schema = ON");
ExecuteNonQuery(cnx, "DROP TABLE area_commitment_type"); await ExNonQuery(cnx, "DROP TABLE area_commitment_type");
ExecuteNonQuery(cnx, "ALTER TABLE _area_commitment_type RENAME TO area_commitment_type"); await ExNonQuery(cnx, "ALTER TABLE _area_commitment_type RENAME TO area_commitment_type");
ExecuteNonQuery(cnx, "PRAGMA writable_schema = OFF"); await ExNonQuery(cnx, "PRAGMA writable_schema = OFF");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
ALTER TABLE delivery_part ADD COLUMN attrid TEXT DEFAULT NULL ALTER TABLE delivery_part ADD COLUMN attrid TEXT DEFAULT NULL
REFERENCES wine_attribute (attrid) REFERENCES wine_attribute (attrid)
ON UPDATE CASCADE ON UPDATE CASCADE
ON DELETE RESTRICT ON DELETE RESTRICT
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
UPDATE delivery_part UPDATE delivery_part
SET attrid = (SELECT attrid SET attrid = (SELECT attrid
FROM delivery_part_attribute a FROM delivery_part_attribute a
@ -263,13 +264,13 @@ namespace Elwig.Helpers {
ORDER BY attrid DESC ORDER BY attrid DESC
LIMIT 1) LIMIT 1)
"""); """);
ExecuteNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_i_mtime_delivery_part"); await ExNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_i_mtime_delivery_part");
ExecuteNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_u_mtime_delivery_part"); await ExNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_u_mtime_delivery_part");
ExecuteNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_d_mtime_delivery_part"); await ExNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_d_mtime_delivery_part");
ExecuteNonQuery(cnx, "DROP TABLE delivery_part_attribute"); await ExNonQuery(cnx, "DROP TABLE delivery_part_attribute");
ExecuteNonQuery(cnx, "DROP VIEW v_delivery"); await ExNonQuery(cnx, "DROP VIEW v_delivery");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_delivery AS CREATE VIEW v_delivery AS
SELECT p.year, p.did, p.dpnr, SELECT p.year, p.did, p.dpnr,
d.date, d.time, d.zwstid, d.lnr, d.lsnr, 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; ORDER BY p.year, p.did, p.dpnr, o.modid;
"""); """);
ExecuteNonQuery(cnx, "DROP VIEW v_delivery_bin"); await ExNonQuery(cnx, "DROP VIEW v_delivery_bin");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_delivery_bin AS CREATE VIEW v_delivery_bin AS
SELECT year, mgnr, SELECT year, mgnr,
sortid || IIF(min_quw, COALESCE(attrid, ''), '_') AS bin, sortid || IIF(min_quw, COALESCE(attrid, ''), '_') AS bin,
@ -303,8 +304,8 @@ namespace Elwig.Helpers {
ORDER BY year, mgnr, LENGTH(bin) DESC, bin; ORDER BY year, mgnr, LENGTH(bin) DESC, bin;
"""); """);
ExecuteNonQuery(cnx, "DROP VIEW v_stat_attr"); await ExNonQuery(cnx, "DROP VIEW v_stat_attr");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_stat_attr AS CREATE VIEW v_stat_attr AS
SELECT year, attrid, SELECT year, attrid,
SUM(weight) as sum, SUM(weight) as sum,
@ -317,8 +318,8 @@ namespace Elwig.Helpers {
ORDER BY year, attrid; ORDER BY year, attrid;
"""); """);
ExecuteNonQuery(cnx, "DROP VIEW v_stat_sort_attr"); await ExNonQuery(cnx, "DROP VIEW v_stat_sort_attr");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_stat_sort_attr AS CREATE VIEW v_stat_sort_attr AS
SELECT year, sortid, attrid, SELECT year, sortid, attrid,
SUM(weight) as sum, SUM(weight) as sum,
@ -332,15 +333,15 @@ namespace Elwig.Helpers {
"""); """);
} }
private static void UpdateDbSchema_5_To_6(SqliteConnection cnx) { private static async Task UpdateDbSchema_5_To_6(SqliteConnection cnx) {
ExecuteNonQuery(cnx, "DROP VIEW IF EXISTS v_area_commitment"); await ExNonQuery(cnx, "DROP VIEW IF EXISTS v_area_commitment");
ExecuteNonQuery(cnx, "PRAGMA writable_schema = ON"); await ExNonQuery(cnx, "PRAGMA writable_schema = ON");
ExecuteNonQuery(cnx, "ALTER TABLE wine_attribute DROP COLUMN fill_lower_bins"); await ExNonQuery(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"); await ExNonQuery(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"); await ExNonQuery(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"); await ExNonQuery(cnx, "DROP VIEW v_delivery");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_delivery AS CREATE VIEW v_delivery AS
SELECT p.year, p.did, p.dpnr, SELECT p.year, p.did, p.dpnr,
d.date, d.time, d.zwstid, d.lnr, d.lsnr, 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 GROUP BY p.year, p.did, p.dpnr
ORDER BY p.year, p.did, p.dpnr, o.modid; 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"); await ExNonQuery(cnx, "DROP VIEW v_area_commitment_bin");
ExecuteNonQuery(cnx, "DROP VIEW v_delivery_bin"); await ExNonQuery(cnx, "DROP VIEW v_delivery_bin");
ExecuteNonQuery(cnx, "DROP VIEW v_payment_bin"); await ExNonQuery(cnx, "DROP VIEW v_payment_bin");
ExecuteNonQuery(cnx, "ALTER TABLE area_commitment_type DROP COLUMN max_kg_per_ha"); await ExNonQuery(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"); await ExNonQuery(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 ADD COLUMN penalty_none INTEGER DEFAULT NULL");
ExecuteNonQuery(cnx, "ALTER TABLE wine_cultivation ADD COLUMN description TEXT DEFAULT NULL"); await ExNonQuery(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 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"); await ExNonQuery(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"); await ExNonQuery(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"); await ExNonQuery(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"); await ExNonQuery(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"); await ExNonQuery(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"); await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_per_kg INTEGER DEFAULT NULL");
ExecuteNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_amount INTEGER DEFAULT NULL"); await ExNonQuery(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 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 ( CREATE TABLE delivery_part_bucket (
year INTEGER NOT NULL, year INTEGER NOT NULL,
did INTEGER NOT NULL, did INTEGER NOT NULL,
@ -402,14 +403,14 @@ namespace Elwig.Helpers {
ON DELETE CASCADE ON DELETE CASCADE
) STRICT; ) STRICT;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO delivery_part_bucket (year, did, dpnr, bktnr, discr, value) INSERT INTO delivery_part_bucket (year, did, dpnr, bktnr, discr, value)
SELECT year, did, dpnr, binnr, discr, value SELECT year, did, dpnr, binnr, discr, value
FROM delivery_part_bin 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 CREATE VIEW v_area_commitment_bucket_strict AS
SELECT s.year, c.mgnr, SELECT s.year, c.mgnr,
t.sortid || COALESCE(a.attrid, '') AS bucket, t.sortid || COALESCE(a.attrid, '') AS bucket,
@ -425,7 +426,7 @@ namespace Elwig.Helpers {
GROUP BY s.year, c.mgnr, bucket GROUP BY s.year, c.mgnr, bucket
ORDER 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 CREATE VIEW v_area_commitment_bucket AS
SELECT year, mgnr, bucket, min_kg, max_kg SELECT year, mgnr, bucket, min_kg, max_kg
FROM v_area_commitment_bucket_strict FROM v_area_commitment_bucket_strict
@ -440,7 +441,7 @@ namespace Elwig.Helpers {
GROUP BY b.year, b.mgnr, b.sortid GROUP BY b.year, b.mgnr, b.sortid
ORDER BY year, mgnr, bucket; ORDER BY year, mgnr, bucket;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_delivery_bucket_strict AS CREATE VIEW v_delivery_bucket_strict AS
SELECT year, mgnr, SELECT year, mgnr,
sortid || IIF(min_quw, COALESCE(attrid, ''), '_') AS bucket, sortid || IIF(min_quw, COALESCE(attrid, ''), '_') AS bucket,
@ -451,7 +452,7 @@ namespace Elwig.Helpers {
GROUP BY year, mgnr, bucket GROUP BY year, mgnr, bucket
ORDER BY year, mgnr, bucket; ORDER BY year, mgnr, bucket;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_delivery_bucket AS CREATE VIEW v_delivery_bucket AS
SELECT year, mgnr, bucket, weight SELECT year, mgnr, bucket, weight
FROM v_delivery_bucket_strict FROM v_delivery_bucket_strict
@ -465,7 +466,7 @@ namespace Elwig.Helpers {
GROUP BY b.year, b.mgnr, b.sortid GROUP BY b.year, b.mgnr, b.sortid
ORDER BY year, mgnr, bucket; ORDER BY year, mgnr, bucket;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_payment_bucket_strict AS CREATE VIEW v_payment_bucket_strict AS
SELECT d.year, d.mgnr, SELECT d.year, d.mgnr,
d.sortid || b.discr AS bucket, d.sortid || b.discr AS bucket,
@ -478,7 +479,7 @@ namespace Elwig.Helpers {
HAVING SUM(b.value) > 0 HAVING SUM(b.value) > 0
ORDER BY d.year, d.mgnr, bucket; ORDER BY d.year, d.mgnr, bucket;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_payment_bucket AS CREATE VIEW v_payment_bucket AS
SELECT year, mgnr, bucket, weight SELECT year, mgnr, bucket, weight
FROM v_payment_bucket_strict FROM v_payment_bucket_strict
@ -494,9 +495,9 @@ namespace Elwig.Helpers {
"""); """);
} }
private static void UpdateDBSchema_6_To_7(SqliteConnection cnx) { private static async Task UpdateDBSchema_6_To_7(SqliteConnection cnx) {
ExecuteNonQuery(cnx, "DROP VIEW v_area_commitment_bucket_strict"); await ExNonQuery(cnx, "DROP VIEW v_area_commitment_bucket_strict");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_area_commitment_bucket_strict AS CREATE VIEW v_area_commitment_bucket_strict AS
SELECT s.year, c.mgnr, SELECT s.year, c.mgnr,
t.sortid || COALESCE(a.attrid, '') AS bucket, t.sortid || COALESCE(a.attrid, '') AS bucket,
@ -514,14 +515,14 @@ namespace Elwig.Helpers {
ORDER BY s.year, c.mgnr, bucket; ORDER BY s.year, c.mgnr, bucket;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_under_delivery_bucket_strict AS CREATE VIEW v_under_delivery_bucket_strict AS
SELECT c.year, c.mgnr, c.bucket, c.min_kg, COALESCE(p.weight, 0) AS weight SELECT c.year, c.mgnr, c.bucket, c.min_kg, COALESCE(p.weight, 0) AS weight
FROM v_area_commitment_bucket_strict c 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) 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; ORDER BY c.year, c.mgnr, c.bucket;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_under_delivery_bucket AS CREATE VIEW v_under_delivery_bucket AS
SELECT u.year, u.mgnr, u.bucket, u.min_kg, SELECT u.year, u.mgnr, u.bucket, u.min_kg,
u.weight + SUM(MAX(COALESCE(p.weight - s.min_kg, 0), 0)) AS weight 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 GROUP BY u.year, u.mgnr, u.bucket
ORDER 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 CREATE VIEW v_under_delivery AS
SELECT year, mgnr, bucket, min_kg, weight, weight - min_kg AS diff SELECT year, mgnr, bucket, min_kg, weight, weight - min_kg AS diff
FROM v_under_delivery_bucket FROM v_under_delivery_bucket
@ -541,76 +542,76 @@ namespace Elwig.Helpers {
"""); """);
} }
private static void UpdateDbSchema_7_To_8(SqliteConnection cnx) { private static async Task UpdateDbSchema_7_To_8(SqliteConnection cnx) {
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO wb_gem INSERT INTO wb_gem
SELECT a.gkz, 'WLNO' SELECT a.gkz, 'WLNO'
FROM AT_gem a FROM AT_gem a
LEFT JOIN wb_gem w ON w.gkz = a.gkz LEFT JOIN wb_gem w ON w.gkz = a.gkz
WHERE a.gkz / 10000 = 3 AND w.hkid IS NULL; WHERE a.gkz / 10000 = 3 AND w.hkid IS NULL;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO wb_gem INSERT INTO wb_gem
SELECT gkz, 'SLVL' SELECT gkz, 'SLVL'
FROM AT_gem FROM AT_gem
WHERE gkz / 100 IN (617, 622, 623); WHERE gkz / 100 IN (617, 622, 623);
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO wb_gem INSERT INTO wb_gem
SELECT gkz, 'SLSS' SELECT gkz, 'SLSS'
FROM AT_gem FROM AT_gem
WHERE gkz / 100 = 610; WHERE gkz / 100 = 610;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
UPDATE wb_gem UPDATE wb_gem
SET hkid = 'SLVL' SET hkid = 'SLVL'
WHERE gkz IN (61007, 61052, 61001, 61055, 61027, 61057, 61008, 61057); WHERE gkz IN (61007, 61052, 61001, 61055, 61027, 61057, 61008, 61057);
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO wb_gem INSERT INTO wb_gem
SELECT gkz, 'SLWS' SELECT gkz, 'SLWS'
FROM AT_gem 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); 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 INSERT INTO wb_gem
SELECT g.gkz, 'SLVL' SELECT g.gkz, 'SLVL'
FROM AT_gem g FROM AT_gem g
LEFT JOIN wb_gem w ON w.gkz = g.gkz LEFT JOIN wb_gem w ON w.gkz = g.gkz
WHERE g.gkz / 100 = 606 AND w.hkid IS NULL; WHERE g.gkz / 100 = 606 AND w.hkid IS NULL;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO wb_gem INSERT INTO wb_gem
SELECT g.gkz, 'SLST' SELECT g.gkz, 'SLST'
FROM AT_gem g FROM AT_gem g
LEFT JOIN wb_gem w ON w.gkz = g.gkz LEFT JOIN wb_gem w ON w.gkz = g.gkz
WHERE g.gkz / 10000 = 6 AND w.hkid IS NULL; WHERE g.gkz / 10000 = 6 AND w.hkid IS NULL;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO wb_gem INSERT INTO wb_gem
SELECT gkz, 'BLOO' SELECT gkz, 'BLOO'
FROM AT_gem FROM AT_gem
WHERE gkz / 10000 = 4; WHERE gkz / 10000 = 4;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO wb_gem INSERT INTO wb_gem
SELECT gkz, 'BLKA' SELECT gkz, 'BLKA'
FROM AT_gem FROM AT_gem
WHERE gkz / 10000 = 2; WHERE gkz / 10000 = 2;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO wb_gem INSERT INTO wb_gem
SELECT gkz, 'BLSB' SELECT gkz, 'BLSB'
FROM AT_gem FROM AT_gem
WHERE gkz / 10000 = 5; WHERE gkz / 10000 = 5;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO wb_gem INSERT INTO wb_gem
SELECT gkz, 'BLTI' SELECT gkz, 'BLTI'
FROM AT_gem FROM AT_gem
WHERE gkz / 10000 = 7; WHERE gkz / 10000 = 7;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
INSERT INTO wb_gem INSERT INTO wb_gem
SELECT gkz, 'BLVO' SELECT gkz, 'BLVO'
FROM AT_gem FROM AT_gem
@ -618,8 +619,8 @@ namespace Elwig.Helpers {
"""); """);
} }
private static void UpdateDbSchema_8_To_9(SqliteConnection cnx) { private static async Task UpdateDbSchema_8_To_9(SqliteConnection cnx) {
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TABLE payment_delivery_part_bucket ( CREATE TABLE payment_delivery_part_bucket (
year INTEGER NOT NULL, year INTEGER NOT NULL,
did INTEGER NOT NULL, did INTEGER NOT NULL,
@ -640,13 +641,13 @@ namespace Elwig.Helpers {
) STRICT; ) STRICT;
"""); """);
ExecuteNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_i"); await ExNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_i");
ExecuteNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_u"); await ExNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_u");
ExecuteNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_d"); await ExNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_d");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part RENAME COLUMN amount TO net_amount"); await ExNonQuery(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, "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 CREATE TRIGGER t_payment_delivery_part_bucket_i
AFTER INSERT ON payment_delivery_part_bucket FOR EACH ROW AFTER INSERT ON payment_delivery_part_bucket FOR EACH ROW
BEGIN BEGIN
@ -655,7 +656,7 @@ namespace Elwig.Helpers {
ON CONFLICT DO UPDATE SET net_amount = net_amount + NEW.amount; ON CONFLICT DO UPDATE SET net_amount = net_amount + NEW.amount;
END; END;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TRIGGER t_payment_delivery_part_bucket_u CREATE TRIGGER t_payment_delivery_part_bucket_u
AFTER UPDATE OF amount ON payment_delivery_part_bucket FOR EACH ROW AFTER UPDATE OF amount ON payment_delivery_part_bucket FOR EACH ROW
BEGIN BEGIN
@ -667,7 +668,7 @@ namespace Elwig.Helpers {
WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr); WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr);
END; END;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TRIGGER t_payment_delivery_part_bucket_d CREATE TRIGGER t_payment_delivery_part_bucket_d
AFTER DELETE ON payment_delivery_part_bucket FOR EACH ROW AFTER DELETE ON payment_delivery_part_bucket FOR EACH ROW
BEGIN BEGIN
@ -677,12 +678,12 @@ namespace Elwig.Helpers {
END; END;
"""); """);
ExecuteNonQuery(cnx, "ALTER TABLE payment_member RENAME COLUMN amount TO net_amount"); await ExNonQuery(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"); await ExNonQuery(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"); await ExNonQuery(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 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 CREATE TRIGGER t_payment_delivery_part_i
AFTER INSERT ON payment_delivery_part FOR EACH ROW AFTER INSERT ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
@ -691,7 +692,7 @@ namespace Elwig.Helpers {
ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount; ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount;
END; END;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TRIGGER t_payment_delivery_part_u CREATE TRIGGER t_payment_delivery_part_u
AFTER UPDATE OF amount ON payment_delivery_part FOR EACH ROW AFTER UPDATE OF amount ON payment_delivery_part FOR EACH ROW
BEGIN 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))); WHERE (year, avnr, mgnr) = (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did)));
END; END;
"""); """);
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TRIGGER t_payment_delivery_part_d CREATE TRIGGER t_payment_delivery_part_d
AFTER DELETE ON payment_delivery_part FOR EACH ROW AFTER DELETE ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
@ -714,10 +715,10 @@ namespace Elwig.Helpers {
"""); """);
} }
private static void UpdateDbSchema_9_To_10(SqliteConnection cnx) { private static async Task UpdateDbSchema_9_To_10(SqliteConnection cnx) {
ExecuteNonQuery(cnx, "UPDATE wine_quality_level SET min_kmw = 10.6 WHERE qualid = 'RSW'"); await ExNonQuery(cnx, "UPDATE wine_quality_level SET min_kmw = 10.6 WHERE qualid = 'RSW'");
ExecuteNonQuery(cnx, "DROP VIEW v_area_commitment_bucket"); await ExNonQuery(cnx, "DROP VIEW v_area_commitment_bucket");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_area_commitment_bucket AS CREATE VIEW v_area_commitment_bucket AS
SELECT year, mgnr, bucket, area, min_kg, max_kg SELECT year, mgnr, bucket, area, min_kg, max_kg
FROM v_area_commitment_bucket_strict 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... // Drop columns, if they exist...
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_1"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_1");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_2"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_2");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_3"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_3");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_4"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_4");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_5"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_5");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_6"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_6");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_7"); await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_7");
ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_8"); await ExNonQuery(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_9");
ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_i"); await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_i");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TRIGGER t_payment_delivery_part_i CREATE TRIGGER t_payment_delivery_part_i
AFTER INSERT ON payment_delivery_part FOR EACH ROW AFTER INSERT ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
@ -758,8 +759,8 @@ namespace Elwig.Helpers {
END; END;
"""); """);
ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_u"); await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_u");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TRIGGER t_payment_delivery_part_u CREATE TRIGGER t_payment_delivery_part_u
AFTER UPDATE ON payment_delivery_part FOR EACH ROW AFTER UPDATE ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
@ -772,8 +773,8 @@ namespace Elwig.Helpers {
END; END;
"""); """);
ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_d"); await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_d");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TRIGGER t_payment_delivery_part_d CREATE TRIGGER t_payment_delivery_part_d
AFTER DELETE ON payment_delivery_part FOR EACH ROW AFTER DELETE ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
@ -783,8 +784,8 @@ namespace Elwig.Helpers {
END; END;
"""); """);
ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_bucket_u"); await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_bucket_u");
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE TRIGGER t_payment_delivery_part_bucket_u CREATE TRIGGER t_payment_delivery_part_bucket_u
AFTER UPDATE ON payment_delivery_part_bucket FOR EACH ROW AFTER UPDATE ON payment_delivery_part_bucket FOR EACH ROW
BEGIN BEGIN
@ -797,12 +798,12 @@ namespace Elwig.Helpers {
END; END;
"""); """);
ExecuteNonQuery(cnx, "ALTER TABLE payment_member DROP COLUMN amount"); await ExNonQuery(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 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) { private static async Task UpdateDbSchema_11_To_12(SqliteConnection cnx) {
ExecuteNonQuery(cnx, """ await ExNonQuery(cnx, """
CREATE VIEW v_stat_member AS CREATE VIEW v_stat_member AS
SELECT year, mgnr, SELECT year, mgnr,
SUM(weight) AS sum, SUM(weight) AS sum,