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());
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 4
0
        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();
                }
            });
        }