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