public unsafe void Populate(FLArrayIterator iterator, SharedStringCache sharedStrings) { var i = iterator; var serializer = JsonSerializer.CreateDefault(); var count = Native.FLArrayIterator_GetCount(&i); Results = Activator.CreateInstance(_elementType.MakeArrayType(), (int)count); for (var index = 0U; index < count; index++) { using (var reader = new JsonFLValueReader(Native.FLArrayIterator_GetValueAt(&i, index), sharedStrings)) { (Results as IList)[(int)index] = serializer.Deserialize(reader); } } }
public unsafe void Populate(FLArrayIterator iterator, SharedStringCache sharedStrings) { var iter = iterator; var serializer = JsonSerializer.CreateDefault(); var parameters = new List <object>(); for (var i = 0U; i < Native.FLArrayIterator_GetCount(&iter); i++) { using (var reader = new JsonFLValueReader(Native.FLArrayIterator_GetValueAt(&iter, i), sharedStrings)) { var nextItem = serializer.Deserialize(reader, _constructor.GetParameters()[(int)i].ParameterType); parameters.Add(nextItem); } } Results = _constructor.Invoke(parameters.ToArray()); }
internal Result(QueryResultSet rs, C4QueryEnumerator *e, MContext context) { _rs = rs; _context = context; _columns = e->columns; _missingColumns = new BitArray(BitConverter.GetBytes(e->missingColumns)); _columnNames = new Dictionary <string, int>(_rs.ColumnNames); foreach (var pair in _rs.ColumnNames) { if (pair.Value < _missingColumns.Length && _missingColumns.Get(pair.Value)) { _columnNames.Remove(pair.Key); } } _deserialized = new object[_rs.ColumnNames.Count]; for (int i = 0; i < _rs.ColumnNames.Count; i++) { if (!_missingColumns.Get(i)) { _deserialized[i] = FleeceValueToObject(i); } } }
public void TestMultipleQueryObservers() { RunTestVariants(() => { var handle = GCHandle.Alloc(this); try { Compile(Json5("['=', ['.', 'contact', 'address', 'state'], 'CA']")); C4Error error; _queryObserver = Native.c4queryobs_create(_query, QueryCallback, GCHandle.ToIntPtr(handle).ToPointer()); //CHECK(_queryObserver); Native.c4queryobs_setEnabled(_queryObserver, true); _queryObserver2 = Native.c4queryobs_create(_query, QueryCallback, GCHandle.ToIntPtr(handle).ToPointer()); //CHECK(_queryObserver2); Native.c4queryobs_setEnabled(_queryObserver2, true); WriteLine("---- Waiting for query observers..."); Thread.Sleep(2000); WriteLine("Checking query observers..."); _queryCallbackCalls.Should().Be(1, "because we should have received a callback"); var e1 = (C4QueryEnumerator *)LiteCoreBridge.Check(err => { return(Native.c4queryobs_getEnumerator(_queryObserver, true, err)); }); //REQUIRE(e1); //CHECK(error.code == 0); Native.c4queryenum_getRowCount(e1, &error).Should().Be(8); _queryCallbackCalls2.Should().Be(1, "because we should have received a callback"); var e2 = (C4QueryEnumerator *)LiteCoreBridge.Check(err => { return(Native.c4queryobs_getEnumerator(_queryObserver2, true, err)); }); //REQUIRE(e2); //CHECK(error.code == 0); //CHECK(e2 != e1); Native.c4queryenum_getRowCount(e2, &error).Should().Be(8); _queryObserver3 = Native.c4queryobs_create(_query, QueryCallback, GCHandle.ToIntPtr(handle).ToPointer()); //CHECK(_queryObserver3); Native.c4queryobs_setEnabled(_queryObserver3, true); WriteLine("---- Waiting for a new query observer..."); Thread.Sleep(2000); WriteLine("Checking a new query observer..."); _queryCallbackCalls3.Should().Be(1, "because we should have received a callback"); var e3 = (C4QueryEnumerator *)LiteCoreBridge.Check(err => { return(Native.c4queryobs_getEnumerator(_queryObserver3, true, err)); }); //REQUIRE(e3); //CHECK(error.code == 0); //CHECK(e3 != e2); Native.c4queryenum_getRowCount(e3, &error).Should().Be(8); WriteLine("Iterating all query results..."); int count = 0; while (Native.c4queryenum_next(e1, null) && Native.c4queryenum_next(e2, null) && Native.c4queryenum_next(e3, null)) { ++count; FLArrayIterator col1 = e1->columns; FLArrayIterator col2 = e2->columns; FLArrayIterator col3 = e3->columns; var c = Native.FLArrayIterator_GetCount(&col1); c.Should().Be(Native.FLArrayIterator_GetCount(&col2)); c.Should().Be(Native.FLArrayIterator_GetCount(&col3)); for (uint i = 0; i < c; ++i) { var v1 = Native.FLArrayIterator_GetValueAt(&col1, i); var v2 = Native.FLArrayIterator_GetValueAt(&col2, i); var v3 = Native.FLArrayIterator_GetValueAt(&col3, i); Native.FLValue_IsEqual(v1, v2).Should().BeTrue(); Native.FLValue_IsEqual(v2, v3).Should().BeTrue(); } } count.Should().Be(8); } finally { handle.Free(); } }); }