/// <summary>
        /// Executa uma procedure no sistema.
        /// </summary>
        /// <param name="queryInfo">Informações da procedure.</param>
        /// <returns>Resultado da consulta.</returns>
        protected override IQueryResult ExecuteStoredProcedure(QueryInfo queryInfo)
        {
            var        group   = new QueryExecutionGroup(ProviderLocator.GetProviderName(queryInfo), queryInfo.IsolationLevel);
            GDASession session = CreateSession(group);

            try
            {
                if (!queryInfo.IgnoreRegisterUserInfo)
                {
                    RegisterUserInfo(new GDAStoredProcedureTransaction(session, group.ProviderName));
                }
                RegisterSession(session);
                var result = ExecuteStoredProcedure(session, queryInfo);
                if (result != null)
                {
                    EventHandler methodHandler = null;
                    methodHandler = new EventHandler((sender, e) => {
                        result.Disposed -= methodHandler;
                        if (session is GDATransaction)
                        {
                            ((GDATransaction)session).Commit();
                        }
                        session.Dispose();
                    });
                    result.Disposed += methodHandler;
                    return(result);
                }
            }
            catch
            {
                if (session is GDATransaction)
                {
                    ((GDATransaction)session).Rollback();
                }
                session.Dispose();
                throw;
            }
            if (session is GDATransaction)
            {
                ((GDATransaction)session).Commit();
            }
            session.Dispose();
            return(null);
        }
Esempio n. 2
0
        /// <summary>
        /// Cria uma sessão de persistencia para o grupo de execução.
        /// </summary>
        /// <param name="group"></param>
        /// <returns></returns>
        protected override GDA.GDASession CreateSession(QueryExecutionGroup group)
        {
            var providerConfiguration = GDA.GDASettings.GetProviderConfiguration(group.ProviderName);
            var session        = new GDA.GDASession(providerConfiguration);
            var isolationLevel = group.IsolationLevel;

            if (isolationLevel == System.Transactions.IsolationLevel.Unspecified)
            {
                isolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
            }
            string command = null;

            switch (isolationLevel)
            {
            case System.Transactions.IsolationLevel.ReadUncommitted:
                command = "READ UNCOMMITTED";
                break;

            case System.Transactions.IsolationLevel.ReadCommitted:
                command = "READ COMMITTED";
                break;

            case System.Transactions.IsolationLevel.RepeatableRead:
                command = "REPEATABLE READ";
                break;

            case System.Transactions.IsolationLevel.Serializable:
                command = "SERIALIZABLE";
                break;

            case System.Transactions.IsolationLevel.Snapshot:
                command = "SNAPSHOT";
                break;
            }
            if (!string.IsNullOrEmpty(command))
            {
                command = "SET TRANSACTION ISOLATION LEVEL " + command;
                new GDA.DataAccess().ExecuteCommand(session, System.Data.CommandType.Text, 30, command);
            }
            return(session);
        }
        /// <summary>
        /// Cria a sessão de conexão com base no dados do grupo de execução.
        /// </summary>
        /// <param name="group"></param>
        /// <returns></returns>
        protected virtual GDASession CreateSession(QueryExecutionGroup group)
        {
            IProviderConfiguration providerConfiguration = null;

            if (string.IsNullOrEmpty(group.ProviderName))
            {
                providerConfiguration = GDASettings.DefaultProviderConfiguration;
            }
            else
            {
                providerConfiguration = GDASettings.GetProviderConfiguration(group.ProviderName);
            }
            if (group.IsolationLevel == System.Transactions.IsolationLevel.Unspecified)
            {
                return(new GDASession(providerConfiguration));
            }
            else
            {
                var transaction = new GDATransaction(providerConfiguration, Convert(group.IsolationLevel));
                transaction.BeginTransaction();
                return(transaction);
            }
        }
        /// <summary>
        /// Executa as várias consultas.
        /// </summary>
        /// <param name="queries"></param>
        /// <returns></returns>
        public override IEnumerable <IQueryResult> Execute(QueryInfo[] queries)
        {
            queries.Require("queries").NotNull();
            var result = new IQueryResult[queries.Length];
            Dictionary <QueryExecutionGroup, IList <int> > providerDictionary = new Dictionary <QueryExecutionGroup, IList <int> >(QueryExecutionGroup.Comparer);

            for (int i = 0; i < queries.Length; i++)
            {
                string      providerName = ProviderLocator.GetProviderName(queries[i]);
                var         group        = new QueryExecutionGroup(providerName, queries[i].IsolationLevel);
                IList <int> indexes;
                if (providerDictionary.TryGetValue(group, out indexes))
                {
                    indexes.Add(i);
                }
                else
                {
                    indexes = new List <int>();
                    indexes.Add(i);
                    providerDictionary.Add(group, indexes);
                }
            }
            IStoredProcedureTransaction storedProcedureTransaction = null;

            foreach (var provider in providerDictionary)
            {
                using (var session = CreateSession(provider.Key))
                {
                    RegisterSession(session);
                    foreach (var index in provider.Value)
                    {
                        IQueryResult queryResult = null;
                        try
                        {
                            if (queries[index].StoredProcedureName == null)
                            {
                                SqlQueryParser parser      = CreateParser(queries[index]);
                                string         queryString = parser.GetText();
                                try
                                {
                                    queryResult = ExecuteQuery(session, queryString, queries[index]);
                                }
                                catch (GDAException ex)
                                {
                                    throw new GDAException(string.Format("{0}. Query: {1}", ex.Message, queries[index].ToString()), ex.InnerException);
                                }
                            }
                            else
                            {
                                if (storedProcedureTransaction == null)
                                {
                                    storedProcedureTransaction = new GDAStoredProcedureTransaction(session, provider.Key.ProviderName);
                                    if (!queries[index].IgnoreRegisterUserInfo)
                                    {
                                        RegisterUserInfo(storedProcedureTransaction);
                                    }
                                }
                                queryResult = ExecuteStoredProcedure(session, queries[index]);
                            }
                        }
                        catch
                        {
                            if (session is GDATransaction)
                            {
                                ((GDATransaction)session).Rollback();
                            }
                            throw;
                        }
                        yield return(queryResult);
                    }
                    if (session is GDATransaction)
                    {
                        ((GDATransaction)session).Commit();
                    }
                }
            }
        }