示例#1
0
        public TableRule(TableRuleConfiguration tableRuleConfig, ShardingDataSourceNames shardingDataSourceNames,
                         string defaultGenerateKeyColumn)
        {
            LogicTable = tableRuleConfig.LogicTable.ToLower();
            List <string> dataNodes = tableRuleConfig.ActualDataNodes ?? new List <string>(0);

            // List<string> dataNodes = new InlineExpressionParser(tableRuleConfig.GetActualDataNodes()).splitAndEvaluate();
            // dataNodeIndexMap = new HashMap<>(dataNodes.size(), 1);
            dataNodeIndexMap = new Dictionary <DataNode, int>(dataNodes.Count);
            ActualDataNodes  = IsEmptyDataNodes(dataNodes)
                ? GenerateDataNodes(tableRuleConfig.LogicTable, shardingDataSourceNames.DataSourceNames) : GenerateDataNodes(dataNodes, shardingDataSourceNames.DataSourceNames);
            //ActualDataNodes = GenerateDataNodes(tableRuleConfig.LogicTable, shardingDataSourceNames.DataSourceNames);
            actualTables             = GetActualTables();
            DatabaseShardingStrategy = null == tableRuleConfig.DatabaseShardingStrategyConfig
                ? null
                : ShardingStrategyFactory.NewInstance(tableRuleConfig.DatabaseShardingStrategyConfig);
            TableShardingStrategy = null == tableRuleConfig.TableShardingStrategyConfig
                ? null
                : ShardingStrategyFactory.NewInstance(tableRuleConfig.TableShardingStrategyConfig);
            KeyGeneratorConfiguration keyGeneratorConfiguration = tableRuleConfig.KeyGeneratorConfig;

            generateKeyColumn =
                null != keyGeneratorConfiguration && !string.IsNullOrWhiteSpace(keyGeneratorConfiguration.Column)
                    ? keyGeneratorConfiguration.Column
                    : defaultGenerateKeyColumn;
            ShardingKeyGenerator = ContainsKeyGeneratorConfiguration(tableRuleConfig)
                ? new ShardingKeyGeneratorServiceLoader().NewService(tableRuleConfig.KeyGeneratorConfig.Type,
                                                                     tableRuleConfig.KeyGeneratorConfig.Properties)
                : null;
            // CheckRule(dataNodes);
        }
        /// <summary>
        /// 找到实际的默认数据源名称如果是读写分离那么将使用master数据源名称
        /// </summary>
        /// <returns></returns>
        public string FindActualDefaultDataSourceName()
        {
            string defaultDataSourceName = ShardingDataSourceNames.GetDefaultDataSourceName();

            if (string.IsNullOrEmpty(defaultDataSourceName))
            {
                return(null);
            }
            var masterDefaultDataSourceName = FindMasterDataSourceName(defaultDataSourceName);

            return(masterDefaultDataSourceName ?? defaultDataSourceName);
        }
        /**
         * Get table rule.
         *
         * @param logicTableName logic table name
         * @return table rule
         */
        public TableRule GetTableRule(string logicTableName)
        {
            var tableRule = FindTableRule(logicTableName);

            if (tableRule != null)
            {
                return(tableRule);
            }
            if (IsBroadcastTable(logicTableName))
            {
                return(new TableRule(ShardingDataSourceNames.DataSourceNames, logicTableName));
            }
            if (!string.IsNullOrEmpty(ShardingDataSourceNames.GetDefaultDataSourceName()))
            {
                return(new TableRule(ShardingDataSourceNames.GetDefaultDataSourceName(), logicTableName));
            }
            throw new ShardingException($"Cannot find table rule and default data source with logic table: '{logicTableName}'");
        }
 public ShardingRule(ShardingRuleConfiguration shardingRuleConfig, ICollection <string> dataSourceNames)
 {
     if (shardingRuleConfig == null)
     {
         throw new ArgumentNullException(nameof(shardingRuleConfig));
     }
     if (dataSourceNames == null || dataSourceNames.IsEmpty())
     {
         throw new ArgumentNullException("data sources cannot be empty.");
     }
     this.RuleConfiguration  = shardingRuleConfig;
     ShardingDataSourceNames = new ShardingDataSourceNames(shardingRuleConfig, dataSourceNames);
     TableRules        = CreateTableRules(shardingRuleConfig);
     BroadcastTables   = shardingRuleConfig.BroadcastTables;
     BindingTableRules = CreateBindingTableRules(shardingRuleConfig.BindingTableGroups);
     DefaultDatabaseShardingStrategy = CreateDefaultShardingStrategy(shardingRuleConfig.DefaultDatabaseShardingStrategyConfig);
     DefaultTableShardingStrategy    = CreateDefaultShardingStrategy(shardingRuleConfig.DefaultTableShardingStrategyConfig);
     DefaultShardingKeyGenerator     = CreateDefaultKeyGenerator(shardingRuleConfig.DefaultKeyGeneratorConfig);
     MasterSlaveRules = CreateMasterSlaveRules(shardingRuleConfig.MasterSlaveRuleConfigs);
 }
        /**
         * Judge if default data source mame exists.
         *
         * @return if default data source name exists
         */
        public bool HasDefaultDataSourceName()
        {
            string defaultDataSourceName = ShardingDataSourceNames.GetDefaultDataSourceName();

            return(!string.IsNullOrEmpty(defaultDataSourceName));
        }