Beispiel #1
0
        private string InnerGet(IntPtr readOptions, string key)
        {
            var    keyData = Encoding.UTF8.GetBytes(key);
            IntPtr error;
            IntPtr lengthPtr;
            var    valuePtr = LevelDBInterop.leveldb_get(this.Database, readOptions, keyData, (IntPtr)keyData.Length, out lengthPtr, out error);

            LevelDBException.Check(error);
            if (valuePtr == IntPtr.Zero)
            {
                return(null);
            }
            try
            {
                return(GetValue(valuePtr, lengthPtr));
            }
            finally
            {
                LevelDBInterop.leveldb_free(valuePtr);
                GC.KeepAlive(readOptions);
                GC.KeepAlive(this);
            }
        }
Beispiel #2
0
        /// <summary>
        /// 获取指定键的值。
        /// </summary>
        /// <param name="key">键。</param>
        /// <param name="options">读的选项。</param>
        /// <returns>返回一个值,如果值不存在则返回 null 值。</returns>
        public unsafe BinaryValue Get(BinaryValue key, ReadOptions options = null)
        {
            this.ThrowWhenDisposed();

            if (options == null)
            {
                options = new ReadOptions();
            }
            var    keyData = key.ByteArray;
            IntPtr error;
            IntPtr lengthPtr;
            var    valuePtr = LevelDBInterop.leveldb_get(this._handle, options._handle, keyData, (IntPtr)keyData.LongLength, out lengthPtr, out error);

            LevelDBException.Check(error);
            if (valuePtr == IntPtr.Zero)
            {
                return(null);
            }
            try
            {
                var length      = (long)lengthPtr;
                var value       = new byte[length];
                var valueNative = (byte *)valuePtr.ToPointer();
                for (long i = 0; i < length; ++i)
                {
                    value[i] = valueNative[i];
                }
                return(new BinaryValue(value));
            }
            finally
            {
                LevelDBInterop.leveldb_free(valuePtr);
                GC.KeepAlive(options);
                GC.KeepAlive(this);
            }
        }