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)); } }
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); } }
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(); }
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); }
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); } }
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); }
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);