Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Runtime.Remoting.Proxies;
- using System.Data.Common;
- using ServiceStack.MiniProfiler.Data;
- using ServiceStack.MiniProfiler;
- using System.Runtime.Remoting.Messaging;
- using System.Data;
- namespace SouthWind.Core.Profiling
- {
- public class ProfiledPostgresqlDriver : NHibernate.Driver.NpgsqlDriver
- {
- public override IDbCommand CreateCommand()
- {
- IDbCommand command = base.CreateCommand();
- if (Profiler.Current != null)
- {
- command = DbCommandProxy.CreateProxy(command);
- }
- return command;
- }
- }
- public class ProfiledMySQLDriver : NHibernate.Driver.MySqlDataDriver
- {
- public override IDbCommand CreateCommand()
- {
- IDbCommand command = base.CreateCommand();
- if (Profiler.Current != null)
- command = DbCommandProxy.CreateProxy(command);
- return command;
- }
- }
- public class DbCommandProxy : RealProxy
- {
- private DbCommand instance;
- private IDbProfiler profiler;
- private DbCommandProxy(DbCommand instance)
- : base(typeof(DbCommand))
- {
- this.instance = instance;
- this.profiler = Profiler.Current as IDbProfiler;
- }
- public override IMessage Invoke(IMessage msg)
- {
- IMethodCallMessage methodMessage = new MethodCallMessageWrapper((IMethodCallMessage)msg);
- var 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;
- }
- private static ExecuteType GetExecuteType(IMethodCallMessage message)
- {
- // for some reason, on Mono, the method name is System.Data.IDbCommand.ExecuteReader
- string msgName = message.MethodName;
- if (msgName.Contains('.'))
- msgName = msgName.Substring(msgName.LastIndexOf('.') + 1);
- switch (msgName)
- {
- case "ExecuteNonQuery":
- return ExecuteType.NonQuery;
- case "ExecuteReader":
- return ExecuteType.Reader;
- case "ExecuteScalar":
- return ExecuteType.Scalar;
- default:
- return ExecuteType.None;
- }
- }
- public static IDbCommand CreateProxy(IDbCommand instance)
- {
- var proxy = new DbCommandProxy(instance as DbCommand);
- return proxy.GetTransparentProxy() as IDbCommand;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement