예제 #1
0
 public SqlBuffer()
 {
     this.currentBuffer = new IndexedBuffer();
     this.innerBuffers  = new List <IndexedBuffer>()
     {
         this.currentBuffer
     };
 }
예제 #2
0
        public void Push(int batchIndex)
        {
            this.bufferStack.Push(batchIndex);

            if (batchIndex >= 0)
            {
                this.ReserveBuffer(batchIndex);
                this.currentBuffer = this.innerBuffers[batchIndex] ??= new IndexedBuffer();
            }
        }
예제 #3
0
        private IEnumerable <ISqlContent> Read(IndexedBuffer buffer, ISqlOptions options)
        {
            if (options == null || (options.MaxParameters <= 0 && options.MaxSql <= 0) || (options.MaxParameters >= this.Parameters.Count && options.MaxSql >= this.Text.Length))
            {
                yield return(this.ReadToEnd());

                yield break;
            }

            int yieldedParams   = 0;
            int yieldedBindings = 0;
            int yieldedText     = 0;

            int maxSql    = options.MaxSql <= 0 ? int.MaxValue : options.MaxSql;
            int maxParams = options.MaxParameters <= 0 ? int.MaxValue : options.MaxParameters;

            SqlOffset[] offsets = buffer.Offsets.Concat(new[] { this.GetCurrentOffset() }).ToArray();

            for (int i = 0; i < offsets.Length - 1; i++)
            {
                SqlOffset offset     = offsets[i];
                SqlOffset nextOffset = offsets[i + 1];

                if (nextOffset.NumberOfParams - yieldedParams > maxParams || nextOffset.Text - yieldedText > maxSql)
                {
                    yield return(new SqlContent()
                    {
                        Bindings = buffer.Bindings.Skip(yieldedBindings).Take(offset.NumberOfBindings - yieldedBindings),
                        Parameters = buffer.Parameters.Skip(yieldedParams).Take(offset.NumberOfParams - yieldedParams),
                        Text = buffer.Text.ToString(yieldedText, offset.Text - yieldedText),
                    });

                    yieldedParams   += offset.NumberOfParams - yieldedParams;
                    yieldedText     += offset.Text - yieldedText;
                    yieldedBindings += offset.NumberOfBindings - yieldedBindings;
                }
            }

            if (yieldedParams < buffer.Parameters.Count || yieldedText < buffer.Text.Length || yieldedBindings < buffer.Bindings.Count)
            {
                string newText = buffer.Text.ToString(yieldedText, buffer.Text.Length - yieldedText);

                if (!string.IsNullOrWhiteSpace(newText))
                {
                    yield return(new SqlContent()
                    {
                        Bindings = buffer.Bindings.Skip(yieldedBindings),
                        Parameters = buffer.Parameters.Skip(yieldedParams),
                        Text = newText,
                    });
                }
            }
        }
예제 #4
0
        public void Pop()
        {
            if (this.bufferStack.Count > 0)
            {
                int batchIndex = this.bufferStack.Pop();

                if (batchIndex >= 0)
                {
                    if (this.bufferStack.Count > 0)
                    {
                        this.currentBuffer = this.innerBuffers[this.bufferStack.Peek()];
                    }
                    else
                    {
                        this.currentBuffer = this.innerBuffers[0];
                    }
                }
            }
        }
            public IndexedBuffer GetNext()
            {
                var indexedBuffer = new IndexedBuffer(count++);

                return(indexedBuffer);
            }