Пример #1
0
        public static Slice[] Convert(SliceWriter writer, [NotNull, ItemNotNull] IEnumerable <TValue> values, Handler handler, TState state)
        {
            Contract.Requires(values != null && handler != null);

            //Note on performance:
            // - we will reuse the same buffer for each temp key, and copy them into a slice buffer
            // - doing it this way adds a memory copy (writer => buffer) but reduce the number of byte[] allocations (and reduce the GC overhead)

            int start = writer.Position;

            var buffer = new SliceBuffer();

            var coll = values as ICollection <TValue>;

            if (coll != null)
            {             // pre-allocate the final array with the correct size
                var res = new Slice[coll.Count];
                int p   = 0;
                foreach (var tuple in coll)
                {
                    // reset position to just after the subspace prefix
                    writer.Position = start;

                    handler(ref writer, tuple, state);

                    // copy full key in the buffer
                    res[p++] = buffer.Intern(writer.ToSlice());
                }
                Contract.Assert(p == res.Length);
                return(res);
            }
            else
            {             // we won't now the array size until the end...
                var res = new List <Slice>();
                foreach (var tuple in values)
                {
                    // reset position to just after the subspace prefix
                    writer.Position = start;

                    handler(ref writer, tuple, state);

                    // copy full key in the buffer
                    res.Add(buffer.Intern(writer.ToSlice()));
                }
                return(res.ToArray());
            }
        }
Пример #2
0
        public void Dispose()
        {
            if (m_disposed)
            {
                //TODO: locking ?
                m_disposed = true;

                //TODO!
                m_buffer         = null;
                m_readConflicts  = null;
                m_writeConflicts = null;
                m_clears         = null;
                m_writes         = null;
            }

            GC.SuppressFinalize(this);
        }
Пример #3
0
        private void Initialize(bool first)
        {
            if (m_disposed)
            {
                ThrowDisposed();
            }

            lock (m_lock)
            {
                m_readVersion = null;
                if (first)
                {
                    m_committedVersion = -1;                        // note: current fdb_c client does not reset commited version to -1 when calling fdb_transaction_reset()
                }
                m_buffer = new SliceBuffer(InitialBufferSize);
                if (first)
                {
                    m_clears         = new ColaRangeSet <Slice>(SliceComparer.Default);
                    m_writes         = new ColaOrderedDictionary <Slice, WriteCommand[]>(SliceComparer.Default);
                    m_readConflicts  = new ColaRangeSet <Slice>(SliceComparer.Default);
                    m_writeConflicts = new ColaRangeSet <Slice>(SliceComparer.Default);
                }
                else
                {
                    m_clears.Clear();
                    m_writes.Clear();
                    m_readConflicts.Clear();
                    m_writeConflicts.Clear();
                }

                m_retryCount          = 0;
                this.AccessSystemKeys = NO_ACCESS;
                this.NextWriteNoWriteConflictRange = false;
                this.ReadYourWritesDisable         = false;
            }
        }