コード例 #1
0
ファイル: LevelDBException.cs プロジェクト: luchaoshuai/Aoite
 /// <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);
         }
     }
 }
コード例 #2
0
        // <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);
            }
        }
コード例 #3
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);
            }
        }
コード例 #4
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);
            }
        }