public virtual void Configure(IType type, IDictionary <string, string> parms, Dialect.Dialect dialect) { IdentifierType = type; bool forceTableUse = PropertiesHelper.GetBoolean(ForceTableParam, parms, false); string sequenceName = DetermineSequenceName(parms, dialect); int initialValue = DetermineInitialValue(parms); int incrementSize = DetermineIncrementSize(parms); string optimizationStrategy = DetermineOptimizationStrategy(parms, incrementSize); incrementSize = DetermineAdjustedIncrementSize(optimizationStrategy, incrementSize); Optimizer = OptimizerFactory.BuildOptimizer( optimizationStrategy, IdentifierType.ReturnedClass, incrementSize, PropertiesHelper.GetInt32(InitialParam, parms, -1)); // Use -1 as default initial value here to signal that it's not set. if (!forceTableUse && RequiresPooledSequence(initialValue, incrementSize, Optimizer) && !dialect.SupportsPooledSequences) { // force the use of a table (overriding whatever the user configured) since the dialect // doesn't support the sequence features we need. forceTableUse = true; Log.Info("Forcing table use for sequence-style generator due to optimizer selection where db does not support pooled sequences."); } DatabaseStructure = BuildDatabaseStructure(type, parms, dialect, forceTableUse, sequenceName, initialValue, incrementSize); DatabaseStructure.Prepare(Optimizer); }
public virtual void Configure(IType type, IDictionary <string, string> parms, Dialect.Dialect dialect) { IdentifierType = type; TableName = DetermineGeneratorTableName(parms, dialect); SegmentColumnName = DetermineSegmentColumnName(parms, dialect); ValueColumnName = DetermineValueColumnName(parms, dialect); SegmentValue = DetermineSegmentValue(parms); SegmentValueLength = DetermineSegmentColumnSize(parms); InitialValue = DetermineInitialValue(parms); IncrementSize = DetermineIncrementSize(parms); BuildSelectQuery(dialect); BuildUpdateQuery(); BuildInsertQuery(); // if the increment size is greater than one, we prefer pooled optimization; but we // need to see if the user prefers POOL or POOL_LO... string defaultPooledOptimizerStrategy = PropertiesHelper.GetBoolean(Cfg.Environment.PreferPooledValuesLo, parms, false) ? OptimizerFactory.PoolLo : OptimizerFactory.Pool; string defaultOptimizerStrategy = IncrementSize <= 1 ? OptimizerFactory.None : defaultPooledOptimizerStrategy; string optimizationStrategy = PropertiesHelper.GetString(OptimizerParam, parms, defaultOptimizerStrategy); Optimizer = OptimizerFactory.BuildOptimizer( optimizationStrategy, IdentifierType.ReturnedClass, IncrementSize, PropertiesHelper.GetInt32(InitialParam, parms, -1) // Use -1 as default initial value here to signal that it's not set. ); }
public virtual void Configure(IType type, IDictionary <string, string> parms, Dialect.Dialect dialect) { identifierType = type; bool forceTableUse = PropertiesHelper.GetBoolean(ForceTableParam, parms, false); string sequenceName = PropertiesHelper.GetString(SequenceParam, parms, DefaultSequenceName); if (sequenceName.IndexOf('.') < 0) { string schemaName; string catalogName; parms.TryGetValue(PersistentIdGeneratorParmsNames.Schema, out schemaName); parms.TryGetValue(PersistentIdGeneratorParmsNames.Catalog, out catalogName); sequenceName = Table.Qualify(catalogName, schemaName, sequenceName); } int initialValue = PropertiesHelper.GetInt32(InitialParam, parms, DefaultInitialValue); int incrementSize = PropertiesHelper.GetInt32(IncrementParam, parms, DefaultIncrementSize); string valueColumnName = PropertiesHelper.GetString(ValueColumnParam, parms, DefaultValueColumnName); string defOptStrategy = incrementSize <= 1 ? OptimizerFactory.None : OptimizerFactory.Pool; string optimizationStrategy = PropertiesHelper.GetString(OptimizerParam, parms, defOptStrategy); if (OptimizerFactory.None.Equals(optimizationStrategy) && incrementSize > 1) { log.Warn("config specified explicit optimizer of [" + OptimizerFactory.None + "], but [" + IncrementParam + "=" + incrementSize + "; honoring optimizer setting"); incrementSize = 1; } if (dialect.SupportsSequences && !forceTableUse) { if (OptimizerFactory.Pool.Equals(optimizationStrategy) && !dialect.SupportsPooledSequences) { // TODO : may even be better to fall back to a pooled table strategy here so that the db stored values remain consistent... optimizationStrategy = OptimizerFactory.HiLo; } databaseStructure = new SequenceStructure(dialect, sequenceName, initialValue, incrementSize); } else { databaseStructure = new TableStructure(dialect, sequenceName, valueColumnName, initialValue, incrementSize); } optimizer = OptimizerFactory.BuildOptimizer(optimizationStrategy, identifierType.ReturnedClass, incrementSize); databaseStructure.Prepare(optimizer); }