Skip to content

Commit 5172f9b

Browse files
committed
add support IPrepareStatementFilter
2 parents 66a7dc3 + 6b3b963 commit 5172f9b

File tree

5 files changed

+135
-49
lines changed

5 files changed

+135
-49
lines changed

build/version.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<VersionMajor>4</VersionMajor>
44
<VersionMinor>0</VersionMinor>
5-
<VersionPatch>75</VersionPatch>
5+
<VersionPatch>76</VersionPatch>
66
<VersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)</VersionPrefix>
77
</PropertyGroup>
88
</Project>

src/SmartSql.Test.Unit/SmartSqlFixture.cs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using System;
22
using System.IO;
33
using System.Linq;
4+
using System.Threading.Tasks;
45
using Microsoft.Extensions.Logging;
56
using SmartSql.DbSession;
7+
using SmartSql.Middlewares.Filters;
68
using Xunit;
79

810
namespace SmartSql.Test.Unit
@@ -15,14 +17,15 @@ public class SmartSqlFixture : IDisposable
1517
public SmartSqlFixture()
1618
{
1719
LoggerFactory = new LoggerFactory(Enumerable.Empty<ILoggerProvider>(),
18-
new LoggerFilterOptions { MinLevel = LogLevel.Debug });
20+
new LoggerFilterOptions {MinLevel = LogLevel.Debug});
1921
var logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs", "SmartSql.log");
2022
LoggerFactory.AddFile(logPath, LogLevel.Trace);
2123

2224
SmartSqlBuilder = new SmartSqlBuilder()
2325
.UseXmlConfig()
2426
.UseLoggerFactory(LoggerFactory)
2527
.UseAlias(GLOBAL_SMART_SQL)
28+
.AddFilter<TestPrepareStatementFilter>()
2629
.Build();
2730
DbSessionFactory = SmartSqlBuilder.DbSessionFactory;
2831
SqlMapper = SmartSqlBuilder.SqlMapper;
@@ -43,4 +46,37 @@ public void Dispose()
4346
public class SmartSqlCollection : ICollectionFixture<SmartSqlFixture>
4447
{
4548
}
49+
50+
51+
public class TestPrepareStatementFilter : IPrepareStatementFilter, ISetupSmartSql
52+
{
53+
private ILogger<TestPrepareStatementFilter> _logger;
54+
55+
public void OnInvoking(ExecutionContext context)
56+
{
57+
_logger.LogDebug("TestPrepareStatementFilter.OnInvoking");
58+
}
59+
60+
public void OnInvoked(ExecutionContext context)
61+
{
62+
_logger.LogDebug("TestPrepareStatementFilter.OnInvoked");
63+
}
64+
65+
public Task OnInvokingAsync(ExecutionContext context)
66+
{
67+
_logger.LogDebug("TestPrepareStatementFilter.OnInvokingAsync");
68+
return Task.CompletedTask;
69+
}
70+
71+
public Task OnInvokedAsync(ExecutionContext context)
72+
{
73+
_logger.LogDebug("TestPrepareStatementFilter.OnInvokedAsync");
74+
return Task.CompletedTask;
75+
}
76+
77+
public void SetupSmartSql(SmartSqlBuilder smartSqlBuilder)
78+
{
79+
_logger = smartSqlBuilder.LoggerFactory.CreateLogger<TestPrepareStatementFilter>();
80+
}
81+
}
4682
}

src/SmartSql/Middlewares/PrepareStatementMiddleware.cs

Lines changed: 1 addition & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -34,54 +34,8 @@ private void InitParameters(ExecutionContext executionContext)
3434
BuildSql(executionContext.Request);
3535
BuildDbParameters(executionContext.Request);
3636
if (_logger.IsEnabled(LogLevel.Debug))
37-
3837
{
39-
var sourceParameters = executionContext.Request.Parameters.DbParameters.Values;
40-
var cmdText = executionContext.Request.RealSql;
41-
string dbParameterStr = string.Join(",", sourceParameters.Select(p => $"{p.ParameterName}={p.Value}"));
42-
string realSql = _sqlParamAnalyzer.Replace(cmdText, (paramName, nameWithPrefix) =>
43-
{
44-
var paramNameCompare = executionContext.SmartSqlConfig.Settings.IgnoreParameterCase
45-
? StringComparison.CurrentCultureIgnoreCase
46-
: StringComparison.CurrentCulture;
47-
var dbParam = sourceParameters.FirstOrDefault(m =>
48-
String.Equals(m.ParameterName, paramName, paramNameCompare));
49-
if (dbParam == null)
50-
{
51-
return nameWithPrefix;
52-
}
53-
54-
if (dbParam.Value == DBNull.Value)
55-
{
56-
return "NULL";
57-
}
58-
59-
switch (dbParam.DbType)
60-
{
61-
case DbType.AnsiString:
62-
case DbType.AnsiStringFixedLength:
63-
case DbType.DateTime:
64-
case DbType.DateTime2:
65-
case DbType.DateTimeOffset:
66-
case DbType.Guid:
67-
case DbType.String:
68-
case DbType.StringFixedLength:
69-
case DbType.Time:
70-
case DbType.Xml:
71-
{
72-
return $"'{dbParam.Value}'";
73-
}
74-
75-
case DbType.Boolean:
76-
{
77-
return ((bool) dbParam.Value) ? "1" : "0";
78-
}
79-
}
80-
81-
return dbParam.Value.ToString();
82-
});
83-
_logger.LogDebug(
84-
$"Statement.Id:[{executionContext.Request.FullSqlId}],Sql:{Environment.NewLine}{cmdText}{Environment.NewLine}Parameters:[{dbParameterStr}]{Environment.NewLine}Sql with parameter value: {Environment.NewLine}{realSql}");
38+
_logger.LogDebug(executionContext.FormatSql(true));
8539
}
8640
}
8741

src/SmartSql/SmartSqlBuilder.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,16 @@ private void SetupSmartSql()
8585

8686
#endregion
8787

88+
#region Filters
89+
90+
foreach (var filter in Filters)
91+
{
92+
var setupSmartSql = filter as ISetupSmartSql;
93+
setupSmartSql?.SetupSmartSql(this);
94+
}
95+
96+
#endregion
97+
8898
#region Pipeline
8999

90100
var currentMiddleware = SmartSqlConfig.Pipeline;
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Data;
4+
using System.Data.Common;
5+
using System.Linq;
6+
using System.Text;
7+
8+
namespace SmartSql.Utils
9+
{
10+
public static class ExecutionContextExtensions
11+
{
12+
public static string FormatSql(this ExecutionContext executionContext, bool withParameterValue)
13+
{
14+
StringBuilder stringBuilder = new StringBuilder();
15+
var sourceParameters = executionContext.Request.Parameters.DbParameters.Values;
16+
string dbParameterStr = string.Join(",", sourceParameters.Select(p => $"{p.ParameterName}={p.Value}"));
17+
stringBuilder.AppendFormat("Statement.Id:[{0}],", executionContext.Request.FullSqlId);
18+
stringBuilder.Append("Sql:");
19+
stringBuilder.AppendLine();
20+
stringBuilder.Append(executionContext.Request.RealSql);
21+
stringBuilder.AppendLine();
22+
stringBuilder.AppendFormat("Parameters:[{0}]", dbParameterStr);
23+
24+
if (!withParameterValue)
25+
{
26+
return stringBuilder.ToString();
27+
}
28+
29+
stringBuilder.AppendLine();
30+
stringBuilder.Append("Sql with parameter value: ");
31+
stringBuilder.AppendLine();
32+
string realSql = FormatSqlWithParameters(executionContext);
33+
stringBuilder.Append(realSql);
34+
35+
return stringBuilder.ToString();
36+
}
37+
38+
private static string FormatSqlWithParameters(this ExecutionContext executionContext)
39+
{
40+
var sourceParameters = executionContext.Request.Parameters.DbParameters.Values;
41+
return executionContext.SmartSqlConfig.SqlParamAnalyzer.Replace(executionContext.Request.RealSql,
42+
(paramName, nameWithPrefix) =>
43+
{
44+
var paramNameCompare = executionContext.SmartSqlConfig.Settings.IgnoreParameterCase
45+
? StringComparison.CurrentCultureIgnoreCase
46+
: StringComparison.CurrentCulture;
47+
var dbParam =
48+
sourceParameters.FirstOrDefault(
49+
m => String.Equals(m.ParameterName, paramName, paramNameCompare));
50+
if (dbParam == null)
51+
{
52+
return nameWithPrefix;
53+
}
54+
55+
if (dbParam.Value == DBNull.Value)
56+
{
57+
return "NULL";
58+
}
59+
60+
switch (dbParam.DbType)
61+
{
62+
case DbType.AnsiString:
63+
case DbType.AnsiStringFixedLength:
64+
case DbType.DateTime:
65+
case DbType.DateTime2:
66+
case DbType.DateTimeOffset:
67+
case DbType.Guid:
68+
case DbType.String:
69+
case DbType.StringFixedLength:
70+
case DbType.Time:
71+
case DbType.Xml:
72+
{
73+
return $"'{dbParam.Value}'";
74+
}
75+
76+
case DbType.Boolean:
77+
{
78+
return ((bool) dbParam.Value) ? "1" : "0";
79+
}
80+
}
81+
82+
return dbParam.Value.ToString();
83+
});
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)