From 397d50e0621c522fb3caafd246d09ffb8f9d4dfd Mon Sep 17 00:00:00 2001 From: JacobTech Date: Fri, 16 Jun 2023 14:24:24 -0400 Subject: [PATCH] Library Update The project now uses the new source generator package for the ServerDatabase package. This now allows code to read a full row at a time while using the type safety from the column definitions. --- LuskiServer/Classes/TableDef/Categories.cs | 6 +- LuskiServer/Classes/TableDef/Channels.cs | 7 +- LuskiServer/Classes/TableDef/Files.cs | 8 ++ LuskiServer/Classes/TableDef/Logs.cs | 7 +- LuskiServer/Classes/TableDef/Messages.cs | 7 +- LuskiServer/Classes/TableDef/Roles.cs | 7 +- .../Classes/TableDef/ServerRoleOverides.cs | 8 +- LuskiServer/Classes/TableDef/SessionTokens.cs | 7 +- .../Classes/TableDef/UserRoleOverides.cs | 7 +- LuskiServer/Classes/TableDef/Users.cs | 7 +- LuskiServer/Classes/Tables.cs | 21 ++-- LuskiServer/Classes/WebTypes/File.cs | 5 + LuskiServer/Classes/WebTypes/SocketMessage.cs | 4 + .../v1/SocketBulkMessageController.cs | 111 ++++++------------ LuskiServer/LuskiServer.csproj | 4 +- LuskiServer/Program.cs | 7 +- 16 files changed, 125 insertions(+), 98 deletions(-) diff --git a/LuskiServer/Classes/TableDef/Categories.cs b/LuskiServer/Classes/TableDef/Categories.cs index e02f116..a28482f 100644 --- a/LuskiServer/Classes/TableDef/Categories.cs +++ b/LuskiServer/Classes/TableDef/Categories.cs @@ -1,4 +1,5 @@ using ServerDatabase; +using ServerDatabase.SourceGenerator; namespace LuskiServer.Classes.TableDef; @@ -12,4 +13,7 @@ public static class Categories public static TableColumn Channels { get; } = new("channels") { DefaultValue = Array.Empty() }; public static TableColumn RoleOverides { get; } = new("role_overides") { DefaultValue = Array.Empty() }; public static TableColumn UserOverides { get; } = new("member_overides") { DefaultValue = Array.Empty() }; -} \ No newline at end of file +} +[TableRow(typeof(Categories))] +public partial class CategoryRow +{} \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Channels.cs b/LuskiServer/Classes/TableDef/Channels.cs index 123a40b..990fe06 100644 --- a/LuskiServer/Classes/TableDef/Channels.cs +++ b/LuskiServer/Classes/TableDef/Channels.cs @@ -2,6 +2,7 @@ using System.Text; using JacobTechEncryption.Enums; using LuskiServer.Enums; using ServerDatabase; +using ServerDatabase.SourceGenerator; namespace LuskiServer.Classes.TableDef; @@ -27,4 +28,8 @@ public static class Channels EncoderType.UTF32, EncoderType.ASCII, EncoderType.Latin1, EncoderType.BigEndianUnicode } }; -} \ No newline at end of file +} + +[TableRow(typeof(Channels))] +public partial class ChannelRow +{} \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Files.cs b/LuskiServer/Classes/TableDef/Files.cs index 56da3d8..21c48bf 100644 --- a/LuskiServer/Classes/TableDef/Files.cs +++ b/LuskiServer/Classes/TableDef/Files.cs @@ -1,5 +1,6 @@ using JacobTechEncryption.Enums; using ServerDatabase; +using ServerDatabase.SourceGenerator; namespace LuskiServer.Classes.TableDef; @@ -13,4 +14,11 @@ public static class Files public static TableColumn Data { get; } = new("data"); public static TableColumn EncryptionType { get; } = new("encryption_type"); public static TableColumn EncoderType { get; } = new("encoder_type"); + public static TableColumn NameEncryptionType { get; } = new("name_encryption_type"); + public static TableColumn NameEncoderType { get; } = new("name_encoder_type"); +} + +[TableRow(typeof(Files))] +public partial class FileRow +{ } \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Logs.cs b/LuskiServer/Classes/TableDef/Logs.cs index b88a695..30a98a9 100644 --- a/LuskiServer/Classes/TableDef/Logs.cs +++ b/LuskiServer/Classes/TableDef/Logs.cs @@ -1,5 +1,6 @@ using LuskiServer.Enums; using ServerDatabase; +using ServerDatabase.SourceGenerator; namespace LuskiServer.Classes.TableDef; @@ -8,4 +9,8 @@ public static class Logs public static TableColumn ID { get; } = new("id", true); public static TableColumn Type { get; } = new("type"); public static TableColumn Message { get; } = new("message"); -} \ No newline at end of file +} + +[TableRow(typeof(Logs))] +public partial class LogRow +{} \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Messages.cs b/LuskiServer/Classes/TableDef/Messages.cs index 77dbba1..9c14e58 100644 --- a/LuskiServer/Classes/TableDef/Messages.cs +++ b/LuskiServer/Classes/TableDef/Messages.cs @@ -1,5 +1,6 @@ using JacobTechEncryption.Enums; using ServerDatabase; +using ServerDatabase.SourceGenerator; namespace LuskiServer.Classes.TableDef; @@ -13,4 +14,8 @@ public static class Messages public static TableColumn EncryptionType { get; } = new("encryption_type"); public static TableColumn EncoderType { get; } = new("encoder_type"); public static TableColumn Files { get; } = new("files"); -} \ No newline at end of file +} + +[TableRow(typeof(Messages))] +public partial class MessageRow +{} \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Roles.cs b/LuskiServer/Classes/TableDef/Roles.cs index 6871359..6e87147 100644 --- a/LuskiServer/Classes/TableDef/Roles.cs +++ b/LuskiServer/Classes/TableDef/Roles.cs @@ -1,5 +1,6 @@ using LuskiServer.Enums; using ServerDatabase; +using ServerDatabase.SourceGenerator; namespace LuskiServer.Classes.TableDef; @@ -11,4 +12,8 @@ public static class Roles public static TableColumn Description { get; } = new("description"); public static TableColumn ServerPermissions { get; } = new("server_perms"); public static TableColumn MembersList { get; } = new("members_list") {DefaultValue = Array.Empty()}; -} \ No newline at end of file +} + +[TableRow(typeof(Roles))] +public partial class RoleRow +{} \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/ServerRoleOverides.cs b/LuskiServer/Classes/TableDef/ServerRoleOverides.cs index 1b57c8a..4335304 100644 --- a/LuskiServer/Classes/TableDef/ServerRoleOverides.cs +++ b/LuskiServer/Classes/TableDef/ServerRoleOverides.cs @@ -1,5 +1,5 @@ -using LuskiServer.Enums; using ServerDatabase; +using ServerDatabase.SourceGenerator; namespace LuskiServer.Classes.TableDef; @@ -8,4 +8,8 @@ public static class ServerRoleOverides public static TableColumn ID { get; } = new("id", true); public static TableColumn RoleID { get; } = new("role_id"); public static TableColumn Overides { get; } = new("overides"); -} \ No newline at end of file +} + +[TableRow(typeof(ServerRoleOverides))] +public partial class ServerRoleOverideRow +{} \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/SessionTokens.cs b/LuskiServer/Classes/TableDef/SessionTokens.cs index 7431ff9..37f08f0 100644 --- a/LuskiServer/Classes/TableDef/SessionTokens.cs +++ b/LuskiServer/Classes/TableDef/SessionTokens.cs @@ -1,4 +1,5 @@ using ServerDatabase; +using ServerDatabase.SourceGenerator; namespace LuskiServer.Classes.TableDef; @@ -9,4 +10,8 @@ public static class SessionTokens public static TableColumn Token { get; } = new("token"); public static TableColumn AddressFilter { get; } = new("address_filter"); public static TableColumn TimeFilter { get; } = new("date_filter"); -} \ No newline at end of file +} + +[TableRow(typeof(SessionTokens))] +public partial class SessionTokenRow +{} \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/UserRoleOverides.cs b/LuskiServer/Classes/TableDef/UserRoleOverides.cs index 08a6c34..811e2fb 100644 --- a/LuskiServer/Classes/TableDef/UserRoleOverides.cs +++ b/LuskiServer/Classes/TableDef/UserRoleOverides.cs @@ -1,5 +1,6 @@ using LuskiServer.Enums; using ServerDatabase; +using ServerDatabase.SourceGenerator; namespace LuskiServer.Classes.TableDef; @@ -8,4 +9,8 @@ public static class UserRoleOverides public static TableColumn ID { get; } = new("id", true); public static TableColumn UserID { get; } = new("user_id"); public static TableColumn Overides { get; } = new("overides"); -} \ No newline at end of file +} + +[TableRow(typeof(UserRoleOverides))] +public partial class UserRoleOverideRow +{} \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Users.cs b/LuskiServer/Classes/TableDef/Users.cs index bf553bf..716d3d0 100644 --- a/LuskiServer/Classes/TableDef/Users.cs +++ b/LuskiServer/Classes/TableDef/Users.cs @@ -1,5 +1,6 @@ using LuskiServer.Enums; using ServerDatabase; +using ServerDatabase.SourceGenerator; namespace LuskiServer.Classes.TableDef; @@ -21,4 +22,8 @@ public class Users public static TableColumn Token { get; } = new("token"); public static TableColumn OfflineData { get; } = new("offline_data"); public static TableColumn OffileKey { get; } = new("offline_key") {DefaultValue = string.Empty}; -} \ No newline at end of file +} + +[TableRow(typeof(Users))] +public partial class UserRow +{} \ No newline at end of file diff --git a/LuskiServer/Classes/Tables.cs b/LuskiServer/Classes/Tables.cs index f5bb2ac..357a1a5 100644 --- a/LuskiServer/Classes/Tables.cs +++ b/LuskiServer/Classes/Tables.cs @@ -1,17 +1,18 @@ +using LuskiServer.Classes.TableDef; using ServerDatabase; namespace LuskiServer.Classes; public static class Tables { - public static Table Users { get; } = new Table("users", null!); - public static Table Roles { get; } = new Table("roles", null!); - public static Table Logs { get; } = new Table("logs", null!); - public static Table Files { get; } = new Table("files", null!); - public static Table Categories { get; } = new Table("categories", null!); - public static Table Channels { get; } = new Table("channels", null!); - public static Table Messages { get; } = new Table("messages", null!); - public static Table ServerRoleOverides { get; } = new Table("role_overides", null!); - public static Table UserRoleOverides { get; } = new Table("user_overides", null!); - public static Table SessionTokens { get; } = new Table("session_tokens", null!); + public static Table Users { get; } = new Table("users", null!); + public static Table Roles { get; } = new Table("roles", null!); + public static Table Logs { get; } = new Table("logs", null!); + public static Table Files { get; } = new Table("files", null!); + public static Table Categories { get; } = new Table("categories", null!); + public static Table Channels { get; } = new Table("channels", null!); + public static Table Messages { get; } = new Table("messages", null!); + public static Table ServerRoleOverides { get; } = new Table("role_overides", null!); + public static Table UserRoleOverides { get; } = new Table("user_overides", null!); + public static Table SessionTokens { get; } = new Table("session_tokens", null!); } \ No newline at end of file diff --git a/LuskiServer/Classes/WebTypes/File.cs b/LuskiServer/Classes/WebTypes/File.cs index 020e145..7c9643f 100644 --- a/LuskiServer/Classes/WebTypes/File.cs +++ b/LuskiServer/Classes/WebTypes/File.cs @@ -1,11 +1,16 @@ using System.Security.Cryptography; using JacobTechEncryption; +using JacobTechEncryption.Enums; namespace LuskiServer.Classes.WebTypes; public class File { public string name { get; set; } = default!; + public EncoderType encoder_type { get; set; } = default!; + public EncoderType name_encoder_type { get; set; } = default!; + public EncryptionType encryption_type { get; set; } = default!; + public EncryptionType name_encryption_type { get; set; } = default!; public string[] data { get; set; } = default!; public ulong? size { get; set; } = default!; public long? id { get; set; } = default!; diff --git a/LuskiServer/Classes/WebTypes/SocketMessage.cs b/LuskiServer/Classes/WebTypes/SocketMessage.cs index 92cc039..268f199 100644 --- a/LuskiServer/Classes/WebTypes/SocketMessage.cs +++ b/LuskiServer/Classes/WebTypes/SocketMessage.cs @@ -1,3 +1,5 @@ +using JacobTechEncryption.Enums; + namespace LuskiServer.Classes.WebTypes; public class SocketMessage : HTTPResponse @@ -6,5 +8,7 @@ public class SocketMessage : HTTPResponse public long user_id { get; set; } = default!; public long id { get; set; } = default!; public string content { get; set; } = default!; + public EncryptionType encryption_type { get; set; } = default!; + public EncoderType encoder_type { get; set; } = default!; public File[] files { get; set; } = default!; } \ No newline at end of file diff --git a/LuskiServer/Controllers/v1/SocketBulkMessageController.cs b/LuskiServer/Controllers/v1/SocketBulkMessageController.cs index 991970e..93ef49b 100644 --- a/LuskiServer/Controllers/v1/SocketBulkMessageController.cs +++ b/LuskiServer/Controllers/v1/SocketBulkMessageController.cs @@ -1,6 +1,4 @@ using Asp.Versioning; -using JacobTechEncryption; -using JacobTechEncryption.Enums; using LuskiServer.Classes; using LuskiServer.Classes.TableDef; using LuskiServer.Classes.WebTypes; @@ -54,89 +52,54 @@ public class SocketBulkMessageController : ControllerBase } } SocketBulkMessage all = new(); - ///StartDatabse(MessagesToDownload, Channel_Id, MostRecentID, sign, out SocketMessage[]? mmm); SocketMessage[]? mmm = null; if (MostRecentID != null) { - var con2 = Luski.Database.CreateConnection(); - con2.Open(); - var cmd2 = con2.CreateCommand(); - Console.WriteLine($"SELECT context,author_id,message_id,files FROM messages WHERE ts {sign} '{new Luski.Snowflake(long.Parse(MostRecentID)).Timestamp}' AND channel_id = '{Channel_Id}' ORDER BY ts DESC LIMIT {MessagesToDownload};"); - cmd2.CommandText = $"SELECT context,author_id,message_id,files FROM messages WHERE ts {sign} '{new Luski.Snowflake(long.Parse(MostRecentID)).Timestamp}' AND channel_id = '{Channel_Id}' ORDER BY ts DESC LIMIT {MessagesToDownload};"; - var reader2 = cmd2.ExecuteReader(); - //Loop(Messages, Channel_Id, out mmm, reader); - long current = 0; - var mmmm = new List(); - while (reader2.Read()) + MessageRow[] rawmsgs = Tables.Messages.ReadRows((uint)MessagesToDownload, + new Order() { Assending = false, Type = Messages.TimeStamp.Name }, + Messages.TimeStamp.CreateParameter(new Luski.Snowflake(long.Parse(MostRecentID)).Timestamp, sign), + Messages.ChannelID.CreateParameter(Channel_Id)); + + List mmmm = new List(); + + foreach (MessageRow Row in rawmsgs) { - current++; - if (current <= MessagesToDownload) + SocketMessage temp = new() { - SocketMessage Current = new(); - //ReadRow(Channel_Id, reader, ref mmm); - Current.channel_id = Channel_Id; - int i2 = 0; - while (i2 < reader2.FieldCount) + content = Convert.ToBase64String(Row.Context), + encoder_type = Row.EncoderType, + encryption_type = Row.EncryptionType, + channel_id = Row.ChannelID, + user_id = Row.AuthorID, + id = Row.ID, + files = Array.Empty() + }; + if (Row.Files.Any()) + { + List list = new(); + foreach (long b in Row.Files) { - //ReadCollume(reader.GetValue(i), ref msg, reader.GetName(i)); - string name = reader2.GetName(i2); - object val = reader2.GetValue(i2); - if (name == "context") Current.content = Convert.ToBase64String((byte[])val); - else if (name == "author_id") Current.user_id = long.Parse(val.ToString()); - else if (name == "message_id") Current.id = long.Parse(val.ToString()); - else if (name == "files") + FileRow fileraw = Tables.Files.ReadRow(Files.ID.CreateParameter(b)); + Classes.WebTypes.File file = new() { - if (val is not DBNull) - { - if ((long[]?)val is not null && ((long[])val).Length > 0) - { - List list = new(); - foreach (long b in (long[])val) - { - var con = Luski.Database.CreateConnection(); - con.Open(); - var cmd = con.CreateCommand(); - cmd.CommandText = $"SELECT name,size FROM files WHERE id = '{b}';"; - var reader = cmd.ExecuteReader(); - int i3 = 0; - Classes.WebTypes.File file = new() - { - data = null!, - id = b - }; - while (reader.Read()) - { - while (i3 < reader.FieldCount) - { - //ReadFileCollume(reader.GetValue(i), ref file, reader.GetName(i)); - string name2 = reader2.GetName(i3); - object val2 = reader2.GetValue(i3); - if (name2 == "name") file.name = Convert.ToBase64String((byte[])val2); - else if (name2 == "size") file.size = ulong.Parse(val2.ToString()); - else; - i3++; - } - if (i3 >= reader.FieldCount) break; - } - - list.Add(file); - con.Close(); - } - Current.files = list.ToArray(); - } - } - } - i2++; + data = null!, + id = b, + name = Convert.ToBase64String(fileraw.Name), + size = ulong.Parse(fileraw.Size.ToString()), + name_encoder_type = fileraw.NameEncoderType, + name_encryption_type = fileraw.NameEncryptionType, + encoder_type = fileraw.EncoderType, + encryption_type = fileraw.EncryptionType + }; + list.Add(file); } - if (mmm == null) break; - mmmm.Add(Current); + + temp.files = list.ToArray(); } - else break; + mmmm.Add(temp); } - mmm = mmmm.ToArray(); - con2.Close(); } - + if (mmm is not null) all.messages = mmm; else all.messages = Array.Empty(); return this.ResponseToResult(all); diff --git a/LuskiServer/LuskiServer.csproj b/LuskiServer/LuskiServer.csproj index bd75fa3..bb535c6 100644 --- a/LuskiServer/LuskiServer.csproj +++ b/LuskiServer/LuskiServer.csproj @@ -4,6 +4,7 @@ net7.0 enable enable + true @@ -22,7 +23,8 @@ - + + diff --git a/LuskiServer/Program.cs b/LuskiServer/Program.cs index 050e646..1388aa1 100644 --- a/LuskiServer/Program.cs +++ b/LuskiServer/Program.cs @@ -9,6 +9,7 @@ using LuskiServer.Enums; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using ServerDatabase; +using ServerDatabase.Utils; using Swashbuckle.AspNetCore.SwaggerGen; [assembly: Microsoft.AspNetCore.Mvc.ApiController] @@ -26,19 +27,19 @@ try Luski.Database.ExecuteNonQuery($"CREATE DATABASE {Luski.Config.Database} WITH OWNER = {Luski.Config.Username} ENCODING = 'UTF8' CONNECTION LIMIT = -1 IS_TEMPLATE = False;"); Console.WriteLine("Database Created"); } -catch (Exception e) +catch { Console.WriteLine("Database Found"); } foreach (PropertyInfo prop in typeof(Tables).GetProperties()) { - Table table = (Table)prop.GetValue(null)!; + ITable table = (ITable)prop.GetValue(null)!; table.DatabaseHandler = Luski.Database; Type t = Type.GetType($"LuskiServer.Classes.TableDef.{prop.Name}")!; foreach(PropertyInfo prop2 in t.GetProperties()) { - table.WithColumn((ITableColumn)prop2.GetValue(null)!); + table.AddColumn((ITableColumn)prop2.GetValue(null)!, prop2.Name); } Luski.Database.Tables.Add(table); }