/// <summary> /// 创建一个 <see cref="TransactionDbAccess"/> 的对象实例。 /// </summary> /// <param name="cmd">与事务关联的 DbCommand 对象。</param> /// <param name="owner">创建该事务的引擎对象实例。</param> internal TransactionDbAccess(IDbCommand cmd, DataEngine owner) { DbCommand = cmd; _Engine = owner; _parserAdapter = owner.CommandParserAdapter; _Errors = new List <DbError>(); }
public void Run(int hotelId) { using (var context = new RmsDbContext()) { HotelSettings hotel = context.HotelSettings.Find(hotelId); if (hotel == null || !hotel.IsRmsEnalbed) { RecurringJob.RemoveIfExists(GetJobName(hotelId)); return; } if (string.IsNullOrWhiteSpace(hotel.Settings)) { context.Logs.Add(new Log { LogType = LogType.Error, CreatedOn = DateTime.Now, Body = "Configuration not found.", HotelId = hotelId }); context.SaveChanges(); return; } var info = context.Parser_RoomInfos.Where(c => c.HotelId == hotelId).ToList(); if (!info.Any()) { context.Logs.Add(new Log { LogType = LogType.Error, CreatedOn = DateTime.Now, Body = "Parser hotel configuration not found.", HotelId = hotelId }); context.SaveChanges(); return; } try { IParserAdapter parserAdapter = new ParserAdapter(); var calculatedOn = DateTime.Now; double rating = 0.0; var result = parserAdapter.Run(calculatedOn, hotel.PlanningHorizon, info, hotel.Settings, hotel.BookingName, out rating).ToList(); if (result.Any()) { context.Parser_RoomDatas.AddRange(result); context.Logs.Add(new Log { LogType = LogType.Info, CreatedOn = DateTime.Now, Body = "New booking data have been successfully obtained.", HotelId = hotelId }); hotel.BookingRating = rating; context.Entry(hotel).State = System.Data.Entity.EntityState.Modified; context.SaveChanges(); } } catch (Exception ex) { context.Logs.Add(new Log { LogType = LogType.Error, CreatedOn = DateTime.Now, Body = ex.Message + Environment.NewLine + ex.InnerException?.Message, HotelId = hotelId }); context.SaveChanges(); throw; } } }
/// <summary> /// 创建一个 <see cref="Wunion.DataAdapter.Kernel.DataEngine"/> 的对象实例。 /// </summary> /// <param name="dba">该引擎使用的数据访问器。</param> /// <param name="parserAdapter">解释命令时使用的适配器。</param> public DataEngine(DbAccess dba, ParserAdapter parserAdapter) { _DBA = dba; _CommandParserAdapter = parserAdapter; if (DBA != null) { DBA.parserAdapter = parserAdapter; } }
/// <summary> /// 启动编译 /// </summary> private async void RunAsync() { StateSBI.Content = "编译中..."; if (parserAdapter == null) { parserAdapter = new ParserAdapter(); } var result = await parserAdapter.Compile(CodeBox.Text, Path.RULE_PATH, Path.CFG_PATH); FirstTableDataGrid.ItemsSource = result.First; FollowTableDataGrid.ItemsSource = result.Follow; ASTView.ItemsSource = new List <Node>() { result.Root }; ArithResultDataGrid.ItemsSource = result.ArithResult; ErrorDataGrid.ItemsSource = result.Errors; CodeBox.popup.ClearTokens(); foreach (var id in result.IDs) { int index = CodeBox.popup.tokens.BinarySearch(id); if (index < 0) { CodeBox.popup.tokens.Insert(~index, id); } } CodeBox.popup.RefreshList(); var pairDecoration = new CodeBoxControl.Decorations.PairDecoration() { DecorationType = CodeBoxControl.Decorations.EDecorationType.Underline, Brush = new SolidColorBrush(Color.FromArgb(255, 255, 0, 0)), }; foreach (var error in result.Errors) { int offset = CodeBox.GetCharacterIndexFromLineIndex(error.Row - 1) + error.Col - 1; pairDecoration.Pairs.Add(new CodeBoxControl.Pair(offset, error.WordLength)); } CodeBox.Decorations.Clear(); CodeBox.Decorations.Add(pairDecoration); CodeBox.InvalidateVisual(); StateSBI.Content = "就绪"; }
/// <summary> /// 向引擎池中添加一个引擎(注:需要在组件的支持范围内)。 /// </summary> /// <param name="Dba">该引擎与数据库进行交互的访问器。</param> /// <param name="parserAdapter">该引擎用的解析命令的适配器。</param> /// <param name="key">该引擎在引擎池中的键名称。</param> public static void AppendDataEngine(DbAccess Dba, ParserAdapter parserAdapter, string key = "Default") { if (DataEnginePools == null) { DataEnginePools = new Dictionary <string, DataEngine>(); } if (DataEnginePools.ContainsKey(key)) { return; } DataEngine Engine = new DataEngine(Dba, parserAdapter); DataEnginePools.Add(key, Engine); if (key.ToUpper() == "DEFAULT") { DataEngine.CurrentEngine = Engine; } }
protected DataEngine GetDbContext(string dbtype, bool useConnectionPool = true) { DbAccess dba = null; ParserAdapter adapter = null; switch (dbtype?.ToLower()) { case "ms-sql": dba = new SqlServerDbAccess(); dba.ConnectionString = "Server=(local);Database=Wunion.DataAdapter.NetCore.Demo;User ID=sa;Password=ms-sql@(*~-^*);"; adapter = new SqlServerParserAdapter(); break; case "mysql": dba = new MySqlDBAccess(); dba.ConnectionString = "Data Source=192.168.1.106;Database=ksdatab;User ID=cnzhnet;Password=mysql@(*~-^*);"; adapter = new MySqlParserAdapter(); break; case "npgsql": dba = new NpgsqlDbAccess(); dba.ConnectionString = "Host=192.168.1.106;Username=postgres;Password=npgsql@(*~-^*);Database=Wunion.DataAdapter.NetCore.Demo;"; adapter = new NpgsqlParserAdapter(); break; case "sqlite3": dba = new SqliteDbAccess(); dba.ConnectionString = @"Data Source=E:\SQLiteStudio\wdak.sqlite3;"; adapter = new SqliteParserAdapter(); break; } if (dba == null || adapter == null) { return(null); } DataEngine db = new DataEngine(dba, adapter); if (useConnectionPool) { UseConnectionPool(db); } return(db); }
/// <summary> /// 必须在所有SQL命令执行完成后并且数据库连接关闭前调用。 /// </summary> /// <param name="adapter">解释命令所需的适配器。</param> private void QueryLastIdentity(ParserAdapter adapter) { if (string.IsNullOrEmpty(adapter.IdentityCommand)) { return; } try { DbCommand.CommandText = adapter.IdentityCommand; if (DbCommand.Connection.State == ConnectionState.Closed) { DbCommand.Connection.Open(); } _LastIdentity = DbCommand.ExecuteScalar(); } catch { _LastIdentity = null; } }
/// <summary> /// 解释整个命令,同时创建该命令应有的参数并返回命令文本。 /// </summary> /// <param name="adapter">解释命令所需的适配器。</param> /// <returns></returns> public virtual string Parsing(ParserAdapter adapter) { // 防止多次调用此方法导致参数集合内的参数重复。 // 如果参数重复将会导致读或写库失败。 if (IsParsed) { return(CommandText); } CommandDescription.DescriptionParserAdapter = adapter; if (CommandDescription.DescriptionParserAdapter == null) { throw (new Exception("未初始化解释命令所需要的适配器。")); } _IdentityCommand = adapter.IdentityCommand; ParserBase parser = CommandDescription.GetParser(); CommandText = parser.Parsing(ref _CommandParameters); _IsParsed = true; return(CommandText); }
/// <summary> /// 创建一个 <see cref="SqliteLikeParser"/> 的对象实例. /// </summary> /// <param name="adapter"></param> public SqliteLikeParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 实例化一个 Microsoft SQL Server 的函数解释器。 /// </summary> /// <param name="adapter">所属的父级适配器。</param> public SqlServerFunParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 创建一个 <see cref="MySqlLikeParser"/> 的对象实例. /// </summary> /// <param name="adapter"></param> public MySqlLikeParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 所属的父级适配器。 /// </summary> /// <param name="adapter">所属的父级适配器。</param> public SqliteFunParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 实例化一个 PostgreSQL 数据库的 SELECT 命令解释器 /// </summary> /// <param name="adapter">所属的父级适配器.</param> public NpgsqlSelectBlockParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 所属的父级适配器。 /// </summary> /// <param name="adapter">所属的父级适配器。</param> public MySqlFunParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 创建一个 <see cref="NpgsqlLikeParser"/> 的对象实例. /// </summary> /// <param name="adapter"></param> public NpgsqlLikeParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 创建一个 <see cref="MySqlTableBuildParser"/> 的对象实例. /// </summary> /// <param name="adapter">所属的父级适配器。</param> public MySqlTableBuildParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 创建一个 PostagreSQL 函数解释器. /// </summary> /// <param name="adapter">所属的父级适配器</param> public NpgsqlFunParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 创建一个生成器实例. /// </summary> /// <param name="DBA"></param> /// <param name="adapter"></param> /// <param name="context"></param> public GeneratorService(DbAccess DBA, ParserAdapter adapter) { _DbEngine = new DataEngine(DBA, adapter); }
/// <summary> /// 创建一个 <see cref="SqliteTableBuildParser"/> 的对象实例. /// </summary> /// <param name="adapter"></param> public SqliteTableBuildParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 实例化一个 Microsoft SQL Server 2005 及以上版本的 SELECT 命令解释器 /// </summary> /// <param name="adapter">所属的父级适配器。</param> public SqlServerSelectBlockParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 创建一个 <see cref="SqlServerTableBuildParser"/> 的对象实例. /// </summary> /// <param name="adapter">所属的父级适配器。</param> public SqlServerTableBuildParser(ParserAdapter adapter) : base(adapter) { }
/// <summary> /// 实例化一个 SQLite 数据库的 SELECT 命令解释器。 /// </summary> /// <param name="adapter"></param> public SqliteSelectBlockParser(ParserAdapter adapter) : base(adapter) { }