private uint RunQuery(C4View *view, C4QueryOptions options, bool verbose = false) { var allKeys = new List <string>(1200); C4Error error; var query = (C4QueryEnumerator *)LiteCoreBridge.Check(err => { var localOpts = options; return(Native.c4view_query(view, &localOpts, err)); }); C4SliceResult keySlice; while (Native.c4queryenum_next(query, &error)) { var key = query->key; if (Native.c4key_peek(&key) == C4KeyToken.Array) { Native.c4key_skipToken(&key); keySlice = NativeRaw.c4key_readString(&key); } else { Native.c4key_peek(&key).Should().Be(C4KeyToken.String, "because otherwise an invalid entry is present"); keySlice = NativeRaw.c4key_readString(&key); } ((long)keySlice.buf).Should().NotBe(0, "because the entry should not be null"); var keyStr = ((C4Slice)keySlice).CreateString(); if (verbose) { var valStr = query->value.CreateString(); Console.Write($"{keyStr} ({valStr}) "); } allKeys.Add(keyStr); Native.c4slice_free(keySlice); } Native.c4queryenum_free(query); if (verbose) { Console.WriteLine(); } return((uint)allKeys.Count); }
/// <summary> /// Runs a query and returns an enumerator for the results. /// The enumerator's fields are not valid until you call c4queryenum_next(), though. /// </summary> /// <param name="view">The view to operate on</param> /// <param name="options">The query options</param> /// <param name="outError">The error that occurred if the operation doesn't succeed</param> /// <returns>A pointer to the enumerator on success, otherwise null</returns> public static C4QueryEnumerator *c4view_query(C4View *view, C4QueryOptions *options, C4Error *outError) { #if DEBUG var retVal = _c4view_query(view, options, outError); if(retVal != null) { _AllocatedObjects[(IntPtr)retVal] = "C4QueryEnumerator"; #if ENABLE_LOGGING Console.WriteLine("[c4view_query] Allocated 0x{0}", ((IntPtr)retVal).ToString("X")); #endif } return retVal; #else return _c4view_query(view, options, outError); #endif }
private static extern C4QueryEnumerator* _c4view_query(C4View *view, C4QueryOptions *options, C4Error *outError);