From bbb986260ca9e6b064d6a492f9e076d572d5f279 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sat, 15 Apr 2023 18:58:24 +0200 Subject: [PATCH] Speicher-Logik erweitern --- src/RoleEditor/MainWindow.xaml.cs | 27 ++++-- src/brecal.model/DbEntity.cs | 11 ++- src/brecal.model/IDBManager.cs | 4 +- src/brecal.model/Participant.cs | 121 ++++++++++++++++++++++++ src/brecal.model/Role.cs | 10 ++ src/brecal.model/RoleAssignment.cs | 10 ++ src/brecal.model/Securable.cs | 10 ++ src/brecal.model/SecurableAssignment.cs | 11 +++ src/brecal.model/User.cs | 10 ++ src/brecal.mysql/DBManager.cs | 29 ++---- 10 files changed, 214 insertions(+), 29 deletions(-) diff --git a/src/RoleEditor/MainWindow.xaml.cs b/src/RoleEditor/MainWindow.xaml.cs index 53313db..2767da5 100644 --- a/src/RoleEditor/MainWindow.xaml.cs +++ b/src/RoleEditor/MainWindow.xaml.cs @@ -16,6 +16,7 @@ using System.Windows.Navigation; using System.Windows.Shapes; using System.Collections.ObjectModel; using brecal.model; +using brecal.mysql; namespace RoleEditor { @@ -26,12 +27,13 @@ namespace RoleEditor { #region private fields - private ObservableCollection _participants = new ObservableCollection(); - private ObservableCollection _roles = new ObservableCollection(); - private ObservableCollection _securables = new ObservableCollection(); - private ObservableCollection _users = new ObservableCollection(); - private ObservableCollection _assignedRoles = new ObservableCollection(); - private ObservableCollection _assignedSecurables = new ObservableCollection(); + private readonly ObservableCollection _participants = new ObservableCollection(); + private readonly ObservableCollection _roles = new ObservableCollection(); + private readonly ObservableCollection _securables = new ObservableCollection(); + private readonly ObservableCollection _users = new ObservableCollection(); + private readonly ObservableCollection _assignedRoles = new ObservableCollection(); + private readonly ObservableCollection _assignedSecurables = new ObservableCollection(); + private DBManager? _dbManager; #endregion @@ -45,11 +47,20 @@ namespace RoleEditor private void Window_Loaded(object sender, RoutedEventArgs e) { // try database connection + try + { + _dbManager = new(); - // load all participants + // load all participants - // load all roles + // load all roles + } + catch (Exception ex) + { + MessageBox.Show($"Database connection couldn't be established: {ex.Message}"); + this.Close(); + } } #endregion diff --git a/src/brecal.model/DbEntity.cs b/src/brecal.model/DbEntity.cs index 19b74b2..4a098b8 100644 --- a/src/brecal.model/DbEntity.cs +++ b/src/brecal.model/DbEntity.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace brecal.model { - public class DbEntity + public abstract class DbEntity { /// /// DB primary key @@ -23,5 +23,14 @@ namespace brecal.model /// public DateTime? Modified { get; set; } + /// + /// Each database entity must be able to save itself to the database + /// + public abstract void Save(IDBManager manager); + + /// + /// Each entity must be able to delete itself + /// + public abstract void Delete(IDBManager manager); } } diff --git a/src/brecal.model/IDBManager.cs b/src/brecal.model/IDBManager.cs index 0b1f44e..15ff592 100644 --- a/src/brecal.model/IDBManager.cs +++ b/src/brecal.model/IDBManager.cs @@ -10,7 +10,9 @@ namespace brecal.model public interface IDBManager { - void Load(Action prepareAction, Action loadAction); + delegate List LoadFunc(T entity); + + Task> Load(Action prepareAction, LoadFunc loadAction); Task ExecuteScalar(Action prepareAction); diff --git a/src/brecal.model/Participant.cs b/src/brecal.model/Participant.cs index 49e2de0..0e68936 100644 --- a/src/brecal.model/Participant.cs +++ b/src/brecal.model/Participant.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -22,6 +23,126 @@ namespace brecal.model #endregion + #region abstract method implementation + + // TODO: Diese Funktionen in die Basisklasse verschieben und die SetUpdate SetCreate SetDelete + // abstract machen + + public async override void Save(IDBManager manager) + { + if (this.Created.HasValue) + await manager.ExecuteNonQuery(this.SetUpdate); + else + await manager.ExecuteNonQuery(this.SetCreate); + } + + public async override void Delete(IDBManager manager) + { + await manager.ExecuteNonQuery(this.SetDelete); + } + + #endregion + + #region public static methods + + public static async Task> LoadAll(IDBManager manager) + { + List loadResultList = await manager.Load(SetLoadQuery, LoadElems); + List result = new List(); + foreach (Participant p in loadResultList.Cast()) + result.Add(p); + return result; + } + + #endregion + + #region parameter funcs + + public static void SetLoadQuery(IDbCommand cmd) + { + cmd.CommandText = "SELECT id, name, street, postal_code, city, flags, created, modified FROM participant"; + } + + public void SetUpdate(IDbCommand cmd) + { + cmd.CommandText = "UPDATE participant set name = @NAME, street = @STREET, postal_code = @POSTAL_CODE, city = @CITY, flags = @FLAGS WHERE id = @ID"; + this.SetParameters(cmd); + } + + public void SetCreate(IDbCommand cmd) + { + cmd.CommandText = "INSERT INTO participant (name, street, postal_code, city, flags) VALUES ( @NAME, @STREET, @POSTAL_CODE, @CITY, @FLAGS)"; + this.SetParameters(cmd); + } + + public void SetDelete(IDbCommand cmd) + { + cmd.CommandText = "DELETE FROM participant WHERE id = @ID"; + + IDataParameter idParam = cmd.CreateParameter(); + idParam.ParameterName = "ID"; + idParam.Value = this.Id; + cmd.Parameters.Add(idParam); + } + + public static List LoadElems(IDataReader reader) + { + List result = new List(); + while(reader.Read()) + { + Participant p = new(); + p.Id = (uint) reader.GetInt32(0); + if(!reader.IsDBNull(1)) p.Name = reader.GetString(1); + if(!reader.IsDBNull(2)) p.Street = reader.GetString(2); + if (!reader.IsDBNull(3)) p.PostalCode = reader.GetString(3); + if (!reader.IsDBNull(4)) p.City = reader.GetString(4); + if(!reader.IsDBNull(5)) p.Flags = (uint) reader.GetInt32(5); + if (!reader.IsDBNull(6)) p.Created = reader.GetDateTime(6); + if(!reader.IsDBNull(7)) p.Modified = reader.GetDateTime(7); + result.Add(p); + } + return result; + } + + #endregion + + #region private methods + + private void SetParameters(IDbCommand cmd) + { + IDbDataParameter name = cmd.CreateParameter(); + name.ParameterName = "NAME"; + name.Value = this.Name; + cmd.Parameters.Add(name); + + IDbDataParameter street = cmd.CreateParameter(); + street.ParameterName = "STREET"; + street.Value = this.Street; + cmd.Parameters.Add(street); + + IDataParameter postal_code = cmd.CreateParameter(); + postal_code.ParameterName = "POSTAL_CODE"; + postal_code.Value = this.PostalCode; + cmd.Parameters.Add(postal_code); + + IDataParameter city = cmd.CreateParameter(); + city.ParameterName = "CITY"; + city.Value = this.City; + cmd.Parameters.Add(city); + + IDataParameter flags = cmd.CreateParameter(); + flags.ParameterName = "FLAGS"; + flags.Value = this.Flags; + cmd.Parameters.Add(flags); + + IDataParameter idParam = cmd.CreateParameter(); + idParam.ParameterName = "ID"; + idParam.Value = this.Id; + cmd.Parameters.Add(idParam); + } + + #endregion + #region overrides public override string ToString() diff --git a/src/brecal.model/Role.cs b/src/brecal.model/Role.cs index bc182bd..5fa802d 100644 --- a/src/brecal.model/Role.cs +++ b/src/brecal.model/Role.cs @@ -19,6 +19,16 @@ namespace brecal.model #region overrides + public async override void Save(IDBManager manager) + { + + } + + public async override void Delete(IDBManager manager) + { + + } + public override string ToString() { return this.Name ?? $"{base.Id} - {this.GetType().Name}"; diff --git a/src/brecal.model/RoleAssignment.cs b/src/brecal.model/RoleAssignment.cs index 3fd46b5..58ebd60 100644 --- a/src/brecal.model/RoleAssignment.cs +++ b/src/brecal.model/RoleAssignment.cs @@ -17,5 +17,15 @@ namespace brecal.model #endregion + public async override void Save(IDBManager manager) + { + + } + + public async override void Delete(IDBManager manager) + { + + } + } } diff --git a/src/brecal.model/Securable.cs b/src/brecal.model/Securable.cs index 906e8e8..cfb50b8 100644 --- a/src/brecal.model/Securable.cs +++ b/src/brecal.model/Securable.cs @@ -17,6 +17,16 @@ namespace brecal.model #region overrides + public async override void Save(IDBManager manager) + { + + } + + public async override void Delete(IDBManager manager) + { + + } + public override string ToString() { return this.Name ?? $"{base.Id} - {this.GetType().Name}"; diff --git a/src/brecal.model/SecurableAssignment.cs b/src/brecal.model/SecurableAssignment.cs index 7a68bd2..d19a620 100644 --- a/src/brecal.model/SecurableAssignment.cs +++ b/src/brecal.model/SecurableAssignment.cs @@ -15,5 +15,16 @@ namespace brecal.model public Securable? AssignedSecurable { get; set; } #endregion + + public async override void Save(IDBManager manager) + { + + } + + public async override void Delete(IDBManager manager) + { + + } + } } diff --git a/src/brecal.model/User.cs b/src/brecal.model/User.cs index 3358dcb..9eed56f 100644 --- a/src/brecal.model/User.cs +++ b/src/brecal.model/User.cs @@ -18,6 +18,16 @@ #region overrides + public async override void Save(IDBManager manager) + { + + } + + public async override void Delete(IDBManager manager) + { + + } + public override string ToString() { return this.Username ?? $"{base.Id} - {this.GetType().Name}"; diff --git a/src/brecal.mysql/DBManager.cs b/src/brecal.mysql/DBManager.cs index f85f5b9..27c1f69 100644 --- a/src/brecal.mysql/DBManager.cs +++ b/src/brecal.mysql/DBManager.cs @@ -2,35 +2,26 @@ using MySqlConnector; using System.Data; using System.Runtime.CompilerServices; +using static brecal.model.IDBManager; namespace brecal.mysql { public class DBManager : IDBManager { - private static string _connectionString = ""; - + // TODO: remove this and use certificates instead + private static readonly string _connectionString = "Server=localhost;User ID=ds;Password=HalloWach23;Database=bremen_calling"; - public async void Generic() - { - await using var connection = new MySqlConnection("Server=myserver;User ID=mylogin;Password=mypass;Database=mydatabase"); - await connection.OpenAsync(); - - using var command = new MySqlCommand("SELECT field FROM table;", connection); - await using var reader = await command.ExecuteReaderAsync(); - while (await reader.ReadAsync()) - Console.WriteLine(reader.GetString(0)); - } - - public async void Load(Action prepareAction, Action loadAction) + public async Task> Load(Action prepareAction, LoadFunc loadAction) { await using MySqlConnection connection = new MySqlConnection(_connectionString); await connection.OpenAsync(); - using MySqlCommand cmd = new MySqlCommand(); + using MySqlCommand cmd = new(); cmd.Connection = connection; prepareAction(cmd); MySqlDataReader reader = await cmd.ExecuteReaderAsync(); - loadAction(reader); + List result = loadAction(reader); reader.Close(); + return result; } public async Task ExecuteScalar(Action prepareAction) @@ -38,7 +29,7 @@ namespace brecal.mysql await using MySqlConnection connection = new MySqlConnection(_connectionString); await connection.OpenAsync(); - using MySqlCommand cmd = new MySqlCommand(); + using MySqlCommand cmd = new(); cmd.Connection = connection; prepareAction(cmd); object? result = await cmd.ExecuteScalarAsync(); @@ -47,10 +38,10 @@ namespace brecal.mysql public async Task ExecuteNonQuery(Action prepareAction) { - await using MySqlConnection connection = new MySqlConnection(_connectionString); + await using MySqlConnection connection = new(_connectionString); await connection.OpenAsync(); - using MySqlCommand cmd = new MySqlCommand(); + using MySqlCommand cmd = new(); cmd.Connection = connection; prepareAction(cmd); int result = await cmd.ExecuteNonQueryAsync();