public override void Flush()
        {
            FLError err;

            Result = NativeRaw.FLEncoder_Finish(_encoder, &err);
            if (Result.buf == null)
            {
                throw new LiteCoreException(new C4Error(err));
            }
        }
        internal void AddPersonInState(string docID, string state, string firstName = null)
        {
            LiteCoreBridge.Check(err => Native.c4db_beginTransaction(Db, err));
            C4Error error;
            var     enc = Native.c4db_getSharedFleeceEncoder(Db);

            try {
                Native.FLEncoder_BeginDict(enc, 3);
                Native.FLEncoder_WriteKey(enc, "custom");
                Native.FLEncoder_WriteBool(enc, true);
                if (!string.IsNullOrEmpty(firstName))
                {
                    Native.FLEncoder_WriteKey(enc, "name");
                    Native.FLEncoder_BeginDict(enc, 2);
                    Native.FLEncoder_WriteKey(enc, "first");
                    Native.FLEncoder_WriteString(enc, firstName);
                    Native.FLEncoder_WriteKey(enc, "last");
                    Native.FLEncoder_WriteString(enc, "lastname");
                    Native.FLEncoder_EndDict(enc);
                }

                Native.FLEncoder_WriteKey(enc, "contact");
                Native.FLEncoder_BeginDict(enc, 1);
                Native.FLEncoder_WriteKey(enc, "address");
                Native.FLEncoder_BeginDict(enc, 1);
                Native.FLEncoder_WriteKey(enc, "state");
                Native.FLEncoder_WriteString(enc, state);
                Native.FLEncoder_EndDict(enc);
                Native.FLEncoder_EndDict(enc);
                Native.FLEncoder_EndDict(enc);

                // Save document:
                FLSliceResult body = NativeRaw.FLEncoder_Finish(enc, null);
                //REQUIRE(body.buf);
                using (var docID_ = new C4String(docID)){
                    var rq = new C4DocPutRequest {
                        allowConflict = false,
                        docID         = docID_.AsFLSlice(),
                        allocedBody   = body,
                        save          = true
                    };

                    C4Document *doc;
                    doc = Native.c4doc_put(Db, &rq, null, &error);
                    ((long)doc).Should().NotBe(0, "because otherwise the put failed");
                    Native.c4doc_release(doc);
                    Native.FLSliceResult_Release(body);
                }
            } finally {
                LiteCoreBridge.Check(err => Native.c4db_endTransaction(Db, true, err));
            }
        }
Ejemplo n.º 3
0
        public unsafe void TestReadOnlyDictionary()
        {
            var now         = DateTimeOffset.UtcNow;
            var nestedArray = new[] { 1L, 2L, 3L };
            var nestedDict  = new Dictionary <string, object> {
                ["foo"] = "bar"
            };
            var masterData = new Dictionary <string, object>
            {
                ["date"]  = now,
                ["array"] = nestedArray,
                ["dict"]  = nestedDict
            };

            var flData = new FLSliceResult();

            Db.InBatch(() =>
            {
                flData = masterData.FLEncode();
            });

            try {
                var context = new DocContext(Db, null);
                using (var mRoot = new MRoot(context)) {
                    mRoot.Context.Should().BeSameAs(context);
                    FLDoc *fleeceDoc = Native.FLDoc_FromResultData(flData,
                                                                   FLTrust.Trusted,
                                                                   Native.c4db_getFLSharedKeys(Db.c4db), FLSlice.Null);
                    var flValue          = Native.FLDoc_GetRoot(fleeceDoc);
                    var mDict            = new MDict(new MValue(flValue), mRoot);
                    var deserializedDict = new DictionaryObject(mDict, false);

                    deserializedDict["bogus"].Blob.Should().BeNull();
                    deserializedDict["date"].Date.Should().Be(now);
                    deserializedDict.GetDate("bogus").Should().Be(DateTimeOffset.MinValue);
                    deserializedDict.GetArray("array").Should().Equal(1L, 2L, 3L);
                    deserializedDict.GetArray("bogus").Should().BeNull();
                    deserializedDict.GetDictionary("dict").Should().BeEquivalentTo(nestedDict);
                    deserializedDict.GetDictionary("bogus").Should().BeNull();

                    var dict = deserializedDict.ToDictionary();
                    dict["array"].As <IList>().Should().Equal(1L, 2L, 3L);
                    dict["dict"].As <IDictionary <string, object> >().Should().BeEquivalentTo(nestedDict);
                    var isContain = mDict.Contains("");
                    isContain.Should().BeFalse();
                    Native.FLDoc_Release(fleeceDoc);
                }
            } finally {
                Native.FLSliceResult_Release(flData);
            }
        }
Ejemplo n.º 4
0
        public unsafe void TestReadOnlyArray()
        {
            var now         = DateTimeOffset.UtcNow;
            var nestedArray = new[] { 1L, 2L, 3L };
            var nestedDict  = new Dictionary <string, object> {
                ["foo"] = "bar"
            };
            var masterData = new object[] { 1, "str", nestedArray, now, nestedDict };

            var flData = new FLSliceResult();

            Db.InBatch(() =>
            {
                flData = masterData.FLEncode();
            });

            try {
                var context = new DocContext(Db, null);
                using (var mRoot = new MRoot(context)) {
                    mRoot.Context.Should().BeSameAs(context);
                    FLDoc *fleeceDoc = Native.FLDoc_FromResultData(flData,
                                                                   FLTrust.Trusted,
                                                                   Native.c4db_getFLSharedKeys(Db.c4db), FLSlice.Null);
                    var flValue           = Native.FLDoc_GetRoot(fleeceDoc);
                    var mArr              = new FleeceMutableArray(new MValue(flValue), mRoot);
                    var deserializedArray = new ArrayObject(mArr, false);
                    deserializedArray.GetArray(2).Should().Equal(1L, 2L, 3L);
                    deserializedArray.GetArray(3).Should().BeNull();
                    deserializedArray.GetBlob(1).Should().BeNull();
                    deserializedArray.GetDate(3).Should().Be(now);
                    deserializedArray.GetDate(4).Should().Be(DateTimeOffset.MinValue);
                    deserializedArray[1].ToString().Should().Be("str");
                    deserializedArray.GetString(2).Should().BeNull();
                    deserializedArray.GetDictionary(4).Should().BeEquivalentTo(nestedDict);
                    deserializedArray[0].Dictionary.Should().BeNull();

                    var list = deserializedArray.ToList();
                    list[2].Should().BeAssignableTo <IList <object> >();
                    list[4].Should().BeAssignableTo <IDictionary <string, object> >();

                    var mVal = new MValue();
                    mVal.Dispose();
                    Native.FLDoc_Release(fleeceDoc);
                }
            } finally {
                Native.FLSliceResult_Release(flData);
            }

            var mroot = new MRoot();
        }
Ejemplo n.º 5
0
        public override MutableDocument ToMutable() => new MutableDocument(this); // MutableDocument constructor is different, so this override is needed

        internal override byte[] Encode()
        {
            Debug.Assert(Database != null);

            var body = new FLSliceResult();

            Database.ThreadSafety.DoLocked(() =>
            {
                FLEncoder *encoder = null;
                try {
                    encoder = Database.SharedEncoder;
                } catch (Exception) {
                    body = new FLSliceResult(null, 0UL);
                }

                #if CBL_LINQ
                if (_model != null)
                {
                    return((FLSlice)EncodeModel(encoder));
                }
                #endif

                var handle = GCHandle.Alloc(this);
                Native.FLEncoder_SetExtraInfo(encoder, (void *)GCHandle.ToIntPtr(handle));

                try {
                    _dict.FLEncode(encoder);
                } catch (Exception) {
                    Native.FLEncoder_Reset(encoder);
                    throw;
                } finally {
                    handle.Free();
                }

                FLError err;
                body = NativeRaw.FLEncoder_Finish(encoder, &err);
                if (body.buf == null)
                {
                    throw new CouchbaseFleeceException(err);
                }
            });

            var retVal = ((FLSlice)body).ToArrayFast();
            Native.FLSliceResult_Release(body);
            return(retVal);
        }
Ejemplo n.º 6
0
        public unsafe void TestReadOnlyDictionary()
        {
            var now         = DateTimeOffset.UtcNow;
            var nestedArray = new[] { 1L, 2L, 3L };
            var nestedDict  = new Dictionary <string, object> {
                ["foo"] = "bar"
            };
            var masterData = new Dictionary <string, object>
            {
                ["date"]  = now,
                ["array"] = nestedArray,
                ["dict"]  = nestedDict
            };

            var flData = new FLSliceResult();

            Db.InBatch(() =>
            {
                flData = masterData.FLEncode();
            });

            try {
                var context = new DocContext(Db, null);
                using (var mRoot = new MRoot(context)) {
                    mRoot.Context.Should().BeSameAs(context);
                    var flValue          = NativeRaw.FLValue_FromTrustedData((FLSlice)flData);
                    var mDict            = new MDict(new MValue(flValue), mRoot);
                    var deserializedDict = new DictionaryObject(mDict, false);

                    deserializedDict["bogus"].Blob.Should().BeNull();
                    deserializedDict["date"].Date.Should().Be(now);
                    deserializedDict.GetDate("bogus").Should().Be(DateTimeOffset.MinValue);
                    deserializedDict.GetArray("array").Should().Equal(1L, 2L, 3L);
                    deserializedDict.GetArray("bogus").Should().BeNull();
                    deserializedDict.GetDictionary("dict").Should().BeEquivalentTo(nestedDict);
                    deserializedDict.GetDictionary("bogus").Should().BeNull();

                    var dict = deserializedDict.ToDictionary();
                    dict["array"].As <IList>().Should().Equal(1L, 2L, 3L);
                    dict["dict"].As <IDictionary <string, object> >().ShouldBeEquivalentTo(nestedDict);
                }
            } finally {
                Native.FLSliceResult_Free(flData);
            }
        }
Ejemplo n.º 7
0
        public unsafe void TestSharedstrings()
        {
            var now         = DateTimeOffset.UtcNow;
            var nestedArray = new[] { 1L, 2L, 3L };
            var nestedDict  = new Dictionary <string, object> {
                ["foo"] = "bar"
            };
            var masterData = new object[] { 1, "str", nestedArray, now, nestedDict };
            var flData     = new FLSliceResult();

            Db.InBatch(() =>
            {
                flData = masterData.FLEncode();
            });
            try {
                var context = new DocContext(Db, null);
                using (var mRoot = new MRoot(context)) {
                    var        flValue       = NativeRaw.FLValue_FromTrustedData((FLSlice)flData);
                    var        mArr          = new MArray(new MValue(flValue), mRoot);
                    var        sharedstrings = context.SharedStrings;
                    FLEncoder *fLEncoder     = Db.SharedEncoder;
                    mRoot.FLEncode(fLEncoder);
                    mRoot.Encode();

                    var isReadonly = mArr.IsReadOnly;
                    isReadonly.Should().BeFalse();
#if !WINDOWS_UWP
                    Assert.Throws <NotImplementedException>(() => mArr.IndexOf(now));
                    Assert.Throws <NotImplementedException>(() => mArr.Contains(now));
                    Assert.Throws <NotImplementedException>(() => mArr.Remove(now));
                    Assert.Throws <NotImplementedException>(() => mArr.CopyTo(new object[] { }, 12));
#endif
                    var flDict             = Native.FLValue_AsDict(flValue);
                    var sharedStringCache  = new SharedStringCache();
                    var sharedStringCache1 = new SharedStringCache(sharedStringCache);
                    sharedStringCache1 = new SharedStringCache(sharedStringCache, flDict);
                    var i       = default(FLDictIterator);
                    var iterKey = sharedStringCache1.GetDictIterKey(&i);
                    sharedStringCache1.UseDocumentRoot(flDict);
                }
            } finally {
                Native.FLSliceResult_Free(flData);
            }
        }
        internal override byte[] Encode()
        {
            Debug.Assert(Database != null);

            var body = new FLSliceResult();

            Database.ThreadSafety.DoLocked(() =>
            {
                var encoder = Database.SharedEncoder;

                #if CBL_LINQ
                if (_model != null)
                {
                    return((FLSlice)EncodeModel(encoder));
                }
                #endif

                var guid = Guid.NewGuid();
                _NativeCacheMap[guid] = this;
                Native.FLEncoder_SetExtraInfo(encoder, &guid);

                try {
                    _dict.FLEncode(encoder);
                } catch (Exception) {
                    Native.FLEncoder_Reset(encoder);
                    throw;
                } finally {
                    _NativeCacheMap.Remove(guid);
                }

                FLError err;
                body = NativeRaw.FLEncoder_Finish(encoder, &err);
                if (body.buf == null)
                {
                    throw new LiteCoreException(new C4Error(err));
                }
            });

            var retVal = ((C4Slice)body).ToArrayFast();
            Native.FLSliceResult_Free(body);
            return(retVal);
        }
Ejemplo n.º 9
0
        public unsafe void TestReadOnlyArray()
        {
            var now         = DateTimeOffset.UtcNow;
            var nestedArray = new[] { 1L, 2L, 3L };
            var nestedDict  = new Dictionary <string, object> {
                ["foo"] = "bar"
            };
            var masterData = new object[] { 1, "str", nestedArray, now, nestedDict };

            var flData = new FLSliceResult();

            Db.InBatch(() =>
            {
                flData = masterData.FLEncode();
            });

            try {
                var context = new DocContext(Db, null);
                using (var mRoot = new MRoot(context)) {
                    mRoot.Context.Should().BeSameAs(context);
                    var flValue           = NativeRaw.FLValue_FromTrustedData((FLSlice)flData);
                    var mArr              = new MArray(new MValue(flValue), mRoot);
                    var deserializedArray = new ArrayObject(mArr, false);
                    deserializedArray.GetArray(2).Should().Equal(1L, 2L, 3L);
                    deserializedArray.GetArray(3).Should().BeNull();
                    deserializedArray.GetBlob(1).Should().BeNull();
                    deserializedArray.GetDate(3).Should().Be(now);
                    deserializedArray.GetDate(4).Should().Be(DateTimeOffset.MinValue);
                    deserializedArray[1].ToString().Should().Be("str");
                    deserializedArray.GetString(2).Should().BeNull();
                    deserializedArray.GetDictionary(4).Should().BeEquivalentTo(nestedDict);
                    deserializedArray[0].Dictionary.Should().BeNull();

                    var list = deserializedArray.ToList();
                    list[2].Should().BeAssignableTo <IList <object> >();
                    list[4].Should().BeAssignableTo <IDictionary <string, object> >();
                }
            } finally {
                Native.FLSliceResult_Free(flData);
            }
        }
 public static void FLSliceResult_Release(FLSliceResult slice) => Impl.FLSliceResult_Release(slice);
 public static FLDoc *FLDoc_FromResultData(FLSliceResult data, FLTrust x, FLSharedKeys *shared, FLSlice externData) => Impl.FLDoc_FromResultData(data, x, shared, externData);
 public static void FLSliceResult_Free(FLSliceResult slice) => Impl.FLSliceResult_Free(slice);