sql模板引擎

This commit is contained in:
大石头 2020-04-11 23:09:50 +08:00
parent 01e895547e
commit c9fab3d7f4
4 changed files with 142 additions and 3 deletions

View File

@ -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);
}
}
}

20
AntTest/AntTest.csproj Normal file
View File

@ -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>

View File

@ -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);
}
}
}

View File

@ -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}