sql模板引擎
This commit is contained in:
parent
01e895547e
commit
c9fab3d7f4
|
@ -0,0 +1,83 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using NewLife.Collections;
|
||||
|
||||
namespace AntJob.Data
|
||||
{
|
||||
/// <summary>模板助手</summary>
|
||||
public static class TemplateHelper
|
||||
{
|
||||
/// <summary>使用时间参数处理模板</summary>
|
||||
/// <param name="template"></param>
|
||||
/// <param name="startTime"></param>
|
||||
/// <param name="endTime"></param>
|
||||
/// <returns></returns>
|
||||
public static String Build(String template, DateTime startTime, DateTime endTime)
|
||||
{
|
||||
if (template.IsNullOrEmpty()) return template;
|
||||
|
||||
var str = template;
|
||||
var sb = Pool.StringBuilder.Get();
|
||||
var p = 0;
|
||||
while (true)
|
||||
{
|
||||
var ti = Find(str, "Start", p);
|
||||
if (ti == null)
|
||||
{
|
||||
sb.Append(str.Substring(p));
|
||||
break;
|
||||
}
|
||||
|
||||
// 准备替换
|
||||
var val = ti.Item3.IsNullOrEmpty() ? startTime.ToFullString() : startTime.ToString(ti.Item3);
|
||||
sb.Append(str.Substring(0, ti.Item1));
|
||||
sb.Append(val);
|
||||
|
||||
// 移动指针
|
||||
p = ti.Item2 + 1;
|
||||
}
|
||||
|
||||
str = sb.ToString();
|
||||
sb.Clear();
|
||||
p = 0;
|
||||
while (true)
|
||||
{
|
||||
var ti = Find(str, "End", p);
|
||||
if (ti == null)
|
||||
{
|
||||
sb.Append(str.Substring(p));
|
||||
break;
|
||||
}
|
||||
|
||||
// 准备替换
|
||||
var val = ti.Item3.IsNullOrEmpty() ? endTime.ToFullString() : endTime.ToString(ti.Item3);
|
||||
sb.Append(str.Substring(0, ti.Item1));
|
||||
sb.Append(val);
|
||||
|
||||
// 移动指针
|
||||
p = ti.Item2 + 1;
|
||||
}
|
||||
|
||||
return sb.Put(true);
|
||||
}
|
||||
|
||||
private static Tuple<Int32, Int32, String> Find(String str, String key, Int32 p)
|
||||
{
|
||||
// 头尾
|
||||
var p1 = str.IndexOf("{" + key, p);
|
||||
if (p1 < 0) return null;
|
||||
|
||||
var p2 = str.IndexOf("}", p1);
|
||||
if (p2 < 0) return null;
|
||||
|
||||
// 格式化字符串
|
||||
var format = "";
|
||||
var p3 = str.IndexOf(":", p1);
|
||||
if (p3 > 0) format = str.Substring(p3 + 1, p2 - p3 - 1);
|
||||
|
||||
// 左括号位置,右括号位置,格式化字符串
|
||||
return new Tuple<Int32, Int32, String>(p1, p2, format);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
|
||||
<PackageReference Include="xunit" Version="2.4.0" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
|
||||
<PackageReference Include="coverlet.collector" Version="1.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AntJob\AntJob.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using AntJob.Data;
|
||||
using Xunit;
|
||||
|
||||
namespace AntTest
|
||||
{
|
||||
public class TemplateHelperTests
|
||||
{
|
||||
[Fact]
|
||||
public void BuildTest()
|
||||
{
|
||||
var tt = @"/*use His*/
|
||||
insert into t1(xxx) select * from t2 where time between {Start} and {End}";
|
||||
var start = DateTime.Now;
|
||||
var end = start.AddSeconds(30);
|
||||
|
||||
var str = TemplateHelper.Build(tt, start, end);
|
||||
Assert.NotNull(str);
|
||||
Assert.NotEmpty(str);
|
||||
Assert.DoesNotContain("{Start}", str);
|
||||
Assert.DoesNotContain("{End}", str);
|
||||
|
||||
var rs = tt.Replace("{Start}", start.ToFullString()).Replace("{End}", end.ToFullString());
|
||||
Assert.Equal(rs, str);
|
||||
}
|
||||
}
|
||||
}
|
15
蚂蚁.sln
15
蚂蚁.sln
|
@ -29,11 +29,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
|||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AntJob.Agent", "AntJob.Agent\AntJob.Agent.csproj", "{0970FDBA-2331-4600-8DD5-A37B41AF989F}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HisAgent", "Samples\HisAgent\HisAgent.csproj", "{E62006DC-E61B-42B0-A06B-ED5BF3F73D9E}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HisAgent", "Samples\HisAgent\HisAgent.csproj", "{E62006DC-E61B-42B0-A06B-ED5BF3F73D9E}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HisData", "Samples\HisData\HisData.csproj", "{38F8667D-70B7-4A90-8CA7-63738E925DFF}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HisData", "Samples\HisData\HisData.csproj", "{38F8667D-70B7-4A90-8CA7-63738E925DFF}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HisWeb", "Samples\HisWeb\HisWeb.csproj", "{153499A6-E73C-4C5A-8867-D29BD586A74B}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HisWeb", "Samples\HisWeb\HisWeb.csproj", "{153499A6-E73C-4C5A-8867-D29BD586A74B}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UnitTest", "UnitTest", "{26660D0A-8724-4434-88D1-5EE861A68309}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AntTest", "AntTest\AntTest.csproj", "{A13E58D2-A185-4945-98B7-B6B0951A19D2}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
|
@ -81,6 +85,10 @@ Global
|
|||
{153499A6-E73C-4C5A-8867-D29BD586A74B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{153499A6-E73C-4C5A-8867-D29BD586A74B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{153499A6-E73C-4C5A-8867-D29BD586A74B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A13E58D2-A185-4945-98B7-B6B0951A19D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A13E58D2-A185-4945-98B7-B6B0951A19D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A13E58D2-A185-4945-98B7-B6B0951A19D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A13E58D2-A185-4945-98B7-B6B0951A19D2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -89,6 +97,7 @@ Global
|
|||
{E62006DC-E61B-42B0-A06B-ED5BF3F73D9E} = {E842807F-C45E-44DA-8AAE-7915C1EBF2A2}
|
||||
{38F8667D-70B7-4A90-8CA7-63738E925DFF} = {E842807F-C45E-44DA-8AAE-7915C1EBF2A2}
|
||||
{153499A6-E73C-4C5A-8867-D29BD586A74B} = {E842807F-C45E-44DA-8AAE-7915C1EBF2A2}
|
||||
{A13E58D2-A185-4945-98B7-B6B0951A19D2} = {26660D0A-8724-4434-88D1-5EE861A68309}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {9337283C-C795-479F-A2F1-C892EBE2490C}
|
||||
|
|
Loading…
Reference in New Issue