Skip to content

Commit e602ee9

Browse files
committed
0. add [For Tag] to support iterate.
1. add support global parameter prefix (defalut=$). 2. add [Env Tag] to support different DBProvider. 3. update Schemas to support above features.
1 parent 64f8a2a commit e602ee9

29 files changed

+198
-81
lines changed

Docs/Schemas/SmartSqlMap.xsd

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
<xs:element ref="IsProperty" />
8181
<xs:element ref="Where" />
8282
<xs:element ref="For" />
83+
<xs:element ref="Env" />
8384
</xs:choice>
8485
<xs:attribute name="CompareValue" type="xs:string" use="required" />
8586
</xs:complexType>
@@ -105,6 +106,7 @@
105106
<xs:element ref="Where" />
106107
<xs:element ref="Dynamic" />
107108
<xs:element ref="For" />
109+
<xs:element ref="Env" />
108110
</xs:choice>
109111
</xs:complexType>
110112
</xs:element>
@@ -139,6 +141,7 @@
139141
<xs:element ref="Where" />
140142
<xs:element ref="Dynamic" />
141143
<xs:element ref="For" />
144+
<xs:element ref="Env" />
142145
</xs:choice>
143146
<xs:attribute name="Prepend" type="xs:string" use="optional" />
144147
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -165,6 +168,7 @@
165168
<xs:element ref="Where" />
166169
<xs:element ref="Dynamic" />
167170
<xs:element ref="For" />
171+
<xs:element ref="Env" />
168172
</xs:choice>
169173
<xs:attribute name="Prepend" type="xs:string" use="optional" />
170174
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -192,6 +196,7 @@
192196
<xs:element ref="Where" />
193197
<xs:element ref="Dynamic" />
194198
<xs:element ref="For" />
199+
<xs:element ref="Env" />
195200
</xs:choice>
196201
<xs:attribute name="Prepend" type="xs:string" use="optional" />
197202
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -219,6 +224,7 @@
219224
<xs:element ref="Where" />
220225
<xs:element ref="Dynamic" />
221226
<xs:element ref="For" />
227+
<xs:element ref="Env" />
222228
</xs:choice>
223229
<xs:attribute name="Prepend" type="xs:string" use="optional" />
224230
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -246,6 +252,7 @@
246252
<xs:element ref="Where" />
247253
<xs:element ref="Dynamic" />
248254
<xs:element ref="For" />
255+
<xs:element ref="Env" />
249256
</xs:choice>
250257
<xs:attribute name="Prepend" type="xs:string" use="optional" />
251258
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -273,6 +280,7 @@
273280
<xs:element ref="Where" />
274281
<xs:element ref="Dynamic" />
275282
<xs:element ref="For" />
283+
<xs:element ref="Env" />
276284
</xs:choice>
277285
<xs:attribute name="Prepend" type="xs:string" use="optional" />
278286
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -300,6 +308,7 @@
300308
<xs:element ref="Where" />
301309
<xs:element ref="Dynamic" />
302310
<xs:element ref="For" />
311+
<xs:element ref="Env" />
303312
</xs:choice>
304313
<xs:attribute name="Prepend" type="xs:string" use="optional" />
305314
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -327,6 +336,7 @@
327336
<xs:element ref="Where" />
328337
<xs:element ref="Dynamic" />
329338
<xs:element ref="For" />
339+
<xs:element ref="Env" />
330340
</xs:choice>
331341
<xs:attribute name="Prepend" type="xs:string" use="optional" />
332342
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -354,6 +364,7 @@
354364
<xs:element ref="Where" />
355365
<xs:element ref="Dynamic" />
356366
<xs:element ref="For" />
367+
<xs:element ref="Env" />
357368
</xs:choice>
358369
<xs:attribute name="Prepend" type="xs:string" use="optional" />
359370
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -381,6 +392,7 @@
381392
<xs:element ref="Where" />
382393
<xs:element ref="Dynamic" />
383394
<xs:element ref="For" />
395+
<xs:element ref="Env" />
384396
</xs:choice>
385397
<xs:attribute name="Prepend" type="xs:string" use="optional" />
386398
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -407,6 +419,7 @@
407419
<xs:element ref="Where" />
408420
<xs:element ref="Dynamic" />
409421
<xs:element ref="For" />
422+
<xs:element ref="Env" />
410423
</xs:choice>
411424
<xs:attribute name="Prepend" type="xs:string" use="optional" />
412425
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -433,6 +446,7 @@
433446
<xs:element ref="Where" />
434447
<xs:element ref="Dynamic" />
435448
<xs:element ref="For" />
449+
<xs:element ref="Env" />
436450
</xs:choice>
437451
<xs:attribute name="Prepend" type="xs:string" use="optional" />
438452
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -459,6 +473,7 @@
459473
<xs:element ref="Where" />
460474
<xs:element ref="Dynamic" />
461475
<xs:element ref="For" />
476+
<xs:element ref="Env" />
462477
</xs:choice>
463478
<xs:attribute name="Prepend" type="xs:string" use="optional" />
464479
<xs:attribute name="Property" type="xs:string" use="required" />
@@ -485,6 +500,7 @@
485500
<xs:element ref="Where" />
486501
<xs:element ref="Dynamic" />
487502
<xs:element ref="For" />
503+
<xs:element ref="Env" />
488504
</xs:choice>
489505
</xs:complexType>
490506
</xs:element>
@@ -509,6 +525,7 @@
509525
<xs:element ref="Where" />
510526
<xs:element ref="Dynamic" />
511527
<xs:element ref="For" />
528+
<xs:element ref="Env" />
512529
</xs:choice>
513530
<xs:attribute name="Prepend" type="xs:string" use="optional" />
514531
</xs:complexType>
@@ -523,6 +540,32 @@
523540
<xs:attribute name="Key" type="xs:string" use="required" />
524541
</xs:complexType>
525542
</xs:element>
543+
<xs:element name="Env">
544+
<xs:complexType mixed="true">
545+
<xs:choice minOccurs="0" maxOccurs="unbounded">
546+
<xs:element ref="IsEmpty" />
547+
<xs:element ref="IsEqual" />
548+
<xs:element ref="IsGreaterEqual" />
549+
<xs:element ref="IsGreaterThan" />
550+
<xs:element ref="IsLessEqual" />
551+
<xs:element ref="IsLessThan" />
552+
<xs:element ref="IsNotEmpty" />
553+
<xs:element ref="IsNotEqual" />
554+
<xs:element ref="IsNotNull" />
555+
<xs:element ref="IsNull" />
556+
<xs:element ref="Include" />
557+
<xs:element ref="Switch" />
558+
<xs:element ref="IsTrue" />
559+
<xs:element ref="IsFalse" />
560+
<xs:element ref="IsProperty" />
561+
<xs:element ref="Where" />
562+
<xs:element ref="Dynamic" />
563+
<xs:element ref="For" />
564+
</xs:choice>
565+
<xs:attribute name="Prepend" type="xs:string" use="optional" />
566+
<xs:attribute name="DbProvider" type="xs:string" use="required" />
567+
</xs:complexType>
568+
</xs:element>
526569
<xs:element name="Statement">
527570
<xs:complexType mixed="true">
528571
<xs:choice minOccurs="0" maxOccurs="unbounded">
@@ -544,6 +587,7 @@
544587
<xs:element ref="Where" />
545588
<xs:element ref="Dynamic" />
546589
<xs:element ref="For" />
590+
<xs:element ref="Env" />
547591
</xs:choice>
548592
<xs:attribute name="Id" type="xs:string" use="required" />
549593
<xs:attribute name="Cache" type="xs:string" use="optional" />

Docs/Schemas/SmartSqlMapConfig.xsd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<xs:element name="Settings">
1919
<xs:complexType>
2020
<xs:attribute name="IsWatchConfigFile" type="xs:boolean" use="required" />
21+
<xs:attribute name="ParameterPrefix" type="xs:string" default="$"/>
2122
</xs:complexType>
2223
</xs:element>
2324
<xs:element name="Database">

SmartSql.Tests/SmartSqlMapConfig.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<SmartSqlMapConfig xmlns="http://SmartSql.net/schemas/SmartSqlMapConfig.xsd">
33
<Settings
44
IsWatchConfigFile="true"
5+
56
/>
67
<Database>
78
<DbProvider Name="SqlClientFactory" ParameterPrefix="@" Type="System.Data.SqlClient.SqlClientFactory, System.Data.SqlClient"/>

SmartSql/Abstractions/RequestContext.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Dapper;
2+
using SmartSql.SqlMap;
23
using System;
34
using System.Collections;
45
using System.Collections.Generic;
@@ -15,7 +16,8 @@ public class RequestContext
1516
public String Scope { get; set; }
1617
public String SqlId { get; set; }
1718
public String FullSqlId => $"{Scope}.{SqlId}";
18-
internal DynamicParameters RequestParameters { get; set; }
19+
internal SmartSqlMap SmartSqlMap { get; set; }
20+
public DynamicParameters RequestParameters { get; set; }
1921
private object requestObj;
2022
public Object Request
2123
{

SmartSql/SmartSql.csproj

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@
1010
<PackageProjectUrl>https://github.com/Ahoo-Wang/SmartSql</PackageProjectUrl>
1111
<RepositoryUrl>https://github.com/Ahoo-Wang/SmartSql</RepositoryUrl>
1212
<PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
13-
<Version>2.1.0.0-preview2</Version>
14-
<AssemblyVersion>2.1.0.0</AssemblyVersion>
15-
<FileVersion>2.1.0.0</FileVersion>
13+
<Version>2.2.0.0-preview</Version>
14+
<AssemblyVersion>2.2.0.0</AssemblyVersion>
15+
<FileVersion>2.2.0.0</FileVersion>
1616
<PackageTags>orm dapper sql read-write-separation cache redis dotnet-core cross-platform high-performance distributed-computing zookeeper</PackageTags>
17-
<PackageReleaseNotes>1. New support for [For Tag]</PackageReleaseNotes>
17+
<PackageReleaseNotes>0. add [For Tag] to support iterate.
18+
1. add support global parameter prefix (defalut=$).
19+
2. add [Env Tag] to support different DBProvider.
20+
3. update Schemas to support above features.</PackageReleaseNotes>
1821
</PropertyGroup>
1922
<ItemGroup Condition=" '$(TargetFramework)' == 'net46' ">
2023
<PackageReference Include="Dapper" Version="1.50.2" />

SmartSql/SqlMap/SmartSqlMapConfig.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ public class Settings
7878
{
7979
[XmlAttribute]
8080
public bool IsWatchConfigFile { get; set; }
81+
[XmlAttribute]
82+
public string ParameterPrefix { get; set; } = "$";
8183
}
8284

8385
public class Database

SmartSql/SqlMap/Statement.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,17 @@ public static ITag LoadTag(XmlNode xmlNode, IList<Include> includes)
307307
};
308308
break;
309309
}
310+
case "Env":
311+
{
312+
var dbProvider = xmlNode.Attributes?["DbProvider"]?.Value.Trim();
313+
tag = new Env
314+
{
315+
Prepend = prepend,
316+
DbProvider = dbProvider,
317+
ChildTags = new List<ITag>()
318+
};
319+
break;
320+
}
310321
case "#comment": { break; }
311322
default:
312323
{
@@ -360,13 +371,15 @@ public ICacheProvider CacheProvider
360371
}
361372
public String BuildSql(RequestContext context)
362373
{
363-
String prefix = SmartSqlMap.SmartSqlMapConfig.Database.DbProvider.ParameterPrefix;
374+
context.SmartSqlMap = SmartSqlMap;
375+
string smartPrefix = SmartSqlMap.SmartSqlMapConfig.Settings.ParameterPrefix;
376+
String dbPrefix = SmartSqlMap.SmartSqlMapConfig.Database.DbProvider.ParameterPrefix;
364377
StringBuilder sqlStrBuilder = new StringBuilder();
365378
foreach (ITag tag in SqlTags)
366379
{
367-
sqlStrBuilder.Append(tag.BuildSql(context, prefix));
380+
sqlStrBuilder.Append(tag.BuildSql(context));
368381
}
369-
return sqlStrBuilder.ToString();
382+
return sqlStrBuilder.Replace(smartPrefix, dbPrefix).ToString();
370383
}
371384
}
372385
}

SmartSql/SqlMap/Tags/Dynamic.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,26 @@ namespace SmartSql.SqlMap.Tags
77
{
88
public class Dynamic : Tag
99
{
10-
public override TagType Type => throw new NotImplementedException();
10+
public override TagType Type => TagType.Dynamic;
1111

12-
public override bool IsCondition(object paramObj)
12+
public override bool IsCondition(RequestContext context)
1313
{
1414
return true;
1515
}
16-
public override string BuildSql(RequestContext context, string parameterPrefix)
16+
public override string BuildSql(RequestContext context)
1717
{
18-
return BuildChildSql(context, parameterPrefix).ToString();
18+
return BuildChildSql(context).ToString();
1919
}
2020

21-
public override StringBuilder BuildChildSql(RequestContext context, string parameterPrefix)
21+
public override StringBuilder BuildChildSql(RequestContext context)
2222
{
2323
StringBuilder strBuilder = new StringBuilder();
2424
if (ChildTags != null && ChildTags.Count > 0)
2525
{
2626
bool isFirstChild = true;
2727
foreach (var childTag in ChildTags)
2828
{
29-
string strSql = childTag.BuildSql(context, parameterPrefix);
29+
string strSql = childTag.BuildSql(context);
3030
if (String.IsNullOrWhiteSpace(strSql))
3131
{
3232
continue;

SmartSql/SqlMap/Tags/Env.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using SmartSql.Abstractions;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Text;
5+
6+
namespace SmartSql.SqlMap.Tags
7+
{
8+
public class Env : Tag
9+
{
10+
public override TagType Type => TagType.Env;
11+
public string DbProvider { get; set; }
12+
public override bool IsCondition(RequestContext context)
13+
{
14+
var dataBase = context.SmartSqlMap.SmartSqlMapConfig.Database;
15+
if (dataBase.DbProvider.Name == DbProvider)
16+
{
17+
return true;
18+
}
19+
return false;
20+
}
21+
}
22+
}

SmartSql/SqlMap/Tags/For.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,35 +18,35 @@ public class For : Tag
1818
public string Close { get; set; }
1919
public string Key { get; set; }
2020

21-
public override bool IsCondition(object paramObj)
21+
public override bool IsCondition(RequestContext context)
2222
{
23-
var reqVal = paramObj.GetValue(Property);
23+
var reqVal = GetValue(context);
2424
if (reqVal == null) { return false; }
2525
if (reqVal is IEnumerable) { return true; }
2626
return false;
2727
}
2828

29-
public override string BuildSql(RequestContext context, string parameterPrefix)
29+
public override string BuildSql(RequestContext context)
3030
{
31-
if (IsCondition(context.RequestParameters))
31+
if (IsCondition(context))
3232
{
33-
return BuildChildSql(context, parameterPrefix).ToString();
33+
return BuildChildSql(context).ToString();
3434
}
3535
return String.Empty;
3636
}
37-
public override StringBuilder BuildChildSql(RequestContext context, string parameterPrefix)
37+
public override StringBuilder BuildChildSql(RequestContext context)
3838
{
3939
StringBuilder strBuilder = new StringBuilder();
4040
strBuilder.AppendFormat(" {0}", Prepend);
4141
strBuilder.Append(Open);
4242
int item_index = 0;
43-
43+
string dbPrefix = GetDbProviderPrefix(context);
4444
var reqVal = context.RequestParameters.Get<IEnumerable>(Property);
4545
//** 目前仅支持子标签为SqlText **
4646
var bodyText = (ChildTags[0] as SqlText).BodyText;
4747
foreach (var itemVal in reqVal)
4848
{
49-
string key_name = $"{parameterPrefix}{Key}{FOR_KEY_SUFFIX}{item_index}";
49+
string key_name = $"{dbPrefix}{Key}{FOR_KEY_SUFFIX}{item_index}";
5050
context.RequestParameters.Add(key_name, itemVal);
5151
if (item_index > 0)
5252
{

0 commit comments

Comments
 (0)