added mysql connection

This commit is contained in:
Tim G. | SnapixLP 2025-06-06 01:11:26 +02:00
parent 830c94d5e4
commit 57e8f64095
3 changed files with 201 additions and 42 deletions

37
Server/DbConfig.cs Normal file
View File

@ -0,0 +1,37 @@
using System.Text.Json;
namespace Server;
public class DbConfig
{
private const string CONFIG_PATH = "config.json";
public string Username { get; set; } = "";
public string Password { get; set; } = "";
public string Server { get; set; } = "";
public string Port { get; set; } = ""; // new
public string Database { get; set; } = "";
public void Save()
{
var options = new JsonSerializerOptions { WriteIndented = true };
string json = JsonSerializer.Serialize(this, options);
File.WriteAllText(CONFIG_PATH, json);
}
public static DbConfig? Load()
{
if (!File.Exists(CONFIG_PATH))
return null;
try
{
string json = File.ReadAllText(CONFIG_PATH);
return JsonSerializer.Deserialize<DbConfig>(json);
}
catch
{
return null;
}
}
}

View File

@ -12,11 +12,13 @@ namespace Server
private MySqlConnection _connection;
private MessageSender ms;
public MySQL(string username, string password, string server, string database, MessageSender ms)
public MySQL(string username, string password, string server, string port, string database, MessageSender ms)
{
this.ms = ms;
ms.Log("[MySQL] Initializing connection...");
string connectionString = $"Server={server};Database={database};User ID={username};Password={password};";
// include port in the connection string:
string connectionString = $"Server={server};Port={port};Database={database};User ID={username};Password={password};";
_connection = new MySqlConnection(connectionString);
ms.Log("[MySQL] Connection to database...");
@ -51,7 +53,24 @@ namespace Server
_ => "b"
};
}
/// <summary>
/// Executes a nonquery SQL statement (e.g. CREATE TABLE, ALTER, etc.).
/// Returns null on success, or an error JSON if it fails.
/// </summary>
public string ExecuteNonQuery(string sql)
{
using var cmd = new MySqlCommand(sql, _connection);
try
{
cmd.ExecuteNonQuery();
return JsonResponse(new { success = true });
}
catch (Exception ex)
{
return JsonResponse($"Execute failed: {ex.Message}", true);
}
}
public string Insert(string table, Dictionary<string, object> data)
{
string columns = string.Join(", ", data.Keys);

View File

@ -1,48 +1,151 @@
using DX86;
using System.Text.Json;
using DX86;
using DX86.Modules;
using Library;
namespace Server;
class Program
{
public static MessageSender messageSender;
public static MessageBox messageBox;
public static InputBox inputBox;
public static ItemSelector itemSelector;
public static MySQL mySql;
private static List<TcpServer> servers;
class Program
{
public static MessageSender messageSender;
public static MessageBox messageBox;
public static InputBox inputBox;
public static ItemSelector itemSelector;
public static MySQL mySql;
private static List<TcpServer> servers;
static void Main(string[] args)
{
Console.WriteLine("Initializing server...");
// Initialize the server components
messageSender = new MessageSender("log.txt");
messageBox = new MessageBox(messageSender);
inputBox = new InputBox(messageSender);
itemSelector = new ItemSelector(messageSender);
servers = new List<TcpServer>();
// Connect to the database
//mySql = new MySQL("username", "password", "localhost", "database", messageSender);
// Start the server
ServerLoop();
}
private static void ServerLoop()
{
bool running = true;
string[] menuItems;
string selectedItem;
servers.Add(new BackendServer("0.0.0.0", 3767, messageSender));
// Main server loop
while (running)
static void Main(string[] args)
{
menuItems = [ "Benutzerverwaltung", "Einstellungen", "Beenden" ];
itemSelector.SetTitle("Hauptmenü");
//selectedItem = itemSelector.SelectItemFromList(menuItems);
Console.WriteLine("Initializing server...");
// Initialize UI and logging components
messageSender = new MessageSender("log.txt");
messageBox = new MessageBox(messageSender);
inputBox = new InputBox(messageSender);
itemSelector = new ItemSelector(messageSender);
servers = new List<TcpServer>();
// 1) Load existing DB config or prompt user + initialize
mySql = LoadOrInitDatabase();
// 2) Start the rest of your server loop
ServerLoop();
}
private static MySQL LoadOrInitDatabase()
{
var cfg = DbConfig.Load();
if (cfg != null)
{
messageSender.Log("[Program] Loaded existing database configuration.");
// Use existing credentials to connect (including cfg.Port)
return new MySQL(cfg.Username, cfg.Password, cfg.Server, cfg.Port, cfg.Database, messageSender);
}
else
{
messageSender.Warn("[Program] No existing DB configuration found. Starting init…");
// REPLACE THE FOUR PROMPTS WITH YOUR FIVE ShowAsync(...) CALLS:
string username = inputBox.ShowAsync("MySQL Configuration [1/5]", ["Username for MySQL Connections"]);
string password = inputBox.ShowAsync("MySQL Configuration [2/5]", ["Password for MySQL Connections"]);
string server = inputBox.ShowAsync("MySQL Configuration [3/5]", ["Server Address for MySQL Connections"]);
string port = inputBox.ShowAsync("MySQL Configuration [4/5]", ["Port for MySQL Connections"]);
string database = inputBox.ShowAsync("MySQL Configuration [5/5]", ["Database Name for Database Connections"]);
return InitializeDatabase(username, password, server, port, database);
}
}
/// <summary>
/// Creates a new MySQL connection, runs the CREATE TABLE DDL,
/// saves credentials in config.json, and returns the MySQL instance.
/// </summary>
private static MySQL InitializeDatabase(
string username,
string password,
string server,
string port,
string database
)
{
// 1) Instantiate MySQL (will exit on failure)
var db = new MySQL(username, password, server, port, database, messageSender);
// 2) Create the 'employees' table if it does not exist:
string createEmployeesTable = @"
CREATE TABLE IF NOT EXISTS `employees` (
`Id` VARCHAR(36) NOT NULL PRIMARY KEY,
`Code` VARCHAR(50) NOT NULL,
`Surname` VARCHAR(100) NOT NULL,
`Forename` VARCHAR(100) NOT NULL,
`Email` VARCHAR(150) NOT NULL,
`Phone` VARCHAR(50),
`Street` VARCHAR(200),
`City` VARCHAR(100),
`Postcode` VARCHAR(20),
`Country` VARCHAR(100),
`Department` VARCHAR(100),
`Position` VARCHAR(100),
`EmployeeState` INT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
";
messageSender.Log("[Program] Creating 'employees' table if not present…");
var resultJson = db.ExecuteNonQuery(createEmployeesTable);
// Parse resultJson safely using JsonDocument
try
{
using var doc = JsonDocument.Parse(resultJson);
var root = doc.RootElement;
// Expecting { "error": bool, "data": ... }
bool isError = root.GetProperty("error").GetBoolean();
if (isError)
{
// You can inspect root.GetProperty("data").GetString() if needed
messageSender.Error("[Program] Failed to create 'employees' table: " + resultJson);
Environment.Exit(1);
}
}
}
catch (Exception ex)
{
// If something went wrong parsing JSON, treat it as a fatal error
messageSender.Error($"[Program] Could not parse CREATE TABLE response: {ex.Message}");
messageSender.Error("[Program] Raw response: " + resultJson);
Environment.Exit(1);
}
messageSender.Log("[Program] 'employees' table is ready.");
// TODO: repeat db.ExecuteNonQuery(...) for any other tables you need
// 3) Save the new credentials (including port) into config.json:
var newCfg = new DbConfig
{
Username = username,
Password = password,
Server = server,
Port = port,
Database = database
};
newCfg.Save();
messageSender.Log("[Program] Saved DB configuration to config.json.");
return db;
}
private static void ServerLoop()
{
bool running = true;
string[] menuItems;
string selectedItem;
servers.Add(new BackendServer("0.0.0.0", 3767, messageSender));
// Main server loop
while (running)
{
menuItems = new[] { "Benutzerverwaltung", "Einstellungen", "Beenden" };
itemSelector.SetTitle("Hauptmenü");
//selectedItem = itemSelector.SelectItemFromList(menuItems);
}
}
}