Provides the meta information about a ISequence configuring its operative behavior.
Inheritance: IObjectInfo
Exemple #1
0
        public ISequence CreateSequence(SequenceInfo sequenceInfo)
        {
            if (sequenceInfo == null)
            {
                throw new ArgumentNullException("sequenceInfo");
            }

            var sequenceName = sequenceInfo.SequenceName;

            // If the Sequence or SequenceInfo tables don't exist then
            // We can't add or remove native tables
            if (sequenceName.Equals(SystemSchema.SequenceTableName) ||
                sequenceName.Equals(SystemSchema.SequenceInfoTableName) ||
                !Transaction.TableExists(SystemSchema.SequenceTableName) ||
                !Transaction.TableExists(SystemSchema.SequenceInfoTableName))
            {
                return(null);
            }

            if (sequenceInfo.Type == SequenceType.Native)
            {
                return(CreateNativeTableSequence(sequenceName));
            }

            return(CreateCustomSequence(sequenceName, sequenceInfo));
        }
 public Sequence(SequenceManager manager, SqlNumber id, SqlNumber lastValue, SequenceInfo sequenceInfo)
 {
     this.manager = manager;
     Id           = id;
     SequenceInfo = sequenceInfo;
     LastValue    = lastValue;
     CurrentValue = lastValue;
 }
Exemple #3
0
        private ISequence CreateNativeTableSequence(ObjectName tableName)
        {
            var table    = Transaction.GetMutableTable(SystemSchema.SequenceInfoTableName);
            var uniqueId = Transaction.NextTableId(SystemSchema.SequenceInfoTableName);

            var dataRow = table.NewRow();

            dataRow.SetValue(0, DataObject.Number(uniqueId));
            dataRow.SetValue(1, DataObject.VarChar(tableName.Parent.FullName));
            dataRow.SetValue(2, DataObject.VarChar(tableName.Name));
            dataRow.SetValue(3, DataObject.BigInt(1));
            table.AddRow(dataRow);

            return(new Sequence(this, uniqueId, SequenceInfo.Native(tableName)));
        }
Exemple #4
0
        private Sequence CreateCustomSequence(ObjectName sequenceName, SequenceInfo sequenceInfo)
        {
            // The SEQUENCE and SEQUENCE_INFO table
            var seq  = Transaction.GetMutableTable(SystemSchema.SequenceTableName);
            var seqi = Transaction.GetMutableTable(SystemSchema.SequenceInfoTableName);

            var list = seqi.SelectRowsEqual(2, DataObject.VarChar(sequenceName.Name), 1, DataObject.VarChar(sequenceName.Parent.FullName));

            if (list.Any())
            {
                throw new Exception(String.Format("Sequence generator with name '{0}' already exists.", sequenceName));
            }

            // Generate a unique id for the sequence info table
            var uniqueId = Transaction.NextTableId(SystemSchema.SequenceInfoTableName);

            // Insert the new row
            var dataRow = seqi.NewRow();

            dataRow.SetValue(0, DataObject.Number(uniqueId));
            dataRow.SetValue(1, DataObject.VarChar(sequenceName.Parent.FullName));
            dataRow.SetValue(2, DataObject.VarChar(sequenceName.Name));
            dataRow.SetValue(3, DataObject.BigInt(2));
            seqi.AddRow(dataRow);

            // Insert into the SEQUENCE table.
            dataRow = seq.NewRow();
            dataRow.SetValue(0, DataObject.Number(uniqueId));
            dataRow.SetValue(1, DataObject.Number(sequenceInfo.StartValue));
            dataRow.SetValue(2, DataObject.Number(sequenceInfo.Increment));
            dataRow.SetValue(3, DataObject.Number(sequenceInfo.MinValue));
            dataRow.SetValue(4, DataObject.Number(sequenceInfo.MaxValue));
            dataRow.SetValue(5, DataObject.Number(sequenceInfo.StartValue));
            dataRow.SetValue(6, DataObject.BigInt(sequenceInfo.Cache));
            dataRow.SetValue(7, DataObject.Boolean(sequenceInfo.Cycle));
            seq.AddRow(dataRow);

            return(new Sequence(this, uniqueId, sequenceInfo));
        }
 public Sequence(SequenceManager manager, SqlNumber id, SqlNumber lastValue, SequenceInfo sequenceInfo)
 {
     this.manager = manager;
     Id = id;
     FullName = sequenceInfo.SequenceName;
     SequenceInfo = sequenceInfo;
     LastValue = lastValue;
     CurrentValue = lastValue;
 }
 public Sequence(SequenceManager manager, SqlNumber id, SequenceInfo sequenceInfo)
     : this(manager, id, SqlNumber.Null, sequenceInfo)
 {
 }
        private Sequence CreateCustomSequence(ObjectName sequenceName, SequenceInfo sequenceInfo)
        {
            // The SEQUENCE and SEQUENCE_INFO table
            var seq = Transaction.GetMutableTable(SystemSchema.SequenceTableName);
            var seqi = Transaction.GetMutableTable(SystemSchema.SequenceInfoTableName);

            var list = seqi.SelectRowsEqual(2, DataObject.VarChar(sequenceName.Name), 1, DataObject.VarChar(sequenceName.Parent.FullName));
            if (list.Any())
                throw new Exception(String.Format("Sequence generator with name '{0}' already exists.", sequenceName));

            // Generate a unique id for the sequence info table
            var uniqueId = Transaction.NextTableId(SystemSchema.SequenceInfoTableName);

            // Insert the new row
            var dataRow = seqi.NewRow();
            dataRow.SetValue(0, DataObject.Number(uniqueId));
            dataRow.SetValue(1, DataObject.VarChar(sequenceName.Parent.FullName));
            dataRow.SetValue(2, DataObject.VarChar(sequenceName.Name));
            dataRow.SetValue(3, DataObject.BigInt(2));
            seqi.AddRow(dataRow);

            // Insert into the SEQUENCE table.
            dataRow = seq.NewRow();
            dataRow.SetValue(0, DataObject.Number(uniqueId));
            dataRow.SetValue(1, DataObject.Number(sequenceInfo.StartValue));
            dataRow.SetValue(2, DataObject.Number(sequenceInfo.Increment));
            dataRow.SetValue(3, DataObject.Number(sequenceInfo.MinValue));
            dataRow.SetValue(4, DataObject.Number(sequenceInfo.MaxValue));
            dataRow.SetValue(5, DataObject.Number(sequenceInfo.StartValue));
            dataRow.SetValue(6, DataObject.BigInt(sequenceInfo.Cache));
            dataRow.SetValue(7, DataObject.Boolean(sequenceInfo.Cycle));
            seq.AddRow(dataRow);

            return new Sequence(this, uniqueId, sequenceInfo);
        }
        public ISequence GetSequence(ObjectName sequenceName)
        {
            // Is the generator already in the cache?
            Sequence sequence;

            if (!sequenceKeyMap.TryGetValue(sequenceName, out sequence)) {
                // This sequence generator is not in the cache so we need to query the
                // sequence table for this.
                var seqi = Transaction.GetTable(SystemSchema.SequenceInfoTableName);

                var schemaVal = DataObject.VarChar(sequenceName.Parent.FullName);
                var nameVal = DataObject.VarChar(sequenceName.Name);
                var list = seqi.SelectRowsEqual(2, nameVal, 1, schemaVal).ToList();

                if (list.Count == 0) {
                    throw new ArgumentException(String.Format("Sequence '{0}' not found.", sequenceName));
                } else if (list.Count() > 1) {
                    throw new Exception("Assert failed: multiple sequence keys with same name.");
                }

                int rowIndex = list.First();
                var sid = seqi.GetValue(rowIndex, 0);
                var sschema = seqi.GetValue(rowIndex, 1);
                var sname = seqi.GetValue(rowIndex, 2);
                var stype = seqi.GetValue(rowIndex, 3);

                // Is this a custom sequence generator?
                // (stype == 1) == true
                if (stype.IsEqualTo(OneValue)) {
                    // Native generator.
                    sequence = new Sequence(this, (SqlNumber) sid.Value, SequenceInfo.Native(sequenceName));
                } else {
                    // Query the sequence table.
                    var seq = Transaction.GetTable(SystemSchema.SequenceTableName);

                    list = seq.SelectRowsEqual(0, sid).ToList();

                    if (!list.Any())
                        throw new Exception("Sequence table does not contain sequence information.");
                    if (list.Count() > 1)
                        throw new Exception("Sequence table contains multiple generators for id.");

                    rowIndex = list.First();
                    var lastValue = (SqlNumber) seq.GetValue(rowIndex, 1).Value;
                    var increment = (SqlNumber) seq.GetValue(rowIndex, 2).Value;
                    var minvalue = (SqlNumber) seq.GetValue(rowIndex, 3).Value;
                    var maxvalue = (SqlNumber) seq.GetValue(rowIndex, 4).Value;
                    var start = (SqlNumber) seq.GetValue(rowIndex, 5).Value;
                    var cache = (long) seq.GetValue(rowIndex, 6).AsBigInt();
                    bool cycle = seq.GetValue(rowIndex, 7).AsBoolean();

                    var info = new SequenceInfo(sequenceName, start, increment, minvalue, maxvalue, cache, cycle);
                    sequence = new Sequence(this, (SqlNumber) sid.Value, lastValue, info);

                    // Put the generator in the cache
                    sequenceKeyMap[sequenceName] = sequence;
                }

            }

            // Return the generator
            return sequence;
        }
        public ISequence CreateSequence(SequenceInfo sequenceInfo)
        {
            if (sequenceInfo == null)
                throw new ArgumentNullException("sequenceInfo");

            var sequenceName = sequenceInfo.SequenceName;

            // If the Sequence or SequenceInfo tables don't exist then
            // We can't add or remove native tables
            if (sequenceName.Equals(SystemSchema.SequenceTableName) ||
                sequenceName.Equals(SystemSchema.SequenceInfoTableName) ||
                !Transaction.TableExists(SystemSchema.SequenceTableName) ||
                !Transaction.TableExists(SystemSchema.SequenceInfoTableName)) {
                return null;
            }

            if (sequenceInfo.Type == SequenceType.Native)
                return CreateNativeTableSequence(sequenceName);

            return CreateCustomSequence(sequenceName, sequenceInfo);
        }
            protected override void ExecuteStatement(ExecutionContext context)
            {
                if (!context.Request.Query.UserCanCreateObject(DbObjectType.Sequence, SequenceName))
                    throw new MissingPrivilegesException(context.Request.Query.UserName(), SequenceName, Privileges.Create);

                if (context.Request.Query.ObjectExists(DbObjectType.Sequence, SequenceName))
                    throw new InvalidOperationException(String.Format("The sequence '{0}' already exists.", SequenceName));

                var startValue = SqlNumber.Zero;
                var incrementBy = SqlNumber.One;
                var minValue = SqlNumber.Zero;
                var maxValue = new SqlNumber(Int64.MaxValue);
                var cache = 16;
                var cycle = Cycle;

                if (StartWith != null)
                    startValue = (SqlNumber) StartWith.EvaluateToConstant(context.Request, null).AsBigInt().Value;
                if (IncrementBy != null)
                    incrementBy = (SqlNumber) IncrementBy.EvaluateToConstant(context.Request, null).AsBigInt().Value;
                if (MinValue != null)
                    minValue = (SqlNumber) MinValue.EvaluateToConstant(context.Request, null).AsBigInt().Value;
                if (MaxValue != null)
                    maxValue = (SqlNumber) MaxValue.EvaluateToConstant(context.Request, null).AsBigInt().Value;

                if (minValue >= maxValue)
                    throw new InvalidOperationException("The minimum value cannot be more than the maximum.");
                if (startValue < minValue ||
                    startValue >= maxValue)
                    throw new InvalidOperationException("The start value cannot be out of the mim/max range.");

                var seqInfo = new SequenceInfo(SequenceName, startValue, incrementBy, minValue, maxValue, cache, cycle);
                context.Request.Query.CreateObject(seqInfo);
            }