예제 #1
0
        public static ITable[] Execute(this IRequest request, SqlQuery query)
        {
            if (query == null)
                throw new ArgumentNullException("query");

            var sqlSouce = query.Text;

            // TODO: find it from the cache...

            var statements = SqlStatement.Parse(sqlSouce);

            // TODO: set it in cache ...

            var preparer = new QueryPreparer(query);

            bool statementSeen = false;

            var results = new List<ITable>();
            foreach (var statement in statements) {

                // TODO: query.RegisterQuery(statement);

                // TODO: Invoke diagnostics for the preparation...

                var prepared = statement.Prepare(preparer, request);

                ITable result;

                try {
                    var exeContext = new ExecutionContext(request);
                    prepared.Execute(exeContext);
                    if (exeContext.HasResult) {
                        result = exeContext.Result;
                    } else {
                        result = FunctionTable.ResultTable(request, 0);
                    }
                } catch (StatementException ex) {
                    request.OnError(ex);
                    throw;
                } catch (Exception ex) {
                    var sex = new StatementException("An unhanded error occurred while executing the statement.", ex);
                    request.OnError(sex);
                    throw sex;
                } finally {
                    statementSeen = true;
                }

                results.Add(result);
            }

            if (!statementSeen)
                throw new SqlParseException("The input query was not parsed in any statements that could be executed.");

            return results.ToArray();
        }
예제 #2
0
        public static ITable[] Execute(this IRequest request, SqlQuery query)
        {
            if (query == null)
            {
                throw new ArgumentNullException("query");
            }

            var sqlSouce = query.Text;

            // TODO: find it from the cache...

            var statements = SqlStatement.Parse(sqlSouce);

            // TODO: set it in cache ...

            var preparer = new QueryPreparer(query);

            bool statementSeen = false;

            var results = new List <ITable>();

            foreach (var statement in statements)
            {
                // TODO: query.RegisterQuery(statement);

                // TODO: Invoke diagnostics for the preparation...

                var prepared = statement.Prepare(preparer, request);

                ITable result;

                try {
                    var exeContext = new ExecutionContext(request);
                    prepared.Execute(exeContext);
                    if (exeContext.HasResult)
                    {
                        result = exeContext.Result;
                    }
                    else
                    {
                        result = FunctionTable.ResultTable(request, 0);
                    }
                } catch (StatementException ex) {
                    request.OnError(ex);
                    throw;
                } catch (Exception ex) {
                    var sex = new StatementException("An unhanded error occurred while executing the statement.", ex);
                    request.OnError(sex);
                    throw sex;
                } finally {
                    statementSeen = true;
                }

                results.Add(result);
            }

            if (!statementSeen)
            {
                throw new SqlParseException("The input query was not parsed in any statements that could be executed.");
            }

            return(results.ToArray());
        }
예제 #3
0
        public static StatementResult[] ExecuteQuery(this IQuery query, SqlQuery sqlQuery)
        {
            if (sqlQuery == null)
            {
                throw new ArgumentNullException("sqlQuery");
            }

            SqlStatement[] statements = null;
            bool           cacheGet   = false;

            var cache = query.Context.ResolveService <IStatementCache>();

            if (cache != null)
            {
                if (cache.TryGet(sqlQuery.Text, out statements))
                {
                    cacheGet = true;
                }
            }

            if (statements == null)
            {
                var sqlSouce = sqlQuery.Text;
                var compiler = query.Context.SqlCompiler();

                if (compiler == null)
                {
                    compiler = new PlSqlCompiler();
                }

                var compileResult = compiler.Compile(new SqlCompileContext(query.Context, sqlSouce));

                if (compileResult.HasErrors)
                {
                    // TODO: throw a specialized exception...
                    throw new InvalidOperationException("The compilation of the query thrown errors.");
                }

                statements = compileResult.Statements.ToArray();
            }

            if (statements.Length == 0)
            {
                return(new StatementResult[0]);
            }

            if (cache != null && !cacheGet)
            {
                cache.Set(sqlQuery.Text, statements);
            }

            query.Context.RegisterEvent(new QueryEvent(sqlQuery, QueryEventType.BeforeExecute, null));

            var paramStyle = sqlQuery.ParameterStyle;

            if (paramStyle == QueryParameterStyle.Default)
            {
                paramStyle = query.ParameterStyle();
            }

            var preparer = new QueryPreparer(sqlQuery, paramStyle);

            var result = query.ExecuteStatements(preparer, statements);

            query.Context.RegisterEvent(new QueryEvent(sqlQuery, QueryEventType.AfterExecute, result));

            return(result);
        }