diff --git a/Database/CommandHandler.cs b/Database/CommandHandler.cs index 5c43ee4..c77e58f 100644 --- a/Database/CommandHandler.cs +++ b/Database/CommandHandler.cs @@ -3,64 +3,353 @@ using ServerDatabase.Utils; namespace ServerDatabase; -public class CommandHandler +public class CommandHandler : ICommandHandler where TClass : class, new() { + internal List Tables = new(); + internal List _Parameters = new(); + internal List _Values = new(); + internal List _ValuesOld = new(); + internal List _ParametersOld = new(); + + public IReadOnlyList Parameters + { + get => _Parameters.AsReadOnly(); + } + public IReadOnlyList Values + { + get => _Values.AsReadOnly(); + } + + private Order? Order = null; private IBetterTable _betterTable; + private string? ctc = null; + private char table_as = 'A'; + private ICommandHandler? _CommandHandlerParent = null; + private ICommandHandler? _Child = null; + + public char TableAsLetter { get => table_as; } + public string? CTC { get => ctc; } + public ICommandHandler? CommandHandlerParent { get => _CommandHandlerParent; } + public ICommandHandler? Child { get => _Child; } + public IBetterTable BetterTable { get => _betterTable; } + internal CommandHandler(IBetterTable betterTable) { this._betterTable = betterTable; } - - private List Parameters = new(); - private List Values = new(); - - private Order? Order = null; - - public CommandHandler WithFilter(Parameter p) + + private CommandHandler(IBetterTable betterTable, char TableAs, ICommandHandler ch) { - Parameters.Add(p); + this._betterTable = betterTable; + this._CommandHandlerParent = ch; + this.table_as = TableAs; + } + + + internal CommandHandler WithFilter(IBetterParameter p) + { + _Parameters.Add(p); return this; } - public CommandHandler WithValue(Parameter p) + internal CommandHandler WithValue(IBetterParameter p) { - Values.Add(p); + _Values.Add(p); return this; } - public CommandHandler WithFilter(TableColumn column, T value, string sign = "=") where T : notnull + internal CommandHandler WithValue(Parameter p) { - return WithFilter(column.CreateParameter(value, sign)); + _ValuesOld.Add(p); + return this; } - - public CommandHandler WithValue(TableColumn column, T value) where T : notnull + public CommandHandler WithFilter(TableColumn column, T value, string sign = "=") where T : notnull { - return WithValue(column.CreateParameter(value)); + return WithFilter(new BetterParameter() + { + Column = column.Name, + Sign = sign, + Value = value, + }); } - - public CommandHandler AscendBy(TableColumn column) where T : notnull + public CommandHandler WithValue(TableColumn column, T value) where T : notnull + { + return WithValue(new BetterParameter() + { + Column = column.Name, + Sign = "=", + Value = value, + }); + } + public CommandHandler AscendBy(TableColumn column) where T : notnull { Order = column.GetAssendingOrder(); return this; } - public CommandHandler DescendBy(TableColumn column) where T : notnull + public CommandHandler DescendBy(TableColumn column) where T : notnull { Order = column.GetDecendingOrder(); return this; } - - public T Read(TableColumn column) where T : notnull + public CommandHandler WithCrossTableCheck(TableColumn column1, Table Table, TableColumn column2) where TCol : class, new() where T : notnull { - return _betterTable.DatabaseHandler.Read($"SELECT {column.Name} FROM {_betterTable.Name} WHERE", Order, Parameters.ToArray()); + return WithCrossTableCheck(column1, "=", Table,column2); } - public void Insert() + public CommandHandler WithCrossTableCheck(TableColumn column1, string sign, Table Table, TableColumn column2) where TCol : class, new() where T : notnull { - _betterTable.Insert(Values.ToArray()); + ctc = $"{table_as}.{column1.Name} {sign} {(char)(table_as + 1)}.{column2.Name}"; + CommandHandler child = new CommandHandler(Table, (char)(table_as + 1), this); + _Child = child; + return child; } + public T Read(TableColumn column) where T : notnull + { + string command = $"SELECT {TableAsLetter}.{column.Name} FROM {_betterTable.Name} AS {TableAsLetter}"; + ICommandHandler? pc = this; + ICommandHandler? c = this.CommandHandlerParent; + while (c is not null) + { + command += $", {c.BetterTable.Name} AS {c.TableAsLetter}"; + pc = c; + c = c.CommandHandlerParent; + } + + command += " WHERE"; + if (string.IsNullOrEmpty(_betterTable.DatabaseHandler.DB) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.IP) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.Uname) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.PW)) throw new Exception("Database conection not fully defined"); + using NpgsqlConnection con = new(_betterTable.DatabaseHandler.ConectionString); + con.Open(); + using NpgsqlCommand cmd = new(); + cmd.Connection = con; + + char col_char = 'A'; + string vals = ""; + while (pc is not null) + { + foreach (IBetterParameter param in pc.Parameters) + { + vals += $"{pc.TableAsLetter}.{param.Column} {param.Sign} @{col_char} AND "; + cmd.Parameters.Add(param.CreateParameter(col_char.ToString())); + col_char++; + } + + if (pc.CTC is not null) vals += pc.CTC + " AND "; + pc = pc.Child; + } + + if (!string.IsNullOrWhiteSpace(vals)) vals = vals.Remove(vals.Length - 5, 5); + if (!string.IsNullOrWhiteSpace(vals) && command.EndsWith("WHERE")) command += $" {vals}"; + command += ";"; + cmd.CommandText = command; + object? temp = cmd.ExecuteScalar(); + con.Close(); + if (temp is DBNull || temp is null) return default!; + if (typeof(T).IsEnum) return (T?)Enum.Parse(typeof(T), temp.ToString()!)!; + if (typeof(T).IsNullableEnum()) return (T?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T))!, temp.ToString()!)!; + return (T?)temp!; + } + + public (T, T2) Read(TableColumn column, TableColumn column2) where T : notnull where T2 : notnull + { + string command = $"SELECT {TableAsLetter}.{column.Name}, {TableAsLetter}.{column2.Name} FROM {_betterTable.Name} AS {TableAsLetter}"; + ICommandHandler? pc = this; + ICommandHandler? c = this.CommandHandlerParent; + while (c is not null) + { + command += $", {c.BetterTable.Name} AS {c.TableAsLetter}"; + pc = c; + c = c.CommandHandlerParent; + } + + command += " WHERE"; + if (string.IsNullOrEmpty(_betterTable.DatabaseHandler.DB) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.IP) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.Uname) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.PW)) throw new Exception("Database conection not fully defined"); + using NpgsqlConnection con = new(_betterTable.DatabaseHandler.ConectionString); + con.Open(); + using NpgsqlCommand cmd = new(); + cmd.Connection = con; + + char col_char = 'A'; + string vals = ""; + while (pc is not null) + { + foreach (IBetterParameter param in pc.Parameters) + { + vals += $"{pc.TableAsLetter}.{param.Column} {param.Sign} @{col_char} AND "; + cmd.Parameters.Add(param.CreateParameter(col_char.ToString())); + col_char++; + } + + if (pc.CTC is not null) vals += pc.CTC + " AND "; + pc = pc.Child; + } + + if (!string.IsNullOrWhiteSpace(vals)) vals = vals.Remove(vals.Length - 5, 5); + if (!string.IsNullOrWhiteSpace(vals) && command.EndsWith("WHERE")) command += $" {vals}"; + command += ";"; + cmd.CommandText = command; + NpgsqlDataReader reader = cmd.ExecuteReader(); + reader.Read(); + object?[] temp = new object[reader.FieldCount]; + for (int i = 0; i < reader.FieldCount; i++) + { + string colname = reader.GetName(i); + object val = reader.GetValue(i); + if (i == 0) + { + if (typeof(T).IsEnum) temp[i] = (T?)Enum.Parse(typeof(T), val.ToString()!)!; + if (typeof(T).IsNullableEnum()) temp[i] = (T?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T))!, val.ToString()!)!; + } + else if (i == 1) + { + if (typeof(T2).IsEnum) temp[i] = (T2?)Enum.Parse(typeof(T2), val.ToString()!)!; + if (typeof(T2).IsNullableEnum()) temp[i] = (T2?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T2))!, val.ToString()!)!; + } + if (temp[i] is null) temp[i] = val; + } + con.Close(); + return ((T)temp[0]!, (T2)temp[1]!); + } + + public (T, T2, T3) Read(TableColumn column, TableColumn column2, TableColumn column3) where T : notnull where T2 : notnull where T3 : notnull + { + string command = $"SELECT {TableAsLetter}.{column.Name}, {TableAsLetter}.{column2.Name}, {TableAsLetter}.{column3.Name} FROM {_betterTable.Name} AS {TableAsLetter}"; + ICommandHandler? pc = this; + ICommandHandler? c = this.CommandHandlerParent; + while (c is not null) + { + command += $", {c.BetterTable.Name} AS {c.TableAsLetter}"; + pc = c; + c = c.CommandHandlerParent; + } + + command += " WHERE"; + if (string.IsNullOrEmpty(_betterTable.DatabaseHandler.DB) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.IP) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.Uname) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.PW)) throw new Exception("Database conection not fully defined"); + using NpgsqlConnection con = new(_betterTable.DatabaseHandler.ConectionString); + con.Open(); + using NpgsqlCommand cmd = new(); + cmd.Connection = con; + + char col_char = 'A'; + string vals = ""; + while (pc is not null) + { + foreach (IBetterParameter param in pc.Parameters) + { + vals += $"{pc.TableAsLetter}.{param.Column} {param.Sign} @{col_char} AND "; + cmd.Parameters.Add(param.CreateParameter(col_char.ToString())); + col_char++; + } + + if (pc.CTC is not null) vals += pc.CTC + " AND "; + pc = pc.Child; + } + + if (!string.IsNullOrWhiteSpace(vals)) vals = vals.Remove(vals.Length - 5, 5); + if (!string.IsNullOrWhiteSpace(vals) && command.EndsWith("WHERE")) command += $" {vals}"; + command += ";"; + cmd.CommandText = command; + NpgsqlDataReader reader = cmd.ExecuteReader(); + reader.Read(); + object?[] temp = new object[reader.FieldCount]; + for (int i = 0; i < reader.FieldCount; i++) + { + string colname = reader.GetName(i); + object val = reader.GetValue(i); + if (i == 0) + { + if (typeof(T).IsEnum) temp[i] = (T?)Enum.Parse(typeof(T), val.ToString()!)!; + if (typeof(T).IsNullableEnum()) temp[i] = (T?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T))!, val.ToString()!)!; + } + else if (i == 1) + { + if (typeof(T2).IsEnum) temp[i] = (T2?)Enum.Parse(typeof(T2), val.ToString()!)!; + if (typeof(T2).IsNullableEnum()) temp[i] = (T2?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T2))!, val.ToString()!)!; + } + else if (i == 2) + { + if (typeof(T3).IsEnum) temp[i] = (T3?)Enum.Parse(typeof(T3), val.ToString()!)!; + if (typeof(T3).IsNullableEnum()) temp[i] = (T3?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T3))!, val.ToString()!)!; + } + if (temp[i] is null) temp[i] = val; + } + con.Close(); + return ((T)temp[0]!, (T2)temp[1]!, (T3)temp[2]!); + } + + public (T, T2, T3)[] ReadColumns(TableColumn column, TableColumn column2, TableColumn column3) where T : notnull where T2 : notnull where T3 : notnull + { + string command = $"SELECT {TableAsLetter}.{column.Name}, {TableAsLetter}.{column2.Name}, {TableAsLetter}.{column3.Name} FROM {_betterTable.Name} AS {TableAsLetter}"; + ICommandHandler? pc = this; + ICommandHandler? c = this.CommandHandlerParent; + while (c is not null) + { + command += $", {c.BetterTable.Name} AS {c.TableAsLetter}"; + pc = c; + c = c.CommandHandlerParent; + } + + command += " WHERE"; + if (string.IsNullOrEmpty(_betterTable.DatabaseHandler.DB) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.IP) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.Uname) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.PW)) throw new Exception("Database conection not fully defined"); + using NpgsqlConnection con = new(_betterTable.DatabaseHandler.ConectionString); + con.Open(); + using NpgsqlCommand cmd = new(); + cmd.Connection = con; + + char col_char = 'A'; + string vals = ""; + while (pc is not null) + { + foreach (IBetterParameter param in pc.Parameters) + { + vals += $"{pc.TableAsLetter}.{param.Column} {param.Sign} @{col_char} AND "; + cmd.Parameters.Add(param.CreateParameter(col_char.ToString())); + col_char++; + } + + if (pc.CTC is not null) vals += pc.CTC + " AND "; + pc = pc.Child; + } + + if (!string.IsNullOrWhiteSpace(vals)) vals = vals.Remove(vals.Length - 5, 5); + if (!string.IsNullOrWhiteSpace(vals) && command.EndsWith("WHERE")) command += $" {vals}"; + command += ";"; + cmd.CommandText = command; + NpgsqlDataReader reader = cmd.ExecuteReader(); + List<(T, T2, T3)> l = new(); + while (reader.Read()) + { + object?[] temp = new object[reader.FieldCount]; + for (int i = 0; i < reader.FieldCount; i++) + { + object val = reader.GetValue(i); + if (i == 0) + { + if (typeof(T).IsEnum) temp[i] = (T?)Enum.Parse(typeof(T), val.ToString()!)!; + if (typeof(T).IsNullableEnum()) temp[i] = (T?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T))!, val.ToString()!)!; + } + else if (i == 1) + { + if (typeof(T2).IsEnum) temp[i] = (T2?)Enum.Parse(typeof(T2), val.ToString()!)!; + if (typeof(T2).IsNullableEnum()) temp[i] = (T2?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T2))!, val.ToString()!)!; + } + else if (i == 2) + { + if (typeof(T3).IsEnum) temp[i] = (T3?)Enum.Parse(typeof(T3), val.ToString()!)!; + if (typeof(T3).IsNullableEnum()) temp[i] = (T3?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T3))!, val.ToString()!)!; + } + if (temp[i] is null) temp[i] = val; + } + l.Add(new((T)temp[0]!, (T2)temp[1]!, (T3)temp[2]!)); + } + + con.Close(); + return l.ToArray(); + } + + public void Update() { if (string.IsNullOrEmpty(_betterTable.DatabaseHandler.DB) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.IP) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.Uname) || string.IsNullOrEmpty(_betterTable.DatabaseHandler.PW)) throw new Exception("Database connection not fully defined"); @@ -69,7 +358,7 @@ public class CommandHandler using NpgsqlCommand cmd = new(); cmd.Connection = con; string values = ""; - foreach (Parameter param in Values) + foreach (Parameter param in _ValuesOld) { values += $"{param.PGParameter.ParameterName} {param.Sign} @{param.PGParameter.ParameterName}, "; cmd.Parameters.Add(param.PGParameter); @@ -77,7 +366,7 @@ public class CommandHandler values = values.Remove(values.Length - 2, 2); string fils = ""; - foreach (Parameter param in Parameters) + foreach (Parameter param in _ParametersOld) { fils += $"{param.PGParameter.ParameterName} {param.Sign} @{param.PGParameter.ParameterName} AND"; cmd.Parameters.Add(param.PGParameter); diff --git a/Database/Database.cs b/Database/Database.cs index 59737d5..eb99689 100755 --- a/Database/Database.cs +++ b/Database/Database.cs @@ -38,7 +38,7 @@ public sealed class Database { foreach (ITableColumn Column in Table.Colums) { - VersionsTable.WithColumn(new TableColumn($"{Table.Name}_{Column.Name}") + VersionsTable.WithColumn(new TableColumn($"{Table.Name}_{Column.Name}") { DefaultValue = Column.ColumnVersion }, string.Empty); @@ -122,4 +122,150 @@ public sealed class Database if (typeof(T).IsNullableEnum()) return (T?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T))!, temp.ToString()!)!; return (T?)temp!; } + + public (T, T2) Read(string command, Order? order = null, params Parameter[] Parameters) + { + if (string.IsNullOrEmpty(DB) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(Uname) || string.IsNullOrEmpty(PW)) throw new Exception("Database conection not fully defined"); + using NpgsqlConnection con = new(ConectionString); + con.Open(); + using NpgsqlCommand cmd = new(); + cmd.Connection = con; + string vals = ""; + foreach (Parameter param in Parameters) + { + vals += $"{param.PGParameter.ParameterName} {param.Sign} @{param.PGParameter.ParameterName} AND "; + cmd.Parameters.Add(param.PGParameter); + } + if (command.EndsWith(";")) command = command.Remove(command.Length - 1, 1); + if (!string.IsNullOrWhiteSpace(vals)) vals = vals.Remove(vals.Length - 5, 5); + if (!string.IsNullOrWhiteSpace(vals) && command.EndsWith("WHERE")) command += $" {vals}"; + if (order is not null) command += $" ORDER BY {order.Type} "; + if (order is not null && order.Assending) command += "ASC"; + else { if (order is not null) command += "DESC"; } + command += ";"; + cmd.CommandText = command; + NpgsqlDataReader reader = cmd.ExecuteReader(); + reader.Read(); + object?[] temp = new object[reader.FieldCount]; + for (int i = 0; i < reader.FieldCount; i++) + { + string colname = reader.GetName(i); + object val = reader.GetValue(i); + if (i == 0) + { + if (typeof(T).IsEnum) temp[i] = (T?)Enum.Parse(typeof(T), val.ToString()!)!; + if (typeof(T).IsNullableEnum()) temp[i] = (T?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T))!, val.ToString()!)!; + } + else if (i == 1) + { + if (typeof(T2).IsEnum) temp[i] = (T2?)Enum.Parse(typeof(T2), val.ToString()!)!; + if (typeof(T2).IsNullableEnum()) temp[i] = (T2?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T2))!, val.ToString()!)!; + } + if (temp[i] is null) temp[i] = val; + } + con.Close(); + return ((T)temp[0]!, (T2)temp[1]!); + } + + public (T, T2, T3) Read(string command, Order? order = null, params Parameter[] Parameters) + { + if (string.IsNullOrEmpty(DB) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(Uname) || string.IsNullOrEmpty(PW)) throw new Exception("Database conection not fully defined"); + using NpgsqlConnection con = new(ConectionString); + con.Open(); + using NpgsqlCommand cmd = new(); + cmd.Connection = con; + string vals = ""; + foreach (Parameter param in Parameters) + { + vals += $"{param.PGParameter.ParameterName} {param.Sign} @{param.PGParameter.ParameterName} AND "; + cmd.Parameters.Add(param.PGParameter); + } + if (command.EndsWith(";")) command = command.Remove(command.Length - 1, 1); + if (!string.IsNullOrWhiteSpace(vals)) vals = vals.Remove(vals.Length - 5, 5); + if (!string.IsNullOrWhiteSpace(vals) && command.EndsWith("WHERE")) command += $" {vals}"; + if (order is not null) command += $" ORDER BY {order.Type} "; + if (order is not null && order.Assending) command += "ASC"; + else { if (order is not null) command += "DESC"; } + command += ";"; + cmd.CommandText = command; + NpgsqlDataReader reader = cmd.ExecuteReader(); + reader.Read(); + object?[] temp = new object[reader.FieldCount]; + for (int i = 0; i < reader.FieldCount; i++) + { + string colname = reader.GetName(i); + object val = reader.GetValue(i); + if (i == 0) + { + if (typeof(T).IsEnum) temp[i] = (T?)Enum.Parse(typeof(T), val.ToString()!)!; + if (typeof(T).IsNullableEnum()) temp[i] = (T?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T))!, val.ToString()!)!; + } + else if (i == 1) + { + if (typeof(T2).IsEnum) temp[i] = (T2?)Enum.Parse(typeof(T2), val.ToString()!)!; + if (typeof(T2).IsNullableEnum()) temp[i] = (T2?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T2))!, val.ToString()!)!; + } + else if (i == 2) + { + if (typeof(T3).IsEnum) temp[i] = (T3?)Enum.Parse(typeof(T3), val.ToString()!)!; + if (typeof(T3).IsNullableEnum()) temp[i] = (T3?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T3))!, val.ToString()!)!; + } + if (temp[i] is null) temp[i] = val; + } + con.Close(); + return ((T)temp[0]!, (T2)temp[1]!, (T3)temp[2]!); + } + + public (T, T2, T3)[] ReadColumns(string command, Order? order = null, params Parameter[] Parameters) + { + if (string.IsNullOrEmpty(DB) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(Uname) || string.IsNullOrEmpty(PW)) throw new Exception("Database conection not fully defined"); + using NpgsqlConnection con = new(ConectionString); + con.Open(); + using NpgsqlCommand cmd = new(); + cmd.Connection = con; + string vals = ""; + foreach (Parameter param in Parameters) + { + vals += $"{param.PGParameter.ParameterName} {param.Sign} @{param.PGParameter.ParameterName} AND "; + cmd.Parameters.Add(param.PGParameter); + } + if (command.EndsWith(";")) command = command.Remove(command.Length - 1, 1); + if (!string.IsNullOrWhiteSpace(vals)) vals = vals.Remove(vals.Length - 5, 5); + if (!string.IsNullOrWhiteSpace(vals) && command.EndsWith("WHERE")) command += $" {vals}"; + if (order is not null) command += $" ORDER BY {order.Type} "; + if (order is not null && order.Assending) command += "ASC"; + else { if (order is not null) command += "DESC"; } + command += ";"; + cmd.CommandText = command; + NpgsqlDataReader reader = cmd.ExecuteReader(); + List<(T, T2, T3)> l = new(); + while (reader.Read()) + { + object?[] temp = new object[reader.FieldCount]; + for (int i = 0; i < reader.FieldCount; i++) + { + object val = reader.GetValue(i); + if (i == 0) + { + if (typeof(T).IsEnum) temp[i] = (T?)Enum.Parse(typeof(T), val.ToString()!)!; + if (typeof(T).IsNullableEnum()) temp[i] = (T?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T))!, val.ToString()!)!; + } + else if (i == 1) + { + if (typeof(T2).IsEnum) temp[i] = (T2?)Enum.Parse(typeof(T2), val.ToString()!)!; + if (typeof(T2).IsNullableEnum()) temp[i] = (T2?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T2))!, val.ToString()!)!; + } + else if (i == 2) + { + if (typeof(T3).IsEnum) temp[i] = (T3?)Enum.Parse(typeof(T3), val.ToString()!)!; + if (typeof(T3).IsNullableEnum()) temp[i] = (T3?)Enum.Parse(Nullable.GetUnderlyingType(typeof(T3))!, val.ToString()!)!; + } + if (temp[i] is null) temp[i] = val; + } + l.Add(new((T)temp[0]!, (T2)temp[1]!, (T3)temp[2]!)); + } + + con.Close(); + return l.ToArray(); + } } \ No newline at end of file diff --git a/Database/ICommandHandler.cs b/Database/ICommandHandler.cs new file mode 100644 index 0000000..4e53d62 --- /dev/null +++ b/Database/ICommandHandler.cs @@ -0,0 +1,14 @@ +using ServerDatabase.Utils; + +namespace ServerDatabase; + +public interface ICommandHandler +{ + string? CTC { get; } + char TableAsLetter { get; } + ICommandHandler? CommandHandlerParent { get; } + ICommandHandler? Child { get; } + IReadOnlyList Parameters { get; } + IReadOnlyList Values { get; } + IBetterTable BetterTable { get; } +} \ No newline at end of file diff --git a/Database/ServerDatabase.csproj b/Database/ServerDatabase.csproj index 00f74a3..917585b 100755 --- a/Database/ServerDatabase.csproj +++ b/Database/ServerDatabase.csproj @@ -10,7 +10,7 @@ snupkg Postgresql;sql Server Database - 2.9.9 + 3.0.6 11 enable net8.0 @@ -22,7 +22,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Database/Table.cs b/Database/Table.cs index bbc88eb..8a31b89 100644 --- a/Database/Table.cs +++ b/Database/Table.cs @@ -22,9 +22,9 @@ public class Table : IBetterTable where TRow : class, new() DatabaseHandler = DB; } - public CommandHandler CreateCommand() + public CommandHandler CreateCommand() { - return new CommandHandler(this); + return new CommandHandler(this); } public Table WithColumn(ITableColumn Column, string name) @@ -146,7 +146,7 @@ public class Table : IBetterTable where TRow : class, new() } } - public Table DropColumn(TableColumn Column) where TType : notnull + public Table DropColumn(TableColumn Column) where TType : notnull { Colums_.Remove(Column); return this; @@ -313,7 +313,7 @@ public class Table : IBetterTable where TRow : class, new() DatabaseHandler.ExecuteNonQuery($"ALTER TABLE IF EXISTS public.{Name} OWNER to \"{DatabaseHandler.Uname}\";"); } - public bool TryRead(TableColumn column, Order order, [NotNullWhen(true)]out T? result, params Parameter[] Parameters) where T : notnull + public bool TryRead(TableColumn column, Order order, [NotNullWhen(true)]out T? result, params Parameter[] Parameters) where T : notnull { if (string.IsNullOrEmpty(DatabaseHandler.DB) || string.IsNullOrEmpty(DatabaseHandler.IP) || string.IsNullOrEmpty(DatabaseHandler.Uname) || string.IsNullOrEmpty(DatabaseHandler.PW)) throw new Exception("Database conection not fully defined"); using NpgsqlConnection con = new(DatabaseHandler.ConectionString); @@ -486,24 +486,24 @@ public class Table : IBetterTable where TRow : class, new() return Rows.Any(); } - public bool TryRead(TableColumn column, [NotNullWhen(true)]out T? result, params Parameter[] Parameters) where T : notnull + public bool TryRead(TableColumn column, [NotNullWhen(true)]out T? result, params Parameter[] Parameters) where T : notnull { return TryRead(column, null!, out result, Parameters); } - public void Update(TableColumn condiction_column, Ttype condiction_value, params Parameter[] Parameters) where Ttype : notnull + public void Update(TableColumn condiction_column, Ttype condiction_value, params Parameter[] Parameters) where Ttype : notnull { Update(condiction_column, condiction_value, "=", Parameters); } - public void Update(TableColumn condiction_column, Ttype condiction_value, string Sign, params Parameter[] Parameters) where Ttype : notnull + public void Update(TableColumn condiction_column, Ttype condiction_value, string Sign, params Parameter[] Parameters) where Ttype : notnull { - CommandHandler command = CreateCommand().WithFilter(condiction_column, condiction_value, Sign); + CommandHandler tableCommand = CreateCommand().WithFilter(condiction_column, condiction_value, Sign); foreach (var Parameter in Parameters) { - command.WithValue(Parameter); + tableCommand.WithValue(Parameter); } - command.Update(); + tableCommand.Update(); } public TRow ReadRow(params Parameter[] Parameters) => ReadRow(null, Parameters); @@ -553,13 +553,13 @@ public class Table : IBetterTable where TRow : class, new() return Row; } - public TColumn[] ReadColumn(TableColumn column, params Parameter[] Parameters) where TColumn : notnull => ReadColumn(column, uint.MaxValue, null, Parameters); + public TColumn[] ReadColumn(TableColumn column, params Parameter[] Parameters) where TColumn : notnull => ReadColumn(column, uint.MaxValue, null, Parameters); - public TColumn[] ReadColumn(TableColumn column, uint NumRows, params Parameter[] Parameters) where TColumn : notnull => ReadColumn(column, NumRows, null, Parameters); + public TColumn[] ReadColumn(TableColumn column, uint NumRows, params Parameter[] Parameters) where TColumn : notnull => ReadColumn(column, NumRows, null, Parameters); - public TColumn[] ReadColumn(TableColumn column, Order? Order, params Parameter[] Parameters) where TColumn : notnull => ReadColumn(column, uint.MaxValue, Order, Parameters); + public TColumn[] ReadColumn(TableColumn column, Order? Order, params Parameter[] Parameters) where TColumn : notnull => ReadColumn(column, uint.MaxValue, Order, Parameters); - public TColumn[] ReadColumn(TableColumn column, uint NumRows, Order? order, params Parameter[] Parameters) where TColumn : notnull + public TColumn[] ReadColumn(TableColumn column, uint NumRows, Order? order, params Parameter[] Parameters) where TColumn : notnull { if (string.IsNullOrEmpty(DatabaseHandler.DB) || string.IsNullOrEmpty(DatabaseHandler.IP) || string.IsNullOrEmpty(DatabaseHandler.Uname) || string.IsNullOrEmpty(DatabaseHandler.PW)) throw new Exception("Database conection not fully defined"); using NpgsqlConnection con = new(DatabaseHandler.ConectionString); @@ -650,13 +650,13 @@ public class Table : IBetterTable where TRow : class, new() return Rows.ToArray(); } - public T Read(TableColumn column, params Parameter[] Parameters) where T : notnull + public T Read(TableColumn column, params Parameter[] Parameters) where T : notnull { if (Parameters is null) throw new ArgumentNullException(nameof(Parameters)); return DatabaseHandler.Read($"SELECT {column.Name} FROM {Name} WHERE", (Order?)null, Parameters); } - public T Read(TableColumn column, Order order, params Parameter[] Parameters) where T : notnull + public T Read(TableColumn column, Order order, params Parameter[] Parameters) where T : notnull { if (Parameters is null) throw new ArgumentNullException(nameof(Parameters)); return DatabaseHandler.Read($"SELECT {column.Name} FROM {Name} WHERE", order, Parameters); diff --git a/Database/TableColumn.cs b/Database/TableColumn.cs index 83e82dc..36e6f0a 100644 --- a/Database/TableColumn.cs +++ b/Database/TableColumn.cs @@ -6,14 +6,14 @@ using ServerDatabase.Utils; namespace ServerDatabase; -public class TableColumn : ITableColumn where Ttype : notnull +public class TableColumn : ITableColumn where Ttype : notnull where TRow : class, new() { public TableColumn(string Name, bool IsPrimaryKey = false) { this.Name = Name; this.IsPrimaryKey = IsPrimaryKey; } - + public IForeignKey[] ForeignKeys { get; init; } = Array.Empty(); public long ColumnVersion { get; set; } = 0; @@ -159,23 +159,6 @@ public class TableColumn : ITableColumn where Ttype : notnull t = t.MakeArrayType(); types = typemap[t]; } - /*if (value is null) - { - t = typeof(Ttype); - if (t.IsNullableEnum()) t = Nullable.GetUnderlyingType(t)!.GetEnumUnderlyingType(); - types = typemap[t]; - return new() - { - PGParameter = new(Name, value) - { - IsNullable = true, - Value = DBNull.Value, - DbType = types.Item1, - NpgsqlDbType = types.Item2 - }, - Sign = sign - }; - }*/ types = typemap[t!]; if (types is null) { diff --git a/Database/TableVersions.cs b/Database/TableVersions.cs index 807052c..42532c9 100644 --- a/Database/TableVersions.cs +++ b/Database/TableVersions.cs @@ -4,12 +4,13 @@ public class TableVersions : Table { internal TableVersions(Database db) : base(db) { - ID = new TableColumn("id", true); + ID = new TableColumn("id", true); WithColumn(ID, new("ID")); } public class blankrow { } - public TableColumn ID { get; } + + public TableColumn ID { get; } } \ No newline at end of file