예제 #1
0
        public DatabaseObserver(C4Database *database, DatabaseObserverCallback callback, object context)
        {
            _context        = context;
            _callback       = callback;
            _nativeCallback = DbObserverCallback;
            var id = Guid.NewGuid();

            _id       = GCHandle.Alloc(id, GCHandleType.Pinned);
            _observer = (long)LiteCoreBridge.Check(err => {
                _ObserverMap[id] = this;
                return(Native.c4dbobs_create(database, _nativeCallback, GCHandle.ToIntPtr(_id).ToPointer()));
            });
        }
        private void ObserverTask()
        {
            var database = OpenDB();
            var handle   = GCHandle.Alloc(this);
            C4DatabaseObserverCallback callback = ObsCallback;
            var observer     = Native.c4dbobs_create(database, callback, GCHandle.ToIntPtr(handle).ToPointer());
            var lastSequence = 0UL;

            try {
                do
                {
                    lock (_observerMutex)
                    {
                        if (!_changesToObserve)
                        {
                            continue;
                        }

                        Write("8");
                        _changesToObserve = false;
                    }

                    var  changes = new C4DatabaseChange[10];
                    uint nDocs;
                    bool external;
                    while (0 < (nDocs = Native.c4dbobs_getChanges(observer, changes, 10U, &external)))
                    {
                        try
                        {
                            external.Should().BeTrue("because all changes will be external in this test");
                            for (int i = 0; i < nDocs; ++i)
                            {
                                changes[i].docID.CreateString().Should().StartWith("doc-",
                                                                                   "because otherwise the document ID is not what we created");
                                lastSequence = changes[i].sequence;
                            }
                        }
                        finally
                        {
                            Native.c4dbobs_releaseChanges(changes, nDocs);
                        }
                    }

                    Task.Delay(TimeSpan.FromMilliseconds(100)).Wait();
                } while (lastSequence < NumDocs);
            } finally {
                Native.c4dbobs_free(observer);
                handle.Free();
                CloseDB(database);
            }
        }
예제 #3
0
 public static extern C4DatabaseObserver *c4dbobs_create(C4Database *database, C4DatabaseObserverCallback callback, void *context);
 public C4DatabaseObserver *c4dbobs_create(C4Database *database, C4DatabaseObserverCallback callback, void *context) => Native.c4dbobs_create(database, callback, context);