using WebSocketSharp.Server;
using MySql.Data.MySqlClient;
using OMS.NET.Common;
using OMS.NET.DbClass;
namespace OMS.NET
{
class Program
{
static void Main(string[] args)
{
try
{
MainLoop();
}
catch (Exception e)
{
Log.Error(e.Message);
}
}
///
/// 检查数据库,如果不满足预设条件则初始化
///
static void DbCheck()
{
//.dblock存在,则默认数据库结构无问题
string dblockPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @".dblock");
string initsqlPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"init.sql");
if (!File.Exists(dblockPath))
{
using MySqlConnection connection = new(GlobalArea.ServerConfig.ConnectionString);
connection.Open();
Log.Info("dblock不存在,连接到数据库服务进行检查");
//检查数据库是否存在,检查数据表是否
// 检查数据库是否存在
string dbName = GlobalArea.ServerConfig.DataBaseName;
string checkDatabaseQuery = $"SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '{dbName}'";
MySqlCommand checkDatabaseCmd = new(checkDatabaseQuery, connection);
object result = checkDatabaseCmd.ExecuteScalar();
if (result == null)
{
// 指定数据库不存在,选择创建数据库及相关表结构
string createDatabaseQuery = $"CREATE DATABASE {dbName} CHARACTER SET utf8mb4";
MySqlCommand createDatabaseCmd = new(createDatabaseQuery, connection);
createDatabaseCmd.ExecuteNonQuery();
Log.Info($"已创建数据库 {dbName}");
}
//创建默认数据表,实现通用逻辑,从init.sql读取创建相关表的sql语句,默认以分号结尾,忽略空行和换行
//如果表已存在则sql应当不会执行任何操作,需要在sql添加 IF NOT EXISTS
if (File.Exists(initsqlPath))
{
string useDb = $"USE {dbName}";
MySqlCommand createDatabaseCmd = new(useDb, connection);
createDatabaseCmd.ExecuteNonQuery();
File.ReadAllText(initsqlPath)
.Split(new[] { ';' })
.Select(s => s.Trim())
.Where(s => !string.IsNullOrWhiteSpace(s))
.ToList().ForEach(sql =>
{
MySqlCommand createDatabaseCmd = new(sql, connection);
createDatabaseCmd.ExecuteNonQuery();
Log.Info($"执行SQL成功 {sql}");
});
}
File.WriteAllText(dblockPath, "");
}
else
{
Log.Info("满足预设条件,跳过数据库检查");
}
}
static void MainLoop()
{
GlobalArea.LoadServerConfig();//加载服务器配置 默认server.yaml
GlobalArea.LoadRsaPkey();//加载rsa私钥 默认.pkey
DbCheck();
//开启ws监听
var wssv = new WebSocketServer(Convert.ToInt16(GlobalArea.ServerConfig.ListenPort), false);
//wssv.SslConfiguration.ServerCertificate = new X509Certificate2(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "server.pfx"));
wssv.AddWebSocketService("/");
wssv.Start();
Console.WriteLine("已开启ws监听, 端口: " + GlobalArea.ServerConfig.ListenPort);
Console.WriteLine("输入exit退出程序");
bool loopFlag = true;
while (loopFlag)
{
string input = Console.ReadLine() ?? "";
switch (input.Trim())
{
case "exit":
loopFlag = false;
break;
case "logins":
Console.WriteLine("当前登录用户 " + GlobalArea.LoginUserCount);
break;
default:
break;
}
}
wssv.Stop();
}
}
}