예제 #1
0
        private void WriteRevisionsBlittable(DocumentsOperationContext context, IEnumerable <Document> documentsToWrite, out long numberOfResults)
        {
            numberOfResults = 0;
            HttpContext.Response.Headers["Content-Type"] = "binary/blittable-json";

            using (var streamBuffer = new UnmanagedStreamBuffer(context, ResponseBodyStream()))
                using (var writer = new ManualBlittableJsonDocumentBuilder <UnmanagedStreamBuffer>(context,
                                                                                                   null, new BlittableWriter <UnmanagedStreamBuffer>(context, streamBuffer)))
                {
                    writer.StartWriteObjectDocument();

                    writer.StartWriteObject();
                    writer.WritePropertyName(nameof(GetDocumentsResult.Results));

                    writer.StartWriteArray();
                    foreach (var document in documentsToWrite)
                    {
                        numberOfResults++;
                        writer.WriteEmbeddedBlittableDocument(document.Data);
                    }
                    writer.WriteArrayEnd();

                    writer.WriteObjectEnd();

                    writer.FinalizeDocument();
                }
        }
예제 #2
0
        public void Equals_when_creating_blittable_in_different_ways()
        {
            using (var ctx = JsonOperationContext.ShortTermSingleUse())
            {
                using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(ctx))
                    using (var embeddedBuilder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(ctx))
                    {
                        builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None);
                        embeddedBuilder.Reset(BlittableJsonDocumentBuilder.UsageMode.None);

                        embeddedBuilder.StartWriteObjectDocument();
                        embeddedBuilder.StartWriteObject();

                        embeddedBuilder.WritePropertyName("Name");
                        embeddedBuilder.WriteValue("Hibernating Rhinos");
                        embeddedBuilder.WritePropertyName("Type");
                        embeddedBuilder.WriteValue("LTD");

                        embeddedBuilder.WriteObjectEnd();
                        embeddedBuilder.FinalizeDocument();
                        var embeddedCompany = embeddedBuilder.CreateReader();

                        builder.StartWriteObjectDocument();
                        builder.StartWriteObject();

                        builder.WritePropertyName("Company");
                        builder.WriteEmbeddedBlittableDocument(embeddedCompany);
                        builder.WritePropertyName("Street");
                        builder.WriteValue("Hanasi 21");
                        builder.WritePropertyName("City");
                        builder.WriteValue("Hadera");

                        builder.WriteObjectEnd();
                        builder.FinalizeDocument();
                        var blittable1 = builder.CreateReader();

                        var json2 = new DynamicJsonValue()
                        {
                            ["Company"] = new DynamicJsonValue()
                            {
                                ["Name"] = "Hibernating Rhinos",
                                ["Type"] = "LTD",
                            },
                            ["Street"] = "Hanasi 21",
                            ["City"]   = "Hadera",
                        };

                        using (var blittable2 = ctx.ReadObject(json2, "foo"))
                        {
                            Assert.Equal(blittable1, blittable2);
                            Assert.Equal(blittable1.GetHashCode(), blittable2.GetHashCode());

                            blittable1.TryGet("Company", out BlittableJsonReaderObject ob1);
                            blittable2.TryGet("Company", out BlittableJsonReaderObject ob2);

                            Assert.Equal(ob1, ob2);
                        }
                    }
            }
        }
예제 #3
0
        public override void WriteValue(object value)
        {
            switch (value)
            {
            case BlittableJsonReaderObject readerObject:
                if (false == readerObject.HasParent)
                {
                    _manualBlittableJsonDocumentBuilder.WriteEmbeddedBlittableDocument(readerObject);
                }
                else
                {
                    using (var clonedBlittable = readerObject.CloneOnTheSameContext())
                    {
                        _manualBlittableJsonDocumentBuilder.WriteEmbeddedBlittableDocument(clonedBlittable);
                    }
                }
                return;

            case LazyStringValue lazyStringValue:
                _manualBlittableJsonDocumentBuilder.WriteValue(lazyStringValue);
                return;
            }
            base.WriteValue(value);
        }
예제 #4
0
        public void Equals_blittables_created_manually()
        {
            using (var ctx = JsonOperationContext.ShortTermSingleUse())
            {
                BlittableJsonReaderObject CreateBlittable()
                {
                    using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(ctx))
                        using (var officeBuilder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(ctx))
                            using (var companyBuilder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(ctx))
                            {
                                builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None);
                                officeBuilder.Reset(BlittableJsonDocumentBuilder.UsageMode.None);
                                companyBuilder.Reset(BlittableJsonDocumentBuilder.UsageMode.None);

                                companyBuilder.StartWriteObjectDocument();
                                companyBuilder.StartWriteObject();

                                companyBuilder.WritePropertyName("Name");
                                companyBuilder.WriteValue("Hibernating Rhinos");
                                companyBuilder.WritePropertyName("Type");
                                companyBuilder.WriteValue("LTD");

                                companyBuilder.WriteObjectEnd();
                                companyBuilder.FinalizeDocument();
                                var embeddedCompany = companyBuilder.CreateReader();

                                officeBuilder.StartWriteObjectDocument();
                                officeBuilder.StartWriteObject();

                                officeBuilder.WritePropertyName("Company");
                                officeBuilder.WriteEmbeddedBlittableDocument(embeddedCompany);
                                officeBuilder.WritePropertyName("Street");
                                officeBuilder.WriteValue("Hanasi 21");
                                officeBuilder.WritePropertyName("City");
                                officeBuilder.WriteValue("Hadera");

                                officeBuilder.WriteObjectEnd();
                                officeBuilder.FinalizeDocument();

                                var embeddedOffice = officeBuilder.CreateReader();

                                builder.StartWriteObjectDocument();
                                builder.StartWriteObject();

                                builder.WritePropertyName("Office");
                                builder.WriteEmbeddedBlittableDocument(embeddedOffice);

                                builder.WriteObjectEnd();
                                builder.FinalizeDocument();

                                return(builder.CreateReader());
                            }
                }

                using (var blittable1 = CreateBlittable())
                    using (var blittable2 = CreateBlittable())
                    {
                        Assert.Equal(blittable1, blittable2);
                        Assert.Equal(blittable1.GetHashCode(), blittable2.GetHashCode());

                        blittable1.TryGet("Office", out BlittableJsonReaderObject ob1);
                        blittable2.TryGet("Office", out BlittableJsonReaderObject ob2);

                        Assert.Equal(ob1.GetHashCode(), ob2.GetHashCode());
                        Assert.Equal(ob1, ob2);
                    }
            }
        }
예제 #5
0
        public unsafe void ReadDataTypesTest()
        {
            using (var context = new JsonOperationContext(1024, 1024 * 4, SharedMultipleUseFlag.None))
            {
                BlittableJsonReaderObject embeddedReader;
                using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(context))
                {
                    builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None);
                    builder.StartWriteObjectDocument();
                    builder.StartWriteObject();
                    builder.WritePropertyName("Value");
                    builder.WriteValue(1000);
                    builder.WriteObjectEnd();
                    builder.FinalizeDocument();
                    embeddedReader = builder.CreateReader();
                }

                using (var builder = new ManualBlittableJsonDocumentBuilder <UnmanagedWriteBuffer>(context))
                {
                    var lonEscapedCharsString             = string.Join(",", Enumerable.Repeat("\"Cool\"", 200).ToArray());
                    var longEscapedCharsAndNonAsciiString = string.Join(",", Enumerable.Repeat("\"מגניב\"", 200).ToArray());

                    builder.Reset(BlittableJsonDocumentBuilder.UsageMode.None);

                    builder.StartWriteObjectDocument();
                    builder.StartWriteObject();

                    builder.WritePropertyName("FloatMin");
                    builder.WriteValue(float.MinValue);

                    builder.WritePropertyName("FloatMax");
                    builder.WriteValue(float.MaxValue);

                    builder.WritePropertyName("UshortMin");
                    builder.WriteValue(ushort.MinValue);

                    builder.WritePropertyName("UshortMax");
                    builder.WriteValue(ushort.MaxValue);

                    builder.WritePropertyName("UintMin");
                    builder.WriteValue(uint.MinValue);

                    builder.WritePropertyName("UintMax");
                    builder.WriteValue(uint.MaxValue);

                    builder.WritePropertyName("DoubleMin");
                    builder.WriteValue(double.MinValue);

                    builder.WritePropertyName("DoubleMax");
                    builder.WriteValue(double.MaxValue);

                    builder.WritePropertyName("LongMin");
                    builder.WriteValue(long.MinValue);

                    builder.WritePropertyName("LongMax");
                    builder.WriteValue(long.MaxValue);

                    builder.WritePropertyName("StringEmpty");
                    builder.WriteValue(string.Empty);

                    builder.WritePropertyName("StringSimple");
                    builder.WriteValue("StringSimple");

                    builder.WritePropertyName("StringEscapedChars");
                    builder.WriteValue("\"Cool\"");

                    builder.WritePropertyName("StringLongEscapedChars");
                    builder.WriteValue(lonEscapedCharsString);

                    builder.WritePropertyName("StringEscapedCharsAndNonAscii");
                    builder.WriteValue(longEscapedCharsAndNonAsciiString);


                    var lsvString      = "\"fooאbar\"";
                    var lsvStringBytes = Encoding.UTF8.GetBytes(lsvString);
                    fixed(byte *b = lsvStringBytes)
                    {
                        var escapePositionsMaxSize = JsonParserState.FindEscapePositionsMaxSize(lsvString);
                        var lsv             = context.AllocateStringValue(null, b, lsvStringBytes.Length);
                        var escapePositions = new FastList <int>();
                        var len             = lsvStringBytes.Length;

                        JsonParserState.FindEscapePositionsIn(escapePositions, b, ref len, escapePositionsMaxSize);
                        lsv.EscapePositions = escapePositions.ToArray();

                        builder.WritePropertyName("LSVString");
                        builder.WriteValue(lsv);
                    }

                    builder.WritePropertyName("Embedded");
                    builder.WriteEmbeddedBlittableDocument(embeddedReader);

                    builder.WriteObjectEnd();
                    builder.FinalizeDocument();

                    var reader = builder.CreateReader();
                    reader.BlittableValidation();

                    Assert.Equal(17, reader.Count);
                    Assert.Equal(float.MinValue, float.Parse(reader["FloatMin"].ToString(), CultureInfo.InvariantCulture));
                    Assert.Equal(float.MaxValue, float.Parse(reader["FloatMax"].ToString(), CultureInfo.InvariantCulture));
                    Assert.Equal(ushort.MinValue, ushort.Parse(reader["UshortMin"].ToString(), CultureInfo.InvariantCulture));
                    Assert.Equal(ushort.MaxValue, ushort.Parse(reader["UshortMax"].ToString(), CultureInfo.InvariantCulture));
                    Assert.Equal(uint.MinValue, uint.Parse(reader["UintMin"].ToString(), CultureInfo.InvariantCulture));
                    Assert.Equal(uint.MaxValue, uint.Parse(reader["UintMax"].ToString(), CultureInfo.InvariantCulture));
                    Assert.Equal(double.MinValue, double.Parse(reader["DoubleMin"].ToString(), CultureInfo.InvariantCulture));
                    Assert.Equal(double.MaxValue, double.Parse(reader["DoubleMax"].ToString(), CultureInfo.InvariantCulture));
                    Assert.Equal(long.MinValue, long.Parse(reader["LongMin"].ToString(), CultureInfo.InvariantCulture));
                    Assert.Equal(long.MaxValue, long.Parse(reader["LongMax"].ToString(), CultureInfo.InvariantCulture));
                    Assert.Equal(string.Empty, reader["StringEmpty"].ToString());
                    Assert.Equal("StringSimple", reader["StringSimple"].ToString());
                    Assert.Equal("\"Cool\"", reader["StringEscapedChars"].ToString());
                    Assert.Equal(lonEscapedCharsString, reader["StringLongEscapedChars"].ToString());
                    Assert.Equal(longEscapedCharsAndNonAsciiString, reader["StringEscapedCharsAndNonAscii"].ToString());
                    Assert.Equal(lsvString, reader["LSVString"].ToString());
                    Assert.Equal(1000, int.Parse((reader["Embedded"] as BlittableJsonReaderObject)["Value"].ToString(), CultureInfo.InvariantCulture));
                }
            }
        }