FileSqlServerSync/Server/LocalServer/LocalSyncServer.cs

146 lines
3.7 KiB
C#
Raw Normal View History

using System.Xml.Linq;
2024-07-31 09:14:07 +00:00
using Common;
namespace LocalServer;
public class LocalSyncServer
{
2024-09-05 01:59:57 +00:00
#pragma warning disable CA2211 // Non-constant fields should not be visible
public static string TempRootFile = "C:/TempPack";
public static string SqlPackageAbPath = "sqlpackage";
//public static string MsdeployAbPath = "msdeploy";
//与visual studio 匹配的Msbuild 路径。在vs 中打开power shell 命令行,使用 `(get-Command -Name msbuild).Source `
public static string MSBuildAbPath = "MSBuild";
2024-09-05 01:59:57 +00:00
#pragma warning restore CA2211 // Non-constant fields should not be visible
private StateHelpBase StateHelper;
public void SetStateHelper(StateHelpBase helper)
{
StateHelper = helper;
}
public static string GetProjectOutPath(string project)
{
try
{
XDocument xdoc = XDocument.Load(project);
// 获取根元素
XElement rootElement = xdoc.Root ?? throw new NullReferenceException("Root");
Console.WriteLine("根元素: " + rootElement.Name);
// 遍历子节点
foreach (XElement element in rootElement.Elements())
{
if (element.Name.LocalName.Contains("PropertyGroup"))
{
var Conditon = element.Attribute("Condition");
if (Conditon != null)
{
if (Conditon.Value.Contains("Release"))
{
foreach (XElement element2 in element.Elements())
{
if (element2.Name.LocalName == "OutputPath")
{
return element2.Value;
}
}
}
}
}
}
return "bin/";
}
catch (Exception)
{
return "bin/";
}
}
public StateHelpBase GetStateHelper()
{
return StateHelper;
}
2024-07-31 09:14:07 +00:00
public Config? SyncConfig;
public Config NotNullSyncConfig
{
get
2024-09-05 01:59:57 +00:00
{
if (SyncConfig == null)
{
throw new ArgumentNullException("SyncConfig");
}
return SyncConfig;
2024-09-05 01:59:57 +00:00
}
}
2024-09-05 01:59:57 +00:00
public string Name;
2024-07-31 09:14:07 +00:00
/// <summary>
/// 发布源连接
/// </summary>
public readonly AbsPipeLine LocalPipe;
2024-07-31 09:14:07 +00:00
2024-09-23 05:55:17 +00:00
public readonly AbsPipeLine RemotePipe;
2024-07-31 09:14:07 +00:00
/// <summary>
/// 父工程,用于释放资源
/// </summary>
public readonly LocalSyncServerFactory Factory;
public LocalSyncServer(
AbsPipeLine pipe,
LocalSyncServerFactory factory,
string name,
AbsPipeLine remotePipe
)
{
LocalPipe = pipe;
Factory = factory;
2024-09-05 01:59:57 +00:00
StateHelper = new ConnectAuthorityHelper(this);
Name = name;
2024-09-23 05:55:17 +00:00
RemotePipe = remotePipe;
2024-07-31 09:14:07 +00:00
Task.Run(async () =>
2024-09-05 01:59:57 +00:00
{
try
{
var rs = LocalPipe.Work(
(byte[] b) =>
{
return StateHelper.ReceiveLocalMsg(b);
}
);
await foreach (var r in rs) { }
2024-09-05 01:59:57 +00:00
}
catch (Exception e)
2024-09-05 01:59:57 +00:00
{
Close(e.Message);
2024-09-05 01:59:57 +00:00
}
});
}
2024-07-31 09:14:07 +00:00
2024-09-05 01:59:57 +00:00
public void Close(string? CloseReason)
{
try
{
LocalPipe.Close(CloseReason);
RemotePipe.Close(CloseReason);
2024-09-05 01:59:57 +00:00
}
catch (Exception e)
{
//TODO 日志
Console.WriteLine(e.Message);
}
finally
{
Factory.RemoveLocalSyncServer(this);
}
}
}