using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Net.Mime;
using BITKit;
using Cysharp.Threading.Tasks;
using Godot;
using Microsoft.EntityFrameworkCore;
namespace BITFactory;
// ReSharper disable once IdentifierTypo
[Serializable]
public abstract class IDIS_Base
{
///
/// 创建时间
///
public DateTime CreateDate { get; set; }=DateTime.Now;
///
/// 更新时间
///
public DateTime UpdateDate { get; set; }=DateTime.Now;
}
// ReSharper disable once IdentifierTypo
///
/// 标识的值
///
[Serializable]
public class IDIS_Value:IDIS_Base
{
///
/// 标识码
///
[Key]
public string Handle { 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; }
///
/// 值类型,例如string,url,site
///
public string Format { get; set; }
///
/// 值
///
public string Value { 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);
BIT4Log.Log($"已创建标识数据库:{path}");
}
///
/// 查询多个标识
///
/// 模糊标识码
/// 查询列表
/// 是否查询到了内容
public bool Query(string key, out IDIS_Query[] queries)
{
var _query = Values.Where(x => x.Handle.Contains(key));
var result = _query.Select(x=>new IDIS_Query()
{
Handle = x.Handle,
CreateDate = x.CreateDate,
UpdateDate = x.UpdateDate,
Datas = Datas.Where(data=>data.Handle == key).ToArray(),
References = References.Where(reference=>reference.Handle == key).ToArray()
});
queries = result.ToArray();
return result.Any();
}
///
/// 查询单个标识
///
/// 模糊标识
/// 标识查询结果
/// 是否查询到了标识
public bool Query(string key, out IDIS_Query query)
{
Query(key, out IDIS_Query[] queries);
query = queries.FirstOrDefault();
var 温度 = Datas
//查询相关的标识
.Where(x => x.Handle == "MyHandle")
.OrderBy(x=>x.CreateDate)
//从标识中查找"MyFormat"
.First(x => x.Format == "Temperature").Value;
return queries.Any();
}
public bool Register(string handle)
{
var handleExists = Values.Any(x => x.Handle == handle);
if (handleExists)
{
return false;
}
var value = new IDIS_Value()
{
Handle = handle
};
Values.Add(value);
SaveChanges();
return true;
}
public void Register(string handle,string format, string value)
{
var handleExists = Values.Any(x => x.Handle == handle);
if (!handleExists)
{
Register(handle);
}
var data = new IDIS_Data()
{
Handle = handle,
Format = format,
Value = value
};
Datas.Add(data);
SaveChanges();
}
public void RegisterReference(string handle, string refenceHandle)
{
References.Add(new IDIS_Reference()
{
Handle = handle,
RelatedHandle = refenceHandle,
});
SaveChanges();
}
}
// ReSharper disable once IdentifierTypo
///
/// 标识码注册与查询服务
///
public partial class IDIS_Service:Node
{
private static IDIS_DBContext Context;
public override void _Ready()
{
Context = new IDIS_DBContext();
BIT4Log.Log("已创建标识数据库");
UniTask.Run(()=>Context.Database.EnsureCreatedAsync());
}
public bool Register(string handle) => Context.Register(handle);
public void Register(string handle, string format, string value) => Context.Register(handle, format, value);
public void RegisterReference(string handle,string refenceHandle) => Context.RegisterReference(handle,refenceHandle);
public static string GenerateHandle() => $"88.123.99/{Mathf.Abs(Guid.NewGuid().GetHashCode())}";
}