/// <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); } }
/// <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); } }