Skip to content

Commit 98c12ee

Browse files
authored
Merge pull request #527 from oskarb/NH3920-SqlStatementLogger
Improve logging of SQL parameter types and values NH-3920
2 parents 3c81758 + 625ccba commit 98c12ee

File tree

4 files changed

+68
-42
lines changed

4 files changed

+68
-42
lines changed

src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,9 @@ public void CanExecuteMultipleQueryWithSameParameterName()
138138
Assert.AreEqual(1, events.Length);
139139
var wholeLog = logSpy.GetWholeLog();
140140
string paramPrefix = ((DriverBase) Sfi.ConnectionProvider.Driver).NamedPrefix;
141-
Assert.That(wholeLog.Contains(paramPrefix + "p0 = 1 [Type: Int32 (0)], " + paramPrefix + "p1 = 2 [Type: Int32 (0)]"), Is.True);
141+
Assert.That(
142+
wholeLog,
143+
Is.StringContaining(paramPrefix + "p0 = 1 [Type: Int32 (0:0:0)], " + paramPrefix + "p1 = 2 [Type: Int32 (0:0:0)]"));
142144
}
143145
}
144146
}

src/NHibernate.Test/NHSpecificTest/Futures/LinqFutureFixture.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,9 +353,11 @@ public void CanExecuteMultipleQueriesOnSameExpression()
353353
Assert.AreEqual(1, events.Length);
354354
var wholeLog = logSpy.GetWholeLog();
355355
string paramPrefix = ((DriverBase)Sfi.ConnectionProvider.Driver).NamedPrefix;
356-
Assert.That(wholeLog.Contains(paramPrefix + "p0 = 1 [Type: Int32 (0)], " + paramPrefix + "p1 = 2 [Type: Int32 (0)]"), Is.True);
356+
Assert.That(
357+
wholeLog,
358+
Is.StringContaining(paramPrefix + "p0 = 1 [Type: Int32 (0:0:0)], " + paramPrefix + "p1 = 2 [Type: Int32 (0:0:0)]"));
357359
}
358360
}
359361
}
360362
}
361-
}
363+
}

src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ protected override bool AppliesTo(Dialect.Dialect dialect)
1414

1515
protected override string GetExpectedInsertOrgLogStatement(string orgName)
1616
{
17-
return string.Format("exec nh_organization_native_id_insert @p0;@p0 = '{0}' [Type: String (4000)]", orgName);
17+
return string.Format("exec nh_organization_native_id_insert @p0;@p0 = '{0}' [Type: String (4000:0:0)]", orgName);
1818
}
1919

2020
protected override IList Mappings
2121
{
2222
get { return new[] { "SqlTest.Identity.MsSQL.MSSQLIdentityInsertWithStoredProcs.hbm.xml" }; }
2323
}
2424
}
25-
}
25+
}

src/NHibernate/AdoNet/Util/SqlStatementLogger.cs

Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ namespace NHibernate.AdoNet.Util
88
/// <summary> Centralize logging handling for SQL statements. </summary>
99
public class SqlStatementLogger
1010
{
11-
private static readonly IInternalLogger log = LoggerProvider.LoggerFor("NHibernate.SQL");
11+
private static readonly IInternalLogger Logger = LoggerProvider.LoggerFor("NHibernate.SQL");
1212

1313
/// <summary> Constructs a new SqlStatementLogger instance.</summary>
14-
public SqlStatementLogger() : this(false, false) { }
14+
public SqlStatementLogger() : this(false, false)
15+
{
16+
}
1517

1618
/// <summary> Constructs a new SqlStatementLogger instance. </summary>
1719
/// <param name="logToStdout">Should we log to STDOUT in addition to our internal logger. </param>
@@ -28,7 +30,7 @@ public SqlStatementLogger(bool logToStdout, bool formatSql)
2830

2931
public bool IsDebugEnabled
3032
{
31-
get { return log.IsDebugEnabled; }
33+
get { return Logger.IsDebugEnabled; }
3234
}
3335

3436
/// <summary> Log a IDbCommand. </summary>
@@ -37,7 +39,7 @@ public bool IsDebugEnabled
3739
/// <param name="style">The requested formatting style. </param>
3840
public virtual void LogCommand(string message, IDbCommand command, FormatStyle style)
3941
{
40-
if (!log.IsDebugEnabled && !LogToStdout || string.IsNullOrEmpty(command.CommandText))
42+
if (!Logger.IsDebugEnabled && !LogToStdout || string.IsNullOrEmpty(command.CommandText))
4143
{
4244
return;
4345
}
@@ -53,7 +55,7 @@ public virtual void LogCommand(string message, IDbCommand command, FormatStyle s
5355
{
5456
logMessage = message + statement;
5557
}
56-
log.Debug(logMessage);
58+
Logger.Debug(logMessage);
5759
if (LogToStdout)
5860
{
5961
Console.Out.WriteLine("NHibernate: " + statement);
@@ -78,7 +80,7 @@ public string GetCommandLineWithParameters(IDbCommand command)
7880
}
7981
else
8082
{
81-
var output = new StringBuilder(command.CommandText.Length + (command.Parameters.Count * 20));
83+
var output = new StringBuilder(command.CommandText.Length + (command.Parameters.Count*20));
8284
output.Append(command.CommandText.TrimEnd(' ', ';', '\n'));
8385
output.Append(";");
8486

@@ -92,54 +94,74 @@ public string GetCommandLineWithParameters(IDbCommand command)
9294
output.Append(", ");
9395
}
9496
appendComma = true;
95-
p = (IDataParameter)command.Parameters[i];
96-
output.Append(string.Format("{0} = {1} [Type: {2}]", p.ParameterName, GetParameterLogableValue(p), GetParameterLogableType(p)));
97+
p = (IDataParameter) command.Parameters[i];
98+
output.Append(
99+
string.Format("{0} = {1} [Type: {2}]", p.ParameterName, GetParameterLoggableValue(p), GetParameterLoggableType(p)));
97100
}
98101
outputText = output.ToString();
99102
}
100103
return outputText;
101104
}
102105

103-
private static string GetParameterLogableType(IDataParameter dataParameter)
104-
{
105-
var p = dataParameter as IDbDataParameter;
106-
if (p != null)
107-
return p.DbType + " (" + p.Size + ")";
108-
return p.DbType.ToString();
106+
private static string GetParameterLoggableType(IDataParameter dataParameter)
107+
{
108+
var p = dataParameter as IDbDataParameter;
109+
if (p != null)
110+
return p.DbType + " (" + p.Size + ":" + p.Scale + ":" + p.Precision + ")";
111+
return dataParameter.DbType.ToString();
112+
}
113+
109114

110-
}
115+
public string GetParameterLoggableValue(IDataParameter parameter)
116+
{
117+
const int maxLoggableStringLength = 1000;
111118

112-
public string GetParameterLogableValue(IDataParameter parameter)
119+
if (parameter.Value == null || DBNull.Value.Equals(parameter.Value))
113120
{
114-
const int maxLogableStringLength = 1000;
115-
if (parameter.Value == null || DBNull.Value.Equals(parameter.Value))
116-
{
117-
return "NULL";
118-
}
119-
if (IsStringType(parameter.DbType))
120-
{
121-
return string.Concat("'", TruncateWithEllipsis(parameter.Value.ToString(), maxLogableStringLength), "'");
122-
}
123-
var buffer = parameter.Value as byte[];
124-
if (buffer != null)
125-
{
126-
return GetBufferAsHexString(buffer);
127-
}
128-
return parameter.Value.ToString();
121+
return "NULL";
122+
}
123+
124+
if (IsStringType(parameter.DbType))
125+
{
126+
return string.Concat("'", TruncateWithEllipsis(parameter.Value.ToString(), maxLoggableStringLength), "'");
129127
}
130128

129+
if (parameter.Value is DateTime)
130+
return ((DateTime) parameter.Value).ToString("O");
131+
132+
if (parameter.Value is DateTimeOffset)
133+
return ((DateTimeOffset) parameter.Value).ToString("O");
134+
135+
var buffer = parameter.Value as byte[];
136+
if (buffer != null)
137+
{
138+
return GetBufferAsHexString(buffer);
139+
}
140+
141+
return parameter.Value.ToString();
142+
143+
}
144+
145+
146+
[Obsolete("Use GetParameterLoggableValue(parameter) instead.")]
147+
public string GetParameterLogableValue(IDataParameter parameter)
148+
{
149+
return GetParameterLoggableValue(parameter);
150+
}
151+
152+
131153
private static string GetBufferAsHexString(byte[] buffer)
132154
{
133155
const int maxBytes = 128;
134156
int bufferLength = buffer.Length;
135157

136-
var sb = new StringBuilder(maxBytes * 2 + 8);
158+
var sb = new StringBuilder(maxBytes*2 + 8);
137159
sb.Append("0x");
138160
for (int i = 0; i < bufferLength && i < maxBytes; i++)
139161
{
140162
sb.Append(buffer[i].ToString("X2"));
141163
}
142-
if(bufferLength > maxBytes)
164+
if (bufferLength > maxBytes)
143165
{
144166
sb.Append("...");
145167
}
@@ -149,7 +171,7 @@ private static string GetBufferAsHexString(byte[] buffer)
149171
private static bool IsStringType(DbType dbType)
150172
{
151173
return DbType.String.Equals(dbType) || DbType.AnsiString.Equals(dbType)
152-
|| DbType.AnsiStringFixedLength.Equals(dbType) || DbType.StringFixedLength.Equals(dbType);
174+
|| DbType.AnsiStringFixedLength.Equals(dbType) || DbType.StringFixedLength.Equals(dbType);
153175
}
154176

155177
public FormatStyle DetermineActualStyle(FormatStyle style)
@@ -159,8 +181,8 @@ public FormatStyle DetermineActualStyle(FormatStyle style)
159181

160182
public void LogBatchCommand(string batchCommand)
161183
{
162-
log.Debug(batchCommand);
163-
if(LogToStdout)
184+
Logger.Debug(batchCommand);
185+
if (LogToStdout)
164186
{
165187
Console.Out.WriteLine("NHibernate: " + batchCommand);
166188
}
@@ -176,4 +198,4 @@ private string TruncateWithEllipsis(string source, int length)
176198
return source;
177199
}
178200
}
179-
}
201+
}

0 commit comments

Comments
 (0)