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);
        }
Exemplo n.º 2
0
        /// <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
        }
Exemplo n.º 3
0
 private static extern C4QueryEnumerator* _c4view_query(C4View *view, C4QueryOptions *options, C4Error *outError);