public override unsafe void Write(Slice changeVector, Stream stream, byte[] tempBuffer, OutgoingReplicationStatsScope stats)
        {
            fixed(byte *pTemp = tempBuffer)
            {
                if (AssertChangeVectorSize() > tempBuffer.Length)
                {
                    ThrowTooManyChangeVectorEntries(this, Id);
                }

                var tempBufferPos = WriteCommon(changeVector, pTemp);

                *(int *)(pTemp + tempBufferPos) = Id.Size;
                tempBufferPos += sizeof(int);
                Memory.Copy(pTemp + tempBufferPos, Id.Buffer, Id.Size);
                tempBufferPos += Id.Size;

                *(int *)(pTemp + tempBufferPos) = Collection.Size;
                tempBufferPos += sizeof(int);
                Memory.Copy(pTemp + tempBufferPos, Collection.Buffer, Collection.Size);
                tempBufferPos += Collection.Size;

                *(int *)(pTemp + tempBufferPos) = Values.Size;
                tempBufferPos += sizeof(int);

                Memory.Copy(pTemp + tempBufferPos, Values.BasePointer, Values.Size);
                tempBufferPos += Values.Size;

                stream.Write(tempBuffer, 0, tempBufferPos);

                Values.TryGet(CountersStorage.Values, out BlittableJsonReaderObject counters);
                stats.RecordCountersOutput(counters?.Count ?? 0);
            }
        }
Example #2
0
 public abstract void Write(Slice changeVector, Stream stream, byte[] tempBuffer, OutgoingReplicationStatsScope stats);
        public override unsafe void Write(Slice changeVector, Stream stream, byte[] tempBuffer, OutgoingReplicationStatsScope stats)
        {
            fixed(byte *pTemp = tempBuffer)
            {
                if (AssertChangeVectorSize() > tempBuffer.Length)
                {
                    ThrowTooManyChangeVectorEntries(this, Key.ToString());
                }

                var tempBufferPos = WriteCommon(changeVector, pTemp);

                *(long *)(pTemp + tempBufferPos) = LastModifiedTicks;
                tempBufferPos += sizeof(long);

                *(int *)(pTemp + tempBufferPos) = Key.Size;
                tempBufferPos += sizeof(int);

                Memory.Copy(pTemp + tempBufferPos, Key.Content.Ptr, Key.Size);
                tempBufferPos += Key.Size;

                stream.Write(tempBuffer, 0, tempBufferPos);

                stats.RecordAttachmentTombstoneOutput();
            }
        }
        public override unsafe void Write(Slice changeVector, Stream stream, byte[] tempBuffer, OutgoingReplicationStatsScope stats)
        {
            fixed(byte *pTemp = tempBuffer)
            {
                if (AssertChangeVectorSize() > tempBuffer.Length)
                {
                    ThrowTooManyChangeVectorEntries(this, Key.ToString());
                }

                var tempBufferPos = WriteCommon(changeVector, pTemp);

                *(int *)(pTemp + tempBufferPos) = Key.Size;
                tempBufferPos += sizeof(int);
                Memory.Copy(pTemp + tempBufferPos, Key.Content.Ptr, Key.Size);
                tempBufferPos += Key.Size;

                *(int *)(pTemp + tempBufferPos) = Segment.NumberOfBytes;
                tempBufferPos += sizeof(int);
                Memory.Copy(pTemp + tempBufferPos, Segment.Ptr, Segment.NumberOfBytes);
                tempBufferPos += Segment.NumberOfBytes;

                *(int *)(pTemp + tempBufferPos) = Collection.Size;
                tempBufferPos += sizeof(int);
                Memory.Copy(pTemp + tempBufferPos, Collection.Buffer, Collection.Size);
                tempBufferPos += Collection.Size;

                *(int *)(pTemp + tempBufferPos) = Name.Size;
                tempBufferPos += sizeof(int);
                Memory.Copy(pTemp + tempBufferPos, Name.Buffer, Name.Size);
                tempBufferPos += Name.Size;

                stream.Write(tempBuffer, 0, tempBufferPos);

                stats.RecordTimeSeriesOutput(Segment.NumberOfBytes);
            }
        }
        public override unsafe void Write(Slice changeVector, Stream stream, byte[] tempBuffer, OutgoingReplicationStatsScope stats)
        {
            fixed(byte *pTemp = tempBuffer)
            {
                if (AssertChangeVectorSize() > tempBuffer.Length)
                {
                    ThrowTooManyChangeVectorEntries(this, Key.ToString());
                }

                var tempBufferPos = WriteCommon(changeVector, pTemp);

                *(int *)(pTemp + tempBufferPos) = Key.Size;
                tempBufferPos += sizeof(int);
                Memory.Copy(pTemp + tempBufferPos, Key.Content.Ptr, Key.Size);
                tempBufferPos += Key.Size;

                *(int *)(pTemp + tempBufferPos) = Name.Size;
                tempBufferPos += sizeof(int);
                Memory.Copy(pTemp + tempBufferPos, Name.Buffer, Name.Size);
                tempBufferPos += Name.Size;

                *(int *)(pTemp + tempBufferPos) = ContentType.Size;
                tempBufferPos += sizeof(int);
                Memory.Copy(pTemp + tempBufferPos, ContentType.Buffer, ContentType.Size);
                tempBufferPos += ContentType.Size;

                pTemp[tempBufferPos++] = (byte)Base64Hash.Size;
                Base64Hash.CopyTo(pTemp + tempBufferPos);
                tempBufferPos += Base64Hash.Size;

                stream.Write(tempBuffer, 0, tempBufferPos);
            }
        }
Example #6
0
        public override unsafe void Write(Slice changeVector, Stream stream, byte[] tempBuffer, OutgoingReplicationStatsScope stats)
        {
            fixed(byte *pTemp = tempBuffer)
            {
                if (AssertChangeVectorSize() > tempBuffer.Length)
                {
                    ThrowTooManyChangeVectorEntries(this, Id);
                }

                var tempBufferPos = WriteCommon(changeVector, pTemp);

                *(long *)(pTemp + tempBufferPos) = LastModifiedTicks;
                tempBufferPos += sizeof(long);

                *(DocumentFlags *)(pTemp + tempBufferPos) = Flags;
                tempBufferPos += sizeof(DocumentFlags);

                *(int *)(pTemp + tempBufferPos) = Id.Size;
                tempBufferPos += sizeof(int);

                Memory.Copy(pTemp + tempBufferPos, Id.Buffer, Id.Size);
                tempBufferPos += Id.Size;

                if (Data != null)
                {
                    *(int *)(pTemp + tempBufferPos) = Data.Size;
                    tempBufferPos += sizeof(int);

                    var docReadPos = 0;
                    while (docReadPos < Data.Size)
                    {
                        var sizeToCopy = Math.Min(Data.Size - docReadPos, tempBuffer.Length - tempBufferPos);
                        if (sizeToCopy == 0) // buffer is full, need to flush it
                        {
                            stream.Write(tempBuffer, 0, tempBufferPos);
                            tempBufferPos = 0;
                            continue;
                        }
                        Memory.Copy(pTemp + tempBufferPos, Data.BasePointer + docReadPos, sizeToCopy);
                        tempBufferPos += sizeToCopy;
                        docReadPos    += sizeToCopy;
                    }

                    stats.RecordDocumentOutput(Data.Size);
                }
                else
                {
                    int dataSize;
                    if (Type == ReplicationItemType.DocumentTombstone)
                    {
                        dataSize = -1;
                    }
                    else if ((Flags & DocumentFlags.DeleteRevision) == DocumentFlags.DeleteRevision)
                    {
                        dataSize = -2;
                    }
                    else
                    {
                        throw new InvalidDataException("Cannot write document with empty data.");
                    }
                    *(int *)(pTemp + tempBufferPos) = dataSize;
                    tempBufferPos += sizeof(int);

                    if (Collection == null) //precaution
                    {
                        throw new InvalidDataException("Cannot write item with empty collection name...");
                    }

                    *(int *)(pTemp + tempBufferPos) = Collection.Size;
                    tempBufferPos += sizeof(int);
                    Memory.Copy(pTemp + tempBufferPos, Collection.Buffer, Collection.Size);
                    tempBufferPos += Collection.Size;

                    stats.RecordDocumentTombstoneOutput();
                }

                stream.Write(tempBuffer, 0, tempBufferPos);
            }
        }