/// <summary> /// 检查指定的异常句柄。如果存在异常则抛出异常。 /// </summary> /// <param name="error">异常句柄。</param> internal static void Check(IntPtr error) { if (error != IntPtr.Zero) { try { var message = Marshal.PtrToStringAnsi(error); throw new LevelDBException(message); } finally { LevelDBInterop.leveldb_free(error); } } }
// <summary> // DB implementations can export properties about their state // via this method. If "property" is a valid property understood by this // DB implementation, fills "*value" with its current value and returns // true. Otherwise returns false. // // Valid property names include: // // "leveldb.num-files-at-level<N>" - return the number of files at level <N>, // where <N> is an ASCII representation of a level number (e.g. "0"). // "leveldb.stats" - returns a multi-line string that describes statistics // about the internal operation of the DB. // </summary> /// <summary> /// 获取数据库属性。 /// </summary> /// <param name="name">属性名称。</param> /// <returns>一个属性的值。</returns> public string PropertyValue(string name) { var ptr = LevelDBInterop.leveldb_property_value(this._handle, name); if (ptr == IntPtr.Zero) { return(null); } try { return(Marshal.PtrToStringAnsi(ptr)); } finally { LevelDBInterop.leveldb_free(ptr); GC.KeepAlive(this); } }
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); } }