From 37fdc8c90815f23ec2067b0759509dea57c5695e Mon Sep 17 00:00:00 2001 From: J0shlerB0y <86416124+J0shlerB0y@users.noreply.github.com> Date: Tue, 28 Apr 2026 18:57:47 +0300 Subject: [PATCH 001/135] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B7=D1=8B=20=D0=B8=D0=B7=20=D0=BB=D0=B0=D1=83=D0=BD=D1=87?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=20=D0=B2=D1=85=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QS.Cloud.Client/QSCloudProvider.cs | 4 +- QS.DbManagement/IDbProvider.cs | 3 +- QS.DbManagement/MariaDb/MariaDBProvider.cs | 53 ++++++++++++------- QS.DbManagement/ProviderResponces.cs | 1 + .../QS.Launcher.Avalonia.csproj | 2 +- .../Pages/DataBase/CreateDataBaseWindow.axaml | 27 ++++++++++ .../DataBase/CreateDataBaseWindow.axaml.cs | 32 +++++++++++ .../Pages/{ => DataBase}/DataBasesView.axaml | 17 +++--- .../{ => DataBase}/DataBasesView.axaml.cs | 19 +++++-- QS.Launcher/DependencyInjection.cs | 1 + QS.Launcher/QS.Launcher.csproj | 1 + QS.Launcher/ViewModels/MainWindowVM.cs | 1 + .../DataBase/CreateDataBaseVM.cs | 42 +++++++++++++++ .../{ => DataBase}/DataBasesVM.cs | 51 ++++++++++++------ .../ViewModels/PageViewModels/LoginVM.cs | 1 + 15 files changed, 207 insertions(+), 48 deletions(-) create mode 100644 QS.Launcher.Avalonia/Views/Pages/DataBase/CreateDataBaseWindow.axaml create mode 100644 QS.Launcher.Avalonia/Views/Pages/DataBase/CreateDataBaseWindow.axaml.cs rename QS.Launcher.Avalonia/Views/Pages/{ => DataBase}/DataBasesView.axaml (83%) rename QS.Launcher.Avalonia/Views/Pages/{ => DataBase}/DataBasesView.axaml.cs (77%) create mode 100644 QS.Launcher/ViewModels/PageViewModels/DataBase/CreateDataBaseVM.cs rename QS.Launcher/ViewModels/PageViewModels/{ => DataBase}/DataBasesVM.cs (80%) diff --git a/QS.Cloud.Client/QSCloudProvider.cs b/QS.Cloud.Client/QSCloudProvider.cs index c6e33dd8e..6ec7e78c5 100644 --- a/QS.Cloud.Client/QSCloudProvider.cs +++ b/QS.Cloud.Client/QSCloudProvider.cs @@ -25,6 +25,8 @@ public class QSCloudProvider : IDbProvider { #endregion public string UserName { get; private set; } + public bool CanCreateDatabase => throw new NotImplementedException(); + private CloudFeaturesClient featuresClient; private LoginManagementCloudClient loginClient; private SessionManagementCloudClient sessionClient; @@ -49,7 +51,7 @@ public bool ChangePassword(string username, string oldPassword, string newPasswo throw new NotImplementedException(); } - public bool CreateDatabase(string databaseName) + public bool CreateDatabase(string databaseName, string title) { throw new NotImplementedException(); } diff --git a/QS.DbManagement/IDbProvider.cs b/QS.DbManagement/IDbProvider.cs index da6ea6964..d0c6fd3e6 100644 --- a/QS.DbManagement/IDbProvider.cs +++ b/QS.DbManagement/IDbProvider.cs @@ -11,7 +11,7 @@ public interface IDbProvider : IDisposable bool ChangePassword(string username, string oldPassword, string newPassword); - bool CreateDatabase(string databaseName); + bool CreateDatabase(string databaseName, string title); bool DropDatabase(string databaseName); @@ -26,5 +26,6 @@ public interface IDbProvider : IDisposable bool IsConnected { get; } bool IsAdmin { get; } + bool CanCreateDatabase { get; } } } diff --git a/QS.DbManagement/MariaDb/MariaDBProvider.cs b/QS.DbManagement/MariaDb/MariaDBProvider.cs index 1e011a88b..090b993cc 100644 --- a/QS.DbManagement/MariaDb/MariaDBProvider.cs +++ b/QS.DbManagement/MariaDb/MariaDBProvider.cs @@ -16,7 +16,7 @@ public class MariaDBProvider : IDbProvider { private static readonly string[] SystemDatabases = { "information_schema", "mysql", "performance_schema", "sys" }; readonly MySqlConnection connection; - readonly MySqlConnectionStringBuilder connectionStringBuilder; + readonly MySqlConnectionStringBuilder ConnectionStringBuilder; public bool IsConnected => connection.State == ConnectionState.Open; @@ -28,10 +28,15 @@ public class MariaDBProvider : IDbProvider { /// public bool CanCreateDatabase { get; private set; } + /// + /// Переданный в тайтл созданой базы, + /// нужен потом при применения скрипта с наполнением базы + /// + public string CreatedTitle { get; private set; } + #region Параметры подключения public string Server { get; } public string UserName { get; } - public string ProductName { get; } private readonly string password; #endregion @@ -39,19 +44,29 @@ public MariaDBProvider(IList parameters, string passwo if(parameters == null) throw new ArgumentNullException(nameof(parameters)); - Server = parameters.First(p => p.Name == "Server").Value; + string serverValue = parameters.First(p => p.Name == "Server").Value; UserName = parameters.First(p => p.Name == "Login").Value; this.password = password; - var builder = new MySqlConnectionStringBuilder { - Server = Server, + string host = serverValue; + uint? port = null; + if(serverValue.Contains(":")) { + var parts = serverValue.Split(':'); + host = parts[0]; + if(uint.TryParse(parts[1], out var parsedPort)) + port = parsedPort; + } + Server = serverValue; + + ConnectionStringBuilder = new MySqlConnectionStringBuilder { + Server = host, UserID = UserName, Password = password, - AllowUserVariables = true, - ConvertZeroDateTime = true + AllowUserVariables = true }; - connectionStringBuilder = builder; - connection = new MySqlConnection(builder.ConnectionString); + if(port != null) + ConnectionStringBuilder.Port = port.Value; + connection = new MySqlConnection(ConnectionStringBuilder.ConnectionString); } #region IDbProvider @@ -70,13 +85,13 @@ public LoginToServerResponse LoginToServer() { CanCreateDatabase = IsAdmin || grants.Any(g => g.IndexOf("ALL PRIVILEGES", StringComparison.OrdinalIgnoreCase) >= 0 - || g.IndexOf("CREATE", StringComparison.OrdinalIgnoreCase) >= 0); - //todo : разбить на токены и одним циклом по массиву прав проставить булы + || g.IndexOf("CREATE", StringComparison.OrdinalIgnoreCase) >= 0); return new LoginToServerResponse { Success = true, IsAdmin = IsAdmin, - NeedToUpdateLauncher = false + NeedToUpdateLauncher = false, + CanCreateDatabase = CanCreateDatabase }; } catch(MySqlException ex) { @@ -125,8 +140,7 @@ public List GetUserDatabases(IApplicationInfo applicationInfo) { result.Add(new DbInfo { BaseName = dbName, Title = title ?? dbName, - Version = version, - CanCreateDatabase = CanCreateDatabase + Version = version }); } @@ -135,15 +149,14 @@ public List GetUserDatabases(IApplicationInfo applicationInfo) { public LoginToDatabaseResponse LoginToDatabase(DbInfo dbInfo) { try { - connectionStringBuilder.Database = dbInfo.BaseName; + ConnectionStringBuilder.Database = dbInfo.BaseName; return new LoginToDatabaseResponse { Success = true, - ConnectionString = connectionStringBuilder.ConnectionString, + ConnectionString = ConnectionStringBuilder.ConnectionString, Login = UserName, Parameters = new Dictionary { - { "BaseTitle", dbInfo.Title }, - { "SessionId", string.Empty } + { "BaseTitle", dbInfo.Title } } }; } @@ -165,7 +178,8 @@ public bool ChangePassword(string username, string oldPassword, string newPasswo return connection.Execute(sql) != 0; } - public bool CreateDatabase(string databaseName) { + public bool CreateDatabase(string databaseName, string title) { + CreatedTitle = title; string sql = $"CREATE DATABASE IF NOT EXISTS `{databaseName}`"; return connection.Execute(sql) != 0; } @@ -178,7 +192,6 @@ public bool DropDatabase(string databaseName) { public void Dispose() { connection?.Dispose(); } - #endregion } } diff --git a/QS.DbManagement/ProviderResponces.cs b/QS.DbManagement/ProviderResponces.cs index b08cf0a57..b9e6dfa62 100644 --- a/QS.DbManagement/ProviderResponces.cs +++ b/QS.DbManagement/ProviderResponces.cs @@ -9,6 +9,7 @@ public class Response { public class LoginToServerResponse : Response { + public bool CanCreateDatabase { get; set; } public bool IsAdmin { get; set; } public bool NeedToUpdateLauncher { get; set; } } diff --git a/QS.Launcher.Avalonia/QS.Launcher.Avalonia.csproj b/QS.Launcher.Avalonia/QS.Launcher.Avalonia.csproj index 0573db99d..553012330 100644 --- a/QS.Launcher.Avalonia/QS.Launcher.Avalonia.csproj +++ b/QS.Launcher.Avalonia/QS.Launcher.Avalonia.csproj @@ -53,7 +53,7 @@ LoginView.axaml - + DataBasesView.axaml diff --git a/QS.Launcher.Avalonia/Views/Pages/DataBase/CreateDataBaseWindow.axaml b/QS.Launcher.Avalonia/Views/Pages/DataBase/CreateDataBaseWindow.axaml new file mode 100644 index 000000000..73c0a0e0c --- /dev/null +++ b/QS.Launcher.Avalonia/Views/Pages/DataBase/CreateDataBaseWindow.axaml @@ -0,0 +1,27 @@ + + + - - - - diff --git a/QS.Launcher.Avalonia/Views/Pages/BaseManagementView.axaml.cs b/QS.Launcher.Avalonia/Views/Pages/BaseManagementView.axaml.cs deleted file mode 100644 index e6332d279..000000000 --- a/QS.Launcher.Avalonia/Views/Pages/BaseManagementView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; -using QS.Launcher.ViewModels.PageViewModels; - -namespace QS.Launcher.Views.Pages; - -public partial class BaseManagementView : UserControl { - public BaseManagementView(BaseManagementVM viewModel) { - InitializeComponent(); - DataContext = viewModel; - } -} diff --git a/QS.Launcher.Avalonia/Views/Pages/DataBase/CreateDataBaseProgressView.axaml b/QS.Launcher.Avalonia/Views/Pages/DataBase/CreateDataBaseProgressView.axaml index ee33ff10a..03a75c017 100644 --- a/QS.Launcher.Avalonia/Views/Pages/DataBase/CreateDataBaseProgressView.axaml +++ b/QS.Launcher.Avalonia/Views/Pages/DataBase/CreateDataBaseProgressView.axaml @@ -10,7 +10,7 @@ Loaded="OnLoaded" mc:Ignorable="d"> -