Ejemplo n.º 1
0
 /// <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>();
 }
Ejemplo n.º 2
0
        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;
                }
            }
        }
Ejemplo n.º 3
0
        /// <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;
            }
        }
Ejemplo n.º 4
0
        /// <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 = "就绪";
        }
Ejemplo n.º 5
0
        /// <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;
            }
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
 /// <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;
     }
 }
Ejemplo n.º 8
0
        /// <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);
        }
Ejemplo n.º 9
0
 /// <summary>
 /// 创建一个 <see cref="SqliteLikeParser"/> 的对象实例.
 /// </summary>
 /// <param name="adapter"></param>
 public SqliteLikeParser(ParserAdapter adapter) : base(adapter)
 {
 }
Ejemplo n.º 10
0
 /// <summary>
 /// 实例化一个 Microsoft SQL Server 的函数解释器。
 /// </summary>
 /// <param name="adapter">所属的父级适配器。</param>
 public SqlServerFunParser(ParserAdapter adapter) : base(adapter)
 {
 }
Ejemplo n.º 11
0
 /// <summary>
 /// 创建一个 <see cref="MySqlLikeParser"/> 的对象实例.
 /// </summary>
 /// <param name="adapter"></param>
 public MySqlLikeParser(ParserAdapter adapter) : base(adapter)
 {
 }
Ejemplo n.º 12
0
 /// <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)
 {
 }
Ejemplo n.º 14
0
 /// <summary>
 /// 所属的父级适配器。
 /// </summary>
 /// <param name="adapter">所属的父级适配器。</param>
 public MySqlFunParser(ParserAdapter adapter)
     : base(adapter)
 {
 }
Ejemplo n.º 15
0
 /// <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)
 {
 }
Ejemplo n.º 17
0
 /// <summary>
 /// 创建一个 PostagreSQL 函数解释器.
 /// </summary>
 /// <param name="adapter">所属的父级适配器</param>
 public NpgsqlFunParser(ParserAdapter adapter) : base(adapter)
 {
 }
Ejemplo n.º 18
0
 /// <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);
 }
Ejemplo n.º 19
0
 /// <summary>
 /// 创建一个 <see cref="SqliteTableBuildParser"/> 的对象实例.
 /// </summary>
 /// <param name="adapter"></param>
 public SqliteTableBuildParser(ParserAdapter adapter) : base(adapter)
 {
 }
Ejemplo n.º 20
0
 /// <summary>
 /// 实例化一个 Microsoft SQL Server 2005 及以上版本的 SELECT 命令解释器
 /// </summary>
 /// <param name="adapter">所属的父级适配器。</param>
 public SqlServerSelectBlockParser(ParserAdapter adapter) : base(adapter)
 {
 }
Ejemplo n.º 21
0
 /// <summary>
 /// 创建一个 <see cref="SqlServerTableBuildParser"/> 的对象实例.
 /// </summary>
 /// <param name="adapter">所属的父级适配器。</param>
 public SqlServerTableBuildParser(ParserAdapter adapter) : base(adapter)
 {
 }
Ejemplo n.º 22
0
 /// <summary>
 /// 实例化一个 SQLite 数据库的 SELECT 命令解释器。
 /// </summary>
 /// <param name="adapter"></param>
 public SqliteSelectBlockParser(ParserAdapter adapter) : base(adapter)
 {
 }