using System.Reflection;
using DispenserCommon.Events;
using DispenserCommon.Utils;
using SQLite;
namespace DispenserCommon.DB;
///
/// 在系统启动的时候记进行数据库初始化校验
///
public class DatabaseInitializer
{
private static readonly SqliteHelper Sqlite = ServiceLocator.GetService();
public static void Initialize()
{
EventBus.Publish(EventType.SetupNotify, "正在初始化数据库");
// 扫描所有带有[Table]特性的类
var tables = GetAssemblies()
.SelectMany(a => a.GetTypes()
.Where(t => t.GetCustomAttributes(typeof(TableAttribute), true).Length > 0))
.ToList();
tables.ForEach(table =>
{
// 判断当前的表是否存在
var tableName = table.GetCustomAttribute()?.Name ?? table.Name;
var tableInfo = Sqlite.GetTableInfo(tableName);
if (!tableInfo.Any())
{
Sqlite.CreateTable(table);
}
else
{
// 读取当前类的变量是否新增了属性
var properties = table.GetProperties();
var colNames = tableInfo.Select(col => col.Name.ToUpper()).ToHashSet();
foreach (var property in properties)
{
var colName = property.GetCustomAttribute()?.Name ?? property.Name;
// 统一转为大写进行判断
if (colNames.Contains(colName.ToUpper())) continue;
// 重新进行DDL时,会自动的判断是否存在新增的列,如果有则自动进行新增
Sqlite.CreateTable(table);
}
}
});
}
private static IEnumerable GetAssemblies()
{
var assemblies = new List();
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
var name = assembly.GetName().Name;
if (name != null && name.ToLower().Contains("dispenser")) GetReferenceAssemblies(assembly, assemblies);
}
return assemblies;
}
private static void GetReferenceAssemblies(Assembly assembly, ICollection assemblies)
{
foreach (var assemblyName in assembly.GetReferencedAssemblies())
{
var name = assemblyName.Name;
if (name != null && name.ToLower().Contains("dispenser"))
{
var ass = Assembly.Load(assemblyName);
if (assemblies.Contains(ass)) continue;
assemblies.Add(ass);
GetReferenceAssemblies(ass, assemblies);
}
}
}
}