public override IMessage Invoke(IMessage msg) { IMethodCallMessage methodMessage = new MethodCallMessageWrapper((IMethodCallMessage)msg); ExecuteType executeType = GetExecuteType(methodMessage); if (executeType != ExecuteType.None) { profiler.ExecuteStart(instance, executeType); } object returnValue = methodMessage.MethodBase.Invoke(instance, methodMessage.Args); if (executeType == ExecuteType.Reader) { returnValue = new ProfiledDbDataReader((DbDataReader)returnValue, instance.Connection, profiler); } IMessage returnMessage = new ReturnMessage(returnValue, methodMessage.Args, methodMessage.ArgCount, methodMessage.LogicalCallContext, methodMessage); if (executeType == ExecuteType.Reader) { profiler.ExecuteFinish(instance, executeType, (DbDataReader)returnValue); } else if (executeType != ExecuteType.None) { profiler.ExecuteFinish(instance, executeType, null); } return(returnMessage); }
/// <summary> /// Called when database reader is closed, ending profiling for /// <see cref="SqlExecuteType.Reader"/> <c>SqlTimings</c>. /// </summary> public void ReaderFetchComplete(IDataReader reader) { _customTiming.Stop(); if (reader != null) { ProfiledDbDataReader profiledDbDataAdapter = (ProfiledDbDataReader)reader; decimal durationMilliseconds = 0; if (_customTiming.DurationMilliseconds != null) { durationMilliseconds = _customTiming.DurationMilliseconds.Value; } Logger.Log(_customTiming.CommandString, (long)durationMilliseconds, _customTiming.StackTraceStackFrame, profiledDbDataAdapter.RecordReturned, _customTiming.StackTraceSnippet); } else { //_customTiming.C Trace.WriteLine(string.Format("{0} {1}, {2}", _customTiming.CommandString, _customTiming.DurationMilliseconds, _customTiming.StackTraceSnippet)); decimal durationMilliseconds = 0; if (_customTiming.DurationMilliseconds != null) { durationMilliseconds = _customTiming.DurationMilliseconds.Value; } Logger.Log(_customTiming.CommandString, (long)durationMilliseconds, _customTiming.StackTraceStackFrame, 0, _customTiming.StackTraceSnippet); } }
public void TestProfiledDbCommandWithProfiledDbCommand() { var mockCommand = new Mock <DbCommand>(); var mockDbProfiler = new Mock <IDbProfiler>(); var target = new ProfiledDbCommand(mockCommand.Object, mockDbProfiler.Object); // test CreateDbParameter() var mockParameter = new Mock <DbParameter>(); mockCommand.Protected().Setup <DbParameter>("CreateDbParameter").Returns(mockParameter.Object); Assert.AreEqual(mockParameter.Object, target.CreateParameter()); // test DbConnection var mockConnection = new Mock <DbConnection>(); var profiledConnection = new ProfiledDbConnection(mockConnection.Object, mockDbProfiler.Object); mockCommand.Protected().Setup <DbConnection>("DbConnection").Returns(profiledConnection); var connection = target.Connection; Assert.AreEqual(profiledConnection, connection); // test DbParameterCollection var mockParameterCollection = new Mock <DbParameterCollection>(); mockCommand.Protected().Setup <DbParameterCollection>("DbParameterCollection").Returns(mockParameterCollection.Object); var parameterCollection = target.Parameters; Assert.AreEqual(mockParameterCollection.Object, parameterCollection); // test DbTransaction var mockTransaction = new Mock <DbTransaction>(); var profiledTransaction = new ProfiledDbTransaction(mockTransaction.Object, profiledConnection); mockCommand.Protected().Setup <DbTransaction>("DbTransaction").Returns(profiledTransaction); var transaction = target.Transaction; Assert.AreEqual(profiledTransaction, transaction); // test DesignTimeVisible var designTimeVisible1 = true; var designTimeVisible2 = false; var designTimeVisibleSet = false; mockCommand.Setup(cmd => cmd.DesignTimeVisible).Returns(designTimeVisible1); mockCommand.SetupSet(cmd => cmd.DesignTimeVisible = It.IsAny <bool>()).Callback <bool>(a => { Assert.AreEqual(designTimeVisible2, a); designTimeVisibleSet = true; }); Assert.AreEqual(designTimeVisible1, target.DesignTimeVisible); target.DesignTimeVisible = designTimeVisible2; Assert.IsTrue(designTimeVisibleSet); // test ExecuteDbDataReader() var mockReader = new Mock <DbDataReader>(); var profiledReader = new ProfiledDbDataReader(mockReader.Object, mockDbProfiler.Object); var cmdBehavior = CommandBehavior.CloseConnection; mockCommand.Protected().Setup <DbDataReader>("ExecuteDbDataReader", cmdBehavior).Returns(profiledReader); var executeDbCommandCalled = false; mockDbProfiler.Setup(p => p.ExecuteDbCommand(It.IsAny <DbExecuteType>(), It.IsAny <IDbCommand>(), It.IsAny <Func <IDataReader> >(), It.IsAny <TagCollection>())) .Callback <DbExecuteType, IDbCommand, Func <IDataReader>, IEnumerable <string> >((a, b, c, d) => { Assert.AreEqual(mockCommand.Object, b); c(); executeDbCommandCalled = true; }); var reader = target.ExecuteReader(cmdBehavior); Assert.IsTrue(executeDbCommandCalled); Assert.AreEqual(profiledReader, reader); // test Dispose() var disposeCalled = false; mockCommand.Protected().Setup("Dispose", true).Callback <bool>(a => disposeCalled = true); target.Dispose(); Assert.IsTrue(disposeCalled); }