Example #1
0
        /// <summary>
        /// get shard strategy object via shard config
        /// </summary>
        /// <param name="element"></param>
        /// <returns></returns>
        public IShardingStrategy GetShardingStrategy(DatabaseSetElement element)
        {
            String shardingStrategy = element.ShardingStrategy;

            if (String.IsNullOrEmpty(shardingStrategy))
            {
                return(null);
            }

            var shardconfs = shardingStrategy.Split(';');
            var config     = new Dictionary <String, String>();

            foreach (var shardcnfg in shardconfs)
            {
                var param = shardcnfg.Split('=');
                if (param.Length != 2)
                {
                    throw new ArgumentException("Sharding parameters invalid.");
                }
                //will fix key issue(ignore case in the future)
                config.Add(param[0].Trim(), param[1].Trim());
            }

            String classname;

            if (!config.TryGetValue("class", out classname))
            {
                throw new ArgumentException("Strategy invalid.");
            }

            Type type = Type.GetType(classname);

            if (type == null)
            {
                throw new ArgumentException("Strategy invalid.");
            }

            try
            {
                var resultStrategy = Activator.CreateInstance(type) as IShardingStrategy;
                if (resultStrategy == null)
                {
                    throw new DalException("Strategy {0} didn't implement IShardingStrategy", classname);
                }
                else
                {
                    resultStrategy.SetShardConfig(config, element);
                    return(resultStrategy);
                }
            }
            catch (Exception ex)
            {
                throw new DalException("Strategy invalid.", ex);
            }
        }
        public void SetShardConfig(IDictionary <String, String> config, DatabaseSetElement databaseSet)
        {
            String tempMod;

            if (!config.TryGetValue("mod", out tempMod))
            {
                throw new ArgumentException("sharding config does not contains mod setting!");
            }

            String tempColumn;

            if (config.TryGetValue("column", out tempColumn))
            {
                var tempColumns = tempColumn.Split(',');
                foreach (var column in tempColumns)
                {
                    if (column.Contains(':'))
                    {
                        var tableColumnPair = column.Split(':');
                        shardColumnAndTable[tableColumnPair[0].ToLower()] = tableColumnPair[1].ToLower();
                        shardColumns.Add(tableColumnPair[1].ToLower());
                    }
                    else
                    {
                        //兼容最初版本的DAL.config配置
                        shardColumns.Add(column.ToLower());
                    }
                }
            }

            if (!Int32.TryParse(tempMod, out MOD))
            {
                throw new ArgumentException("Mod settings invalid.");
            }

            foreach (DatabaseElement db in databaseSet.Databases)
            {
                allShards.Add(db.Sharding);
            }

            String shardByDb;
            String tmpShardByTable;

            if (config.TryGetValue("shardByDB", out shardByDb))
            {
                Boolean.TryParse(shardByDb, out shardByDB);
            }
            if (config.TryGetValue("shardByTable", out tmpShardByTable))
            {
                Boolean.TryParse(tmpShardByTable, out shardByTable);
            }
        }
        public void SetShardConfig(IDictionary <String, String> config, DatabaseSetElement databaseSet)
        {
            String tempColumn = null;

            if (config.TryGetValue("column", out tempColumn))
            {
                //shardColumns = tempColumn.Split(',').ToList();
                String[] tempColumns = tempColumn.Split(',');

                foreach (String column in tempColumns)
                {
                    if (column.Contains(':'))
                    {
                        String[] tableColumnPair = column.Split(':');
                        shardColumnAndTable[tableColumnPair[0].ToLower()] = tableColumnPair[1].ToLower();
                        shardColumns.Add(tableColumnPair[1].ToLower());
                    }
                    else
                    {
                        //兼容最初版本的DAL.config配置
                        shardColumns.Add(column.ToLower());
                    }
                }
            }

            foreach (DatabaseElement db in databaseSet.Databases)
            {
                shards.Add(new SequenceInnerClass()
                {
                    Sharding = db.Sharding, SequenceStart = db.Start, SequenceEnd = db.End
                });
                allShards.Add(db.Sharding);
            }

            String _shardByDb;
            String _shardByTable;

            if (config.TryGetValue("shardByDB", out _shardByDb))
            {
                Boolean.TryParse(_shardByDb, out shardByDB);
            }

            if (config.TryGetValue("shardByTable", out _shardByTable))
            {
                Boolean.TryParse(_shardByTable, out shardByTable);
            }
        }
Example #4
0
        /// <summary>
        /// get shard strategy object via shard config
        /// </summary>
        /// <param name="element"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public IShardingStrategy GetShardingStrategy(DatabaseSetElement element, DatabaseSettings settings = null)
        {
            String shardingStrategy = settings == null ? element.ShardingStrategy : settings.ShardingStrategy;

            if (String.IsNullOrEmpty(shardingStrategy))
            {
                return(null);
            }

            var shardconfs = shardingStrategy.Split(';');
            var config     = new Dictionary <String, String>();

            foreach (var shardcnfg in shardconfs)
            {
                var param = shardcnfg.Split('=');
                if (param.Length != 2)
                {
                    throw new ArgumentException("Sharding parameters invalid.");
                }
                //will fix key issue(ignore case in the future)
                config.Add(param[0].Trim(), param[1].Trim());
            }

            String classname;

            if (!config.TryGetValue("class", out classname))
            {
                throw new ArgumentException("Strategy invalid.");
            }

            Type type = Type.GetType(classname);

            if (type == null)
            {
                throw new ArgumentException("Strategy invalid.");
            }

            try
            {
                var resultStrategy = Activator.CreateInstance(type) as IShardingStrategy;
                if (resultStrategy == null)
                {
                    throw new DalException("Strategy {0} didn't implement IShardingStrategy", classname);
                }
                else
                {
                    var allShardingConfig = new List <ShardingConfig>();
                    if (element != null)
                    {
                        foreach (DatabaseElement e in element.Databases)
                        {
                            if (!string.IsNullOrWhiteSpace(e.Sharding))
                            {
                                allShardingConfig.Add(new ShardingConfig {
                                    Sharding = e.Sharding
                                });
                            }
                        }
                    }
                    if (settings != null)
                    {
                        foreach (var e in settings.ConnectionItemList)
                        {
                            if (!string.IsNullOrWhiteSpace(e.Sharding))
                            {
                                allShardingConfig.Add(new ShardingConfig {
                                    Sharding = e.Sharding
                                });
                            }
                        }
                    }
                    resultStrategy.SetShardConfig(config, allShardingConfig);
                    return(resultStrategy);
                }
            }
            catch (Exception ex)
            {
                throw new DalException("Strategy invalid.", ex);
            }
        }