Exemplo n.º 1
0
        /// <summary>
        /// 得到年得所以分片
        /// </summary>
        /// <returns></returns>
        protected virtual IList <ShardingInfo> GetAllYearShardings()
        {
            var maxTableIndex = GetMaxTableIndex();
            var shardings     = new List <ShardingInfo>();
            var maxDate       = DateTime.Parse(maxTableIndex.Insert(4, "-").Insert(7, "-").Insert(10, " "));
            var curDate       = DateTime.Parse(TableIndex.Insert(4, "-").Insert(7, "-").Insert(10, " "));
            var i             = 1;

            while (curDate < maxDate)
            {
                var sharding = new ShardingInfo
                {
                    GetDataBase   = GetQueryDataBaseIndex(i),
                    SetDataBase   = GetSaveDataBaseIndex(i),
                    IsWrite       = IsWrite,
                    MaxTableIndex = MaxTableIndex,
                    TableStep     = TableStep,
                    TableStepType = TableStepType
                };
                sharding.TableIndex = curDate.ToString("yyyy");
                curDate             = curDate.AddYears(TableStep);
                shardings.Add(sharding);
                i++;
            }
            return(shardings);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 匹配正常
        /// </summary>
        /// <param name="routeValue"></param>
        /// <param name="sharding"></param>
        /// <returns></returns>
        protected virtual string GetAutoTableIndex(object routeValue, ShardingInfo sharding)
        {
            var step = GetTableStep(routeValue, sharding);

            if (step == -1)
            {
                return(null);
            }
            switch (sharding.TableStepType)
            {
            case TableStepType.Value:
                return(step.ToString());

            case TableStepType.Hour:
                return(DateTime.Parse(sharding.TableIndex.Insert(4, "-").Insert(7, "-").Insert(10, " ")).AddHours(step).ToString("yyyyMMddHH"));

            case TableStepType.Day:
                return(DateTime.Parse(sharding.TableIndex.Insert(4, "-").Insert(7, "-")).AddDays(step).ToString("yyyyMMdd"));

            case TableStepType.Month:
                return(DateTime.Parse(sharding.TableIndex.Insert(4, "-")).AddMonths(step).ToString("yyyyMM"));

            case TableStepType.Year:
                return(DateTime.Parse(sharding.TableIndex).AddYears(step).ToString("yyyy"));
            }
            return(null);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 得到表索引
        /// </summary>
        /// <param name="routeValue"></param>
        /// <param name="sharding"></param>
        /// <returns></returns>
        protected virtual int GetTableStep(object routeValue, ShardingInfo sharding)
        {
            var step = -1;

            switch (ShardingType)
            {
            case ShardingType.Value:
                step = GetValueTableStep(routeValue, sharding); break;

            case ShardingType.Remainder:
                step = GetRemainderTableStep(routeValue, sharding); break;

            case ShardingType.Hour:
                step = GetHourTableStep(routeValue, sharding); break;

            case ShardingType.Day:
                step = GetDayTableStep(routeValue, sharding); break;

            case ShardingType.Month:
                step = GetMonthTableStep(routeValue, sharding); break;

            case ShardingType.Year:
                step = GetYearTableStep(routeValue, sharding); break;
            }
            return(step);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 得到存储数据库
        /// </summary>
        public virtual string GetSaveDataBaseIndex(object routeValue, ShardingInfo sharding)
        {
            if (string.IsNullOrEmpty(sharding.TableIndex))
            {
                GetFixedTableIndex(routeValue, sharding);
            }
            var step = GetTableStep(routeValue, sharding);

            return(sharding.GetSaveDataBaseIndex(step));
        }
Exemplo n.º 5
0
 /// <summary>
 /// 得到路由值
 /// </summary>
 /// <param name="routeValue"></param>
 /// <param name="sharding"></param>
 /// <returns></returns>
 protected virtual object GetRouteValue(object routeValue, ShardingInfo sharding)
 {
     if (!string.IsNullOrEmpty(Tag) &&
         !routeValue.ToString().ToLower().Contains(Tag.ToLower()))
     {
         return(null);
     }
     routeValue = string.IsNullOrEmpty(Tag)
         ? routeValue
         : routeValue.ToString().ToLower().Replace(Tag.ToLower(), "");
     return(routeValue);
 }
Exemplo n.º 6
0
        /// <summary>
        /// 匹配正常
        /// </summary>
        /// <param name="routeValue"></param>
        /// <param name="sharding"></param>
        /// <returns></returns>
        protected virtual int GetRemainderTableStep(object routeValue, ShardingInfo sharding)
        {
            var tableMaxStep = sharding.GetTableMaxStep();

            if (tableMaxStep == -1)
            {
                return(-1);
            }
            var value = Math.Abs(long.Parse(routeValue.ToString()));
            var step  = (int)(value % tableMaxStep);

            return(step);
        }
Exemplo n.º 7
0
        /// <summary>
        /// 根据节点得到OrmDataBase
        /// </summary>
        /// <param name="dbRoute"></param>
        /// <param name="node"></param>
        /// <returns></returns>
        protected virtual void LoadShardingsByXmlNode(DbRouteInfo dbRoute, XmlNode node)
        {
            var nodes = node.SelectNodes("Sharding");

            if (nodes == null)
            {
                return;
            }
            foreach (XmlNode nd in nodes)
            {
                var sharding = new ShardingInfo {
                    ShardProperties = new List <ShardPropertyInfo>()
                };
                sharding.GetDataBase = nd.Attributes["GetDataBase"] != null
                                           ? nd.Attributes["GetDataBase"].Value.ToLower()
                                           : "";
                sharding.SetDataBase = nd.Attributes["SetDataBase"] != null
                                           ? nd.Attributes["SetDataBase"].Value.ToLower()
                                           : "";
                sharding.TableIndex = nd.Attributes["TableIndex"] != null
                                           ? nd.Attributes["TableIndex"].Value.ToLower()
                                           : "";
                sharding.MaxTableIndex = nd.Attributes["MaxTableIndex"] != null
                                       ? nd.Attributes["MaxTableIndex"].Value.ToLower()
                                       : "";
                sharding.TableTag = nd.Attributes["TableTag"] != null
                                       ? nd.Attributes["TableTag"].Value.ToLower()
                                       : "";
                sharding.IsWrite = nd.Attributes["IsWrite"] == null || Convert.ToBoolean(nd.Attributes["IsWrite"].Value);
                if (nd.Attributes["TableStepType"] != null)
                {
                    sharding.TableStepType = (TableStepType)Enum.Parse(typeof(TableStepType), nd.Attributes["TableStepType"].Value);
                }
                if (nd.Attributes["TableStep"] != null)
                {
                    sharding.TableStep = Convert.ToInt32(nd.Attributes["TableStep"].Value);
                }
                if (nd.Attributes["GetDataBaseTableCount"] != null)
                {
                    sharding.GetDataBaseTableCount = Convert.ToInt32(nd.Attributes["GetDataBaseTableCount"].Value);
                }
                if (nd.Attributes["SetDataBaseTableCount"] != null)
                {
                    sharding.SetDataBaseTableCount = Convert.ToInt32(nd.Attributes["SetDataBaseTableCount"].Value);
                }
                LoadShardingPropertiesByXmlNode(sharding, nd);
                dbRoute.Shardings.Add(sharding);
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// 匹配
        /// </summary>
        /// <param name="routeValue"></param>
        /// <param name="sharding"></param>
        /// <returns></returns>
        public virtual string GetTableIndex(object routeValue, ShardingInfo sharding)
        {
            if (string.IsNullOrEmpty(sharding.TableIndex))
            {
                GetFixedTableIndex(routeValue, sharding);
            }
            routeValue = GetRouteValue(routeValue, sharding);
            if (routeValue == null)
            {
                return(null);
            }
            var tableIndex = ShardingType == 0 || ShardingType == ShardingType.Fixed?
                             GetFixedTableIndex(routeValue, sharding): GetAutoTableIndex(routeValue, sharding);

            return(string.Format("{0}{1}", sharding.TableTag, tableIndex));
        }
Exemplo n.º 9
0
        /// <summary>
        /// 得到查询
        /// </summary>
        /// <param name="dbRoute"></param>
        /// <param name="query"></param>
        /// <param name="sharding"></param>
        /// <returns></returns>
        protected virtual QueryInfo GetQuery(DbRouteInfo dbRoute, QueryInfo query, ShardingInfo sharding)
        {
            if (sharding == null)
            {
                return(null);
            }
            var result = new QueryInfo
            {
                DataCount     = query.DataCount,
                FromExp       = query.FromExp,
                GroupByExp    = query.GroupByExp,
                HavingExp     = query.HavingExp,
                IsDisinct     = query.IsDisinct,
                IsGreedyLoad  = query.IsGreedyLoad,
                IsLazyLoad    = query.IsLazyLoad,
                OrderByExp    = query.OrderByExp,
                PageSize      = query.PageSize + query.PageIndex * query.PageSize,
                RemoteQueries = query.RemoteQueries,
                SelectExp     = query.SelectExp,
                WhereExp      = query.WhereExp,
                TableIndex    = string.IsNullOrWhiteSpace(sharding.TableIndex) ? sharding.TableIndex : sharding.TableIndex.ToLower(),
                GetDataBase   = string.IsNullOrWhiteSpace(sharding.GetDataBase)? sharding.GetDataBase: sharding.GetDataBase.ToLower(),
                Object        = query.Object,
                DbRoute       = query.DbRoute
            };

            if (query.Parameters != null)
            {
                result.Parameters = new Dictionary <string, object>();
                foreach (var parameter in query.Parameters)
                {
                    result.Parameters.Add(parameter.Key, parameter.Value);
                }
            }
            if (query.Cache != null)
            {
                result.Cache = new CacheInfo
                {
                    Time     = query.Cache.Time,
                    TimeSpan = query.Cache.TimeSpan
                };
            }
            return(result);
        }
Exemplo n.º 10
0
        /// <summary>
        /// 加载分片属性
        /// </summary>
        /// <param name="sharding"></param>
        /// <param name="node"></param>
        protected virtual void LoadShardingPropertiesByXmlNode(ShardingInfo sharding, XmlNode node)
        {
            var nodes = node.SelectNodes("Property");

            if (nodes == null)
            {
                return;
            }
            foreach (XmlNode nd in nodes)
            {
                var shardProperty = new ShardPropertyInfo();
                shardProperty.PropertyName = nd.Attributes["PropertyName"] != null
                                           ? nd.Attributes["PropertyName"].Value
                                          : "";
                shardProperty.Tag = nd.Attributes["Tag"] != null
                                           ? nd.Attributes["Tag"].Value
                                          : "";
                if (nd.Attributes["StartValue"] != null)
                {
                    shardProperty.StartValue = Convert.ToInt64(nd.Attributes["StartValue"].Value);
                }
                if (nd.Attributes["EndValue"] != null)
                {
                    shardProperty.EndValue = Convert.ToInt64(nd.Attributes["EndValue"].Value);
                }
                if (nd.Attributes["FixedValue"] != null)
                {
                    shardProperty.FixedValue = nd.Attributes["FixedValue"].Value;
                }
                if (nd.Attributes["DateFormat"] != null)
                {
                    shardProperty.DateFormat = nd.Attributes["DateFormat"].Value;
                }
                if (nd.Attributes["ShardingType"] != null)
                {
                    shardProperty.ShardingType = (ShardingType)Enum.Parse(typeof(ShardingType), nd.Attributes["ShardingType"].Value);
                }
                sharding.ShardProperties.Add(shardProperty);
            }
        }
Exemplo n.º 11
0
 /// <summary>
 /// 匹配正常
 /// </summary>
 /// <param name="routeValue"></param>
 /// <param name="sharding"></param>
 /// <returns></returns>
 protected virtual string GetFixedTableIndex(object routeValue, ShardingInfo sharding)
 {
     if (StartValue > 0 && EndValue > 0)
     {
         var value = Math.Abs(long.Parse(routeValue.ToString()));
         if (value >= StartValue && value <= EndValue)
         {
             return(sharding.TableIndex);
         }
     }
     else if (!string.IsNullOrEmpty(FixedValue))
     {
         var value = string.IsNullOrEmpty(DateFormat)
             ? routeValue.ToString()
             : DateTime.Parse(routeValue.ToString()).ToString(DateFormat);
         if (value == FixedValue)
         {
             return(sharding.TableIndex);
         }
     }
     return(null);
 }
Exemplo n.º 12
0
        /// <summary>
        /// 匹配正常
        /// </summary>
        /// <param name="routeValue"></param>
        /// <param name="sharding"></param>
        /// <returns></returns>
        protected virtual int GetValueTableStep(object routeValue, ShardingInfo sharding)
        {
            var tableMaxStep = sharding.GetTableMaxStep();

            if (tableMaxStep == -1)
            {
                return(-1);
            }
            var value = Math.Abs(long.Parse(routeValue.ToString()));

            if (value > StartValue + (EndValue - StartValue + 1) * tableMaxStep)
            {
                return(-1);
            }
            var step = (int)(Math.Floor((double)((value - StartValue) / (EndValue - StartValue))));

            if (sharding.TableStep > 0)
            {
                step = step / sharding.TableStep;
            }
            return(step);
        }
Exemplo n.º 13
0
        /// <summary>
        /// 得到值得所以分片
        /// </summary>
        /// <returns></returns>
        protected virtual IList <ShardingInfo> GetAllValueShardings()
        {
            var maxTableIndex = GetMaxTableIndex();
            var shardings     = new List <ShardingInfo>();
            var max           = int.Parse(maxTableIndex);

            for (int i = int.Parse(TableIndex); i < max;)
            {
                var sharding = new ShardingInfo
                {
                    GetDataBase   = GetQueryDataBaseIndex(i),
                    SetDataBase   = GetSaveDataBaseIndex(i),
                    IsWrite       = IsWrite,
                    MaxTableIndex = MaxTableIndex,
                    TableStep     = TableStep,
                    TableStepType = TableStepType
                };
                sharding.TableIndex = i.ToString();
                i += TableStep;
                shardings.Add(sharding);
            }
            return(shardings);
        }
Exemplo n.º 14
0
        /// <summary>
        ///  得到所有分片
        /// </summary>
        /// <returns></returns>
        public virtual IList <ShardingInfo> GetAllShardings()
        {
            if (string.IsNullOrEmpty(TableIndex))
            {
                var sharding = new ShardingInfo
                {
                    GetDataBase   = GetDataBase,
                    SetDataBase   = SetDataBase,
                    IsWrite       = IsWrite,
                    MaxTableIndex = MaxTableIndex,
                    TableStep     = TableStep,
                    TableIndex    = "",
                    TableStepType = TableStepType
                };
                return(new List <ShardingInfo> {
                    sharding
                });
            }
            switch (TableStepType)
            {
            case TableStepType.Value:
                return(GetAllValueShardings());

            case TableStepType.Hour:
                return(GetAllHourShardings());

            case TableStepType.Day:
                return(GetAllDayShardings());

            case TableStepType.Month:
                return(GetAllMonthShardings());

            case TableStepType.Year:
                return(GetAllYearShardings());
            }
            return(null);
        }
Exemplo n.º 15
0
        /// <summary>
        /// 匹配正常
        /// </summary>
        /// <param name="routeValue"></param>
        /// <param name="sharding"></param>
        /// <returns></returns>
        protected virtual int GetDayTableStep(object routeValue, ShardingInfo sharding)
        {
            var tableMaxStep = sharding.GetTableMaxStep();

            if (tableMaxStep == -1)
            {
                return(-1);
            }
            var date    = DateTime.Parse(routeValue.ToString());
            var maxDate = DateTime.Parse(sharding.TableIndex.Insert(4, "-").Insert(7, "-")).AddDays(tableMaxStep);

            if (date > maxDate)
            {
                return(-1);
            }
            var curdate = DateTime.Parse(FixedValue);
            var step    = (date - curdate).TotalDays;

            if (sharding.TableStep > 0)
            {
                step = step / sharding.TableStep;
            }
            return((int)step);
        }
Exemplo n.º 16
0
        /// <summary>
        /// 匹配正常
        /// </summary>
        /// <param name="routeValue"></param>
        /// <param name="sharding"></param>
        /// <returns></returns>
        protected virtual int GetMonthTableStep(object routeValue, ShardingInfo sharding)
        {
            var tableMaxStep = sharding.GetTableMaxStep();

            if (tableMaxStep == -1)
            {
                return(-1);
            }
            var date    = DateTime.Parse(routeValue.ToString());
            var maxDate = DateTime.Parse(sharding.TableIndex.Insert(4, "-")).AddMonths(tableMaxStep);

            if (date > maxDate)
            {
                return(-1);
            }
            var curdate = DateTime.Parse(FixedValue);
            var step    = (date.Year - curdate.Year) * 12 + (date.Month - curdate.Month);

            if (sharding.TableStep > 0)
            {
                step = step / sharding.TableStep;
            }
            return(step);
        }
Exemplo n.º 17
0
        /// <summary>
        /// 匹配正常
        /// </summary>
        /// <param name="routeValue"></param>
        /// <param name="sharding"></param>
        /// <returns></returns>
        protected virtual int GetYearTableStep(object routeValue, ShardingInfo sharding)
        {
            var tableMaxStep = sharding.GetTableMaxStep();

            if (tableMaxStep == -1)
            {
                return(-1);
            }
            var date    = DateTime.Parse(routeValue.ToString());
            var maxDate = DateTime.Parse(sharding.TableIndex).AddYears(tableMaxStep);

            if (date > maxDate)
            {
                return(-1);
            }
            var curdate = DateTime.Parse(FixedValue);
            var step    = date.Year - curdate.Year;

            if (sharding.TableStep > 0)
            {
                step = step / sharding.TableStep;
            }
            return(step);
        }