Exemple #1
0
        /// <summary>Extract a chunk of result from a completed Future</summary>
        /// <param name="h">Handle to the completed Future</param>
        /// <param name="more">Receives true if there are more result, or false if all results have been transmitted</param>
        /// <param name="first">Receives the first key in the page, or default if page is empty</param>
        /// <param name="last">Receives the last key in the page, or default if page is empty</param>
        /// <returns>Array of key/value pairs, or an exception</returns>
        private static KeyValuePair <Slice, Slice>[] GetKeyValueArrayResultValuesOnly(FutureHandle h, out bool more, out Slice first, out Slice last)
        {
            var err = FdbNative.FutureGetKeyValueArrayValuesOnly(h, out var result, out more, out first, out last);

            Fdb.DieOnError(err);
            //note: result can only be null if an error occured!
            Contract.Ensures(result != null);
            return(result);
        }
Exemple #2
0
        public long GetCommittedVersion()
        {
            var err = FdbNative.TransactionGetCommittedVersion(m_handle, out long version);

#if DEBUG_TRANSACTIONS
            Debug.WriteLine("FdbTransaction[" + m_id + "].GetCommittedVersion() => err=" + err + ", version=" + version);
#endif
            Fdb.DieOnError(err);
            return(version);
        }
        private static KeyValuePair <Slice, Slice>[] GetKeyValueArrayResult(FutureHandle h, out bool more)
        {
            KeyValuePair <Slice, Slice>[] result;
            var err = FdbNative.FutureGetKeyValueArray(h, out result, out more);

            Fdb.DieOnError(err);
            //note: result can only be null if an error occured!
            Contract.Ensures(result != null);
            return(result);
        }
Exemple #4
0
        /// <summary>Extract a chunk of result from a completed Future</summary>
        /// <param name="h">Handle to the completed Future</param>
        /// <param name="more">Receives true if there are more result, or false if all results have been transmitted</param>
        /// <param name="first">Receives the first key in the page, or default if page is empty</param>
        /// <param name="last">Receives the last key in the page, or default if page is empty</param>
        /// <returns>Array of key/value pairs, or an exception</returns>
        private static KeyValuePair <Slice, Slice>[] GetKeyValueArrayResultKeysOnly(FutureHandle h, out bool more, out Slice first, out Slice last)
        {
            var err = FdbNative.FutureGetKeyValueArrayKeysOnly(h, out var result, out more);

            Fdb.DieOnError(err);
            //note: result can only be null if an error occured!
            Contract.Ensures(result != null);
            first = result.Length > 0 ? result[0].Key : default;
            last  = result.Length > 0 ? result[result.Length - 1].Key : default;
            return(result);
        }
Exemple #5
0
        private static VersionStamp GetVersionStampResult(FutureHandle h)
        {
            Contract.Requires(h != null);
            var err = FdbNative.FutureGetVersionStamp(h, out VersionStamp stamp);

#if DEBUG_TRANSACTIONS
            Debug.WriteLine("FdbTransaction[" + m_id + "].FutureGetVersionStamp() => err=" + err + ", vs=" + stamp + ")");
#endif
            Fdb.DieOnError(err);

            return(stamp);
        }
Exemple #6
0
        private static Slice GetKeyResult(FutureHandle h)
        {
            Contract.Requires(h != null);

            var err = FdbNative.FutureGetKey(h, out ReadOnlySpan <byte> result);

#if DEBUG_TRANSACTIONS
            Debug.WriteLine("FdbTransaction[].GetKeyResult() => err=" + err + ", result=" + result.ToString());
#endif
            Fdb.DieOnError(err);
            return(Slice.Copy(result));
        }
Exemple #7
0
        //TODO: this is redundant with GetApproximateSize which does the exact book-keeping (but is async!). Should we keep it? or get remove it?

        #endregion

        #region Options...

        /// <inheritdoc />
        public void SetOption(FdbTransactionOption option, ReadOnlySpan <byte> data)
        {
            Fdb.EnsureNotOnNetworkThread();

            unsafe
            {
                fixed(byte *ptr = data)
                {
                    Fdb.DieOnError(FdbNative.TransactionSetOption(m_handle, option, ptr, data.Length));
                }
            }
        }
        public void SetOption(FdbDatabaseOption option, Slice data)
        {
            Fdb.EnsureNotOnNetworkThread();

            unsafe
            {
                fixed(byte *ptr = data)
                {
                    Fdb.DieOnError(FdbNative.DatabaseSetOption(m_handle, option, ptr, data.Count));
                }
            }
        }
Exemple #9
0
        private static bool TryGetValueResult(FutureHandle h, out Slice result)
        {
            Contract.Requires(h != null);

            var err = FdbNative.FutureGetValue(h, out bool present, out result);

#if DEBUG_TRANSACTIONS
            Debug.WriteLine("FdbTransaction[].TryGetValueResult() => err=" + err + ", present=" + present + ", valueLength=" + result.Count);
#endif
            Fdb.DieOnError(err);
            return(present);
        }
Exemple #10
0
        private static string[] GetStringArrayResult(FutureHandle h)
        {
            Contract.Requires(h != null);

            var err = FdbNative.FutureGetStringArray(h, out var result);

#if DEBUG_TRANSACTIONS
            Debug.WriteLine("FdbTransaction[].FutureGetStringArray() => err=" + err + ", results=" + (result == null ? "<null>" : result.Length.ToString()));
#endif
            Fdb.DieOnError(err);
            Contract.Ensures(result != null);             // can only be null in case of an error
            return(result !);
        }
Exemple #11
0
        private static Slice GetValueResultBytes(FutureHandle h)
        {
            Contract.Debug.Requires(h != null);

            var err = FdbNative.FutureGetValue(h, out bool present, out ReadOnlySpan <byte> result);

#if DEBUG_TRANSACTIONS
            Debug.WriteLine("FdbTransaction[].TryGetValueResult() => err=" + err + ", present=" + present + ", valueLength=" + result.Count);
#endif
            Fdb.DieOnError(err);

            return(present ? Slice.Copy(result) : Slice.Nil);
        }
Exemple #12
0
        public Task <long> GetReadVersionAsync(CancellationToken ct)
        {
            var future = FdbNative.TransactionGetReadVersion(m_handle);

            return(FdbFuture.CreateTaskFromHandle(future,
                                                  (h) =>
            {
                var err = FdbNative.FutureGetVersion(h, out long version);
#if DEBUG_TRANSACTIONS
                Debug.WriteLine("FdbTransaction[" + m_id + "].GetReadVersion() => err=" + err + ", version=" + version);
#endif
                Fdb.DieOnError(err);
                return version;
            },
                                                  ct
                                                  ));
        }
        public void SetOption(FdbDatabaseOption option, Slice data)
        {
            Fdb.EnsureNotOnNetworkThread();

            unsafe
            {
                if (data.IsNull)
                {
                    Fdb.DieOnError(FdbNative.DatabaseSetOption(m_handle, option, null, 0));
                }
                else
                {
                    fixed(byte *ptr = data.Array)
                    {
                        Fdb.DieOnError(FdbNative.DatabaseSetOption(m_handle, option, ptr + data.Offset, data.Count));
                    }
                }
            }
        }
Exemple #14
0
        /// <inheritdoc />
        public Task <long> GetApproximateSizeAsync(CancellationToken ct)
        {
            // API was introduced in 6.2
            if (Fdb.ApiVersion < 620)
            {
                throw new NotSupportedException($"The GetApproximateSize method is only available for version 6.2 or greater. Your application has selected API version {Fdb.ApiVersion} which is too low. You willl need to select API version 620 or greater.");
            }
            //TODO: for lesser version, maybe we could return our own estimation?

            var future = FdbNative.TransactionGetReadVersion(m_handle);

            return(FdbFuture.CreateTaskFromHandle(future,
                                                  (h) =>
            {
                var err = FdbNative.FutureGetInt64(h, out long size);
#if DEBUG_TRANSACTIONS
                Debug.WriteLine("FdbTransaction[" + m_id + "].GetApproximateSize() => err=" + err + ", size=" + size);
#endif
                Fdb.DieOnError(err);
                return size;
            },
                                                  ct
                                                  ));
        }
Exemple #15
0
        /// <inheritdoc />
        public void AddConflictRange(ReadOnlySpan <byte> beginKeyInclusive, ReadOnlySpan <byte> endKeyExclusive, FdbConflictRangeType type)
        {
            FdbError err = FdbNative.TransactionAddConflictRange(m_handle, beginKeyInclusive, endKeyExclusive, type);

            Fdb.DieOnError(err);
        }
        public void AddConflictRange(Slice beginKeyInclusive, Slice endKeyExclusive, FdbConflictRangeType type)
        {
            FdbError err = FdbNative.TransactionAddConflictRange(m_handle, beginKeyInclusive, endKeyExclusive, type);

            Fdb.DieOnError(err);
        }