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