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); }
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); }
//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)); }