using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Net.Mime; using System.Reflection.Metadata; using BITKit; using Cysharp.Threading.Tasks; using Godot; using Microsoft.EntityFrameworkCore; using Constant = BITKit.Constant; namespace BITFactory; // ReSharper disable once IdentifierTypo [Serializable] public abstract class IDIS_Base { /// /// 创建时间 /// public DateTime CreateTime { get; set; }=DateTime.Now; /// /// 更新时间 /// public DateTime UpdateTime { get; set; }=DateTime.Now; } // ReSharper disable once IdentifierTypo /// /// 标识的值 /// [Serializable] public class IDIS_Value:IDIS_Base { /// /// 标识码 /// [Key] public string Handle { get; set; } /// /// 创建用户,例如:模板名称,用户名称 /// public string CreateUser { get; set; } } // ReSharper disable once IdentifierTypo public class IDIS_Query : IDIS_Value { // ReSharper disable once IdentifierTypo /// /// 关联的数据 /// public IDIS_Data[] Datas { get; internal set; } // ReSharper disable once IdentifierTypo /// /// 关联的标识引用 /// public IDIS_Reference[] References { get; internal set; } } /// /// 标识的格式 /// [Serializable] // ReSharper disable once IdentifierTypo public class IDIS_Data:IDIS_Base { /// /// 不需要处理这个 /// [Key] public int Index { get; set; } /// /// 标识码 /// public string Handle { get; set; } /// /// 记录的名称,通常为中文 /// public string Name { get; set; } /// /// 值类型,例如string,url,site /// public string Format { get; set; } /// /// 值 /// public string Value { get; set; } /// /// 类型,用于解析时对数据条目进行分类 /// public string Category { get; set; } } /// /// 标识的引用或关联 /// [Serializable] // ReSharper disable once IdentifierTypo public class IDIS_Reference:IDIS_Base { /// /// 不需要处理这个 /// [Key] public int Index{ get; set; } /// /// 标识码 /// public string Handle { get; set; } /// /// 相关联的标识 /// public string RelatedHandle { get; set; } } // ReSharper disable once IdentifierTypo public class IDIS_DBContext:DbContext { /// /// 标识表 /// private DbSet Values { get; set; } /// /// 标识数据表 /// private DbSet Datas{ get; set; } /// /// 标识引用表 /// private DbSet References{ get; set; } /// /// 确保创建数据库 /// /// protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // ReSharper disable once StringLiteralTypo //var sql = SQLiteContextHelper.GetConnectionString("IDIS"); SQLiteContextHelper.GetConnectionSqlAndPath("IDIS",out var sql,out var path); optionsBuilder.UseSqlite(sql); optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll); BIT4Log.Log($"已创建标识数据库:{path}"); } /// /// 查询多个标识 /// /// 模糊标识码 /// 查询列表 /// 是否查询到了内容 public bool Query(string key, out IDIS_Query[] queries) { ChangeTracker.DetectChanges(); ChangeTracker.Clear(); queries = Values .Where(x => x.Handle.Contains(key) || x.CreateUser.Contains(key)) .Select(x => new IDIS_Query() { Handle = x.Handle, CreateTime = x.CreateTime, UpdateTime = x.UpdateTime, CreateUser = x.CreateUser, Datas = Datas.Where(data => data.Handle == x.Handle).ToArray(), References = References.Where(reference => reference.Handle == x.Handle).ToArray() }).ToArray(); return queries.Any(); } /// /// 查询单个标识 /// /// 模糊标识 /// 标识查询结果 /// 是否查询到了标识 public bool Query(string key, out IDIS_Query query) { Query(key, out IDIS_Query[] queries); query = queries.FirstOrDefault(); return queries.Any(); } public bool Register(string handle,string createUser = Constant.System.Internal) { var handleExists = Values.Any(x => x.Handle == handle); if (handleExists) { return false; } var value = new IDIS_Value() { Handle = handle, CreateUser = createUser, }; Values.Add(value); SaveChangesAsync(); return true; } public void Register(string handle,string name,string format, string value,string category) { var handleExists = Values.Any(x => x.Handle == handle); if (!handleExists) { Register(handle); } var data = new IDIS_Data() { Name = name, Handle = handle, Format = format, Value = value, Category = category, }; Datas.Add(data); SaveChangesAsync(); } public void RegisterReference(string handle, string refenceHandle) { References.Add(new IDIS_Reference() { Handle = handle, RelatedHandle = refenceHandle, }); SaveChangesAsync(); } public bool Update(string handle, string format, string value) { var result = Datas.FirstOrDefault(x => x.Handle == handle && x.Format == format); if (result is null) return false; result.UpdateTime=DateTime.Now; result.Value = value; SaveChangesAsync(); return true; } } // ReSharper disable once IdentifierTypo /// /// 标识码注册与查询服务 /// public partial class IDIS_Service:Node { public static IDIS_Service Singleton { get; private set; } private static IDIS_DBContext Context; public override void _Ready() { Context = new IDIS_DBContext(); BIT4Log.Log("已创建标识数据库"); UniTask.Run(()=>Context.Database.EnsureCreatedAsync()); } public override void _EnterTree() { Singleton = this; } public override void _ExitTree() { Context.Dispose(); Context = null; } public bool Query(string word,out IDIS_Query[] queries) => Context.Query(word, out queries); public bool Register(string handle,string createUser=Constant.System.Internal) => Context.Register(handle,createUser); public void Register(string handle,string name, string format, string value,string category) => Context.Register(handle,name, format, value,category); public void RegisterReference(string handle,string refenceHandle) => Context.RegisterReference(handle,refenceHandle); public static string GenerateHandle() => $"88.123.99/{Mathf.Abs(Guid.NewGuid().GetHashCode())}"; public bool Query(string key, out IDIS_Query query) => Context.Query(key, out query); public bool Update(string handle, string format, string value) => Context.Update(handle, format, value); }