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