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);
        }
Beispiel #2
0
        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.
                );
        }
Beispiel #3
0
        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);
        }