Пример #1
0
        public static object UseSqlAsFuncsFrom(CallExpr ce, Generator.Ctx ctx)
        {
            var arg0 = Generator.Generate(ce.args[0], ctx);

            if (OPs.KindOf(arg0) != ValueKind.Const)
            {
                ctx.Error("Constant value expected");
            }

            var arg1 = (ce.args.Count < 2) ? null : Generator.Generate(ce.args[1], ctx);

            var        sqlFileName = Convert.ToString(arg0);
            DbFuncType forKinds;

            if (arg1 == null)
            {
                forKinds = DbFuncType.TimeSlice | DbFuncType.TimeInterval;
            }
            else
            {
                var lst = arg1 as IList ?? new object[] { arg1 };
                forKinds = DbFuncType.None;
                foreach (var v in lst)
                {
                    forKinds |= (DbFuncType)Enum.Parse(typeof(DbFuncType), Convert.ToString(v));
                }
            }

            var dbConnName = (ce.args.Count < 3) ? DefaultDbConnName : OPs.TryAsName(ce.args[2], ctx);

            if (string.IsNullOrEmpty(dbConnName))
            {
                ctx.Error($"Connection name must be nonempty: {ce.args[2]}");
            }

            var fullFileName = Path.IsPathRooted(sqlFileName)
                ? sqlFileName
                : Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Convert.ToString(sqlFileName));

            var           cacheKey = $"FuncDefs:{fullFileName}:{forKinds.ToString()}";
            Func <object> ldfsFunc = () =>
            {
                var sqlCtx = new W.Expressions.Sql.Preprocessing.PreprocessingContext()
                {
                    sqlFileName                 = fullFileName,
                    cacheSubdomain              = "DB",
                    dbConnValueName             = dbConnName,
                    forKinds                    = forKinds,
                    ctx                         = ctx,
                    cachingExpiration           = TimeSpan.FromMinutes(5),
                    defaultLocationForValueInfo = (ce.args.Count < 4) ? null : OPs.TryAsString(ce.args[3], ctx)
                };
                return(sqlCtx.LoadingFuncs());
            };
            var lfds = (IEnumerable <FuncDef>)FuncDefs_Core._Cached(cacheKey, ldfsFunc, DateTimeOffset.MaxValue, TimeSpan.FromMinutes(5));

            return(lfds);
        }
Пример #2
0
        static Contexts GetCtxForCode(Contexts parent, string codeText)
        {
            var obj = FuncDefs_Core._Cached($"$Contexts_{codeText.GetHashCode()}", (Func <object>)(() =>
            {
                var res = new Contexts();

                //***** формируем по тексту синтаксическое дерево
                var e = Parser.ParseToExpr(codeText);

                if (parent == null)
                {
                    var funcDefs = new W.Expressions.FuncDefs()
                                   .AddFrom(typeof(W.Expressions.FuncDefs_Core))
                                   .AddFrom(typeof(W.Expressions.FuncDefs_Excel))
                                   .AddFrom(typeof(W.Expressions.FuncDefs_Report))
                    ;
                    var valsDefs = new Dictionary <string, object>();
                    //***** создаём контекст кодогенератора, содержащий предопределённые значения и перечень функций
                    res.gCtx = new Generator.Ctx(valsDefs, funcDefs.GetFuncs);
                    //***** формируем код
                    var g = Generator.Generate(e, res.gCtx);
                    //***** проверяем, заданы ли выражения для всех именованных значений
                    try { res.gCtx.CheckUndefinedValues(); }
                    catch (W.Expressions.Generator.Exception ex) { throw new UndefinedValuesException(ex.Message); }
                    res.eCtx = new AsyncExprRootCtx(res.gCtx.name2ndx, res.gCtx.values, OPs.GlobalMaxParallelismSemaphore);
                }
                else
                {
                    //***** создаём контекст кодогенератора, содержащий предопределённые значения и перечень функций
                    res.gCtx = new Generator.Ctx(parent.gCtx);
                    //***** формируем код
                    var g = Generator.Generate(e, res.gCtx);
                    //***** проверяем, заданы ли выражения для всех именованных значений
                    try { res.gCtx.CheckUndefinedValues(); }
                    catch (W.Expressions.Generator.Exception ex) { throw new UndefinedValuesException(ex.Message); }
                    res.eCtx = new AsyncExprCtx(res.gCtx, res.gCtx.values, parent.eCtx);
                }
                return(res);
            }), DateTime.UtcNow.AddMinutes(5), ObjectCache.NoSlidingExpiration);

            return((Contexts)obj);
        }
Пример #3
0
        //public static async Task CommitPreferredConn(AsyncExprCtx ctx)
        //{
        //    var conn = (IDbConn)await ctx.GetValue(DefaultDbConnName);
        //    await conn.Commit(ctx.Cancellation);
        //}

        //public static async Task<object> ExecNonQuery(AsyncExprCtx ctx, string cmdText, string oraConnName)
        //{
        //	var conn = (IOraConn)await ctx.GetValue(ctx, oraConnName);
        //	return await conn.ExecCmd(new OracleCommandData() { Kind = CommandKind.NonQuery, SqlText = cmdText }, ctx.Cancellation);
        //}

        public static async Task <object> CachedExecQuery(AsyncExprCtx ctx, string query, string oraConnName, bool arrayResults)
        {
            return(await FuncDefs_Core._Cached(ctx, query, (LazyAsync)(aec =>
                                                                       ExecQuery(aec, query, oraConnName, arrayResults)),
                                               DateTime.Now + TimeSpan.FromMinutes(5), TimeSpan.Zero));
        }