diff --git a/Database/ServerDatabase.csproj b/Database/ServerDatabase.csproj
index 12c26b3..6e2d5b1 100755
--- a/Database/ServerDatabase.csproj
+++ b/Database/ServerDatabase.csproj
@@ -10,7 +10,7 @@
snupkg
Postgresql;sql
Server Database
- 2.8.1
+ 2.8.8
10
enable
net6.0
diff --git a/Database/Table.cs b/Database/Table.cs
index dea5766..1d0209a 100644
--- a/Database/Table.cs
+++ b/Database/Table.cs
@@ -36,12 +36,11 @@ public class Table : ITable where TRow : class, new()
}
-
-
- public IReadOnlyList GetMissingColumns(out IReadOnlyList UpdatedColumns)
+ public IReadOnlyList GetMissingColumns(out IReadOnlyList UpdatedColumns, out string[] ExtraColumns)
{
List coll = new(Colums_);
List col = new(Colums_);
+ List co = new();
foreach (DataRow row in DatabaseHandler.CreateConnection().GetSchema("Columns", new[] { DatabaseHandler.DB, null, Name }).Rows)
{
string name = row.Field("COLUMN_NAME")!,
@@ -52,18 +51,29 @@ public class Table : ITable where TRow : class, new()
col.Remove(t.First());
if (t.First()!.GetDatabaseTypeStr() == ty) coll.Remove(t.First());
}
+ else
+ {
+ co.Add(name);
+ }
}
UpdatedColumns = coll;
+ ExtraColumns = co.ToArray();
return col.AsReadOnly();
}
public void UpdateTable()
{
- Console.WriteLine("Updating Table: {0}", Name);
- IReadOnlyList m = GetMissingColumns(out IReadOnlyList n);
+ Console.WriteLine("Verifying Table: {0}", Name);
+ bool i = true;
+ IReadOnlyList m = GetMissingColumns(out IReadOnlyList n, out string[] o);
if (m.Any())
{
+ if (i)
+ {
+ i = false;
+ Console.WriteLine("Fixing Table: {0}", Name);
+ }
if (DatabaseHandler.Read(
$"SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema LIKE 'public' AND table_type LIKE 'BASE TABLE' AND table_name = '{Name}';") ==
0)
@@ -93,6 +103,11 @@ public class Table : ITable where TRow : class, new()
if (n.Any())
{
+ if (i)
+ {
+ i = false;
+ Console.WriteLine("Fixing Table: {0}", Name);
+ }
foreach (ITableColumn col in n)
{
string sql = $"ALTER TABLE public.{Name} ALTER COLUMN {col.Name} TYPE {col.GetDatabaseTypeStr()};";
@@ -112,6 +127,19 @@ public class Table : ITable where TRow : class, new()
}
}
}
+
+ if (o.Any())
+ {
+ if (i)
+ {
+ i = false;
+ Console.WriteLine("Fixing Table: {0}", Name);
+ }
+ foreach (string c in o)
+ {
+ DatabaseHandler.ExecuteNonQuery($"ALTER TABLE IF EXISTS {Name} DROP COLUMN IF EXISTS {c};");
+ }
+ }
}
public Table DropColumn(TableColumn Column) where TType : notnull
@@ -172,6 +200,19 @@ public class Table : ITable where TRow : class, new()
cmd.ExecuteNonQuery();
con.Close();
}
+
+ public void DeleteRows()
+ {
+ 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);
+ con.Open();
+ using NpgsqlCommand cmd = new();
+ cmd.Connection = con;
+ cmd.CommandText = $"DELETE FROM {Name};";
+ cmd.Prepare();
+ cmd.ExecuteNonQuery();
+ con.Close();
+ }
public void Create()
{
@@ -195,7 +236,8 @@ public class Table : ITable where TRow : class, new()
cmd.Prepare();
cmd.ExecuteNonQuery();
con.Close();
- DatabaseHandler.ExecuteNonQuery($"ALTER TABLE IF EXISTS public.{Name} OWNER to {DatabaseHandler.Uname}");
+ DatabaseHandler.ExecuteNonQuery($"ALTER TABLE IF EXISTS " +
+ $"public.{Name} OWNER to \"{DatabaseHandler.Uname}\";");
}
public bool TryRead(TableColumn column, Order order, [NotNullWhen(true)][MaybeNullWhen(false)]out T result, params Parameter[] Parameters) where T : notnull
@@ -319,6 +361,58 @@ public class Table : ITable where TRow : class, new()
return r;
}
+ public bool TryReadRows(out TRow[] rows, params Parameter[] Parameters) => TryReadRows(null!, out rows, Parameters);
+
+ public bool TryReadRows(Order order, out TRow[] rows, params Parameter[] Parameters)
+ {
+ 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);
+ string command = $"SELECT * FROM {Name} WHERE";
+ 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 Rows = new();
+ while (reader.Read())
+ {
+ for (int i = 0; i < reader.FieldCount; i++)
+ {
+ TRow Row = new();
+ string colname = reader.GetName(i);
+ object? val = reader.GetValue(i);
+ if (colnamesraw.ContainsKey(colname))
+ {
+ PropertyInfo? pi = Row.GetType()
+ .GetProperty(colnamesraw[colname]);
+ if (pi is null)
+ {
+ Console.WriteLine("Could not find row {0}", colnamesraw[colname]);
+ continue;
+ }
+ pi.SetValue(Row, val, null);
+ }
+ Rows.Add(Row);
+ }
+ }
+
+ rows = Rows.ToArray();
+ return Rows.Any();
+ }
+
public bool TryRead(TableColumn column, [NotNullWhen(true)][MaybeNullWhen(false)]out T result, params Parameter[] Parameters) where T : notnull
{
return TryRead(column, null!, out result, Parameters);
@@ -426,9 +520,9 @@ public class Table : ITable where TRow : class, new()
for (int j = 0; j < NumRows; j++)
{
if (!reader.Read()) break;
+ TRow Row = new();
for (int i = 0; i < reader.FieldCount; i++)
{
- TRow Row = new();
string colname = reader.GetName(i);
object? val = reader.GetValue(i);
if (colnamesraw.ContainsKey(colname))
@@ -442,8 +536,8 @@ public class Table : ITable where TRow : class, new()
}
pi.SetValue(Row, val, null);
}
- Rows.Add(Row);
}
+ Rows.Add(Row);
}
return Rows.ToArray();