예제 #1
0
        public void WriteBatch()
        {
            var writeOptions = LevelDBInterop.leveldb_writeoptions_create();

            this.InnerPut(writeOptions, "key1", "value1");

            var writeBatch = LevelDBInterop.leveldb_writebatch_create();

            this.InnerBatchDelete(writeBatch, "key1");
            this.InnerBatchPut(writeBatch, "key2", "value2");
            IntPtr error;

            LevelDBInterop.leveldb_write(Database, writeOptions, writeBatch, out error);
            LevelDBException.Check(error);

            var readOptions = LevelDBInterop.leveldb_readoptions_create();
            var value1      = this.InnerGet(readOptions, "key1");

            Assert.Null(value1);
            var value2 = this.InnerGet(readOptions, "key2");

            Assert.Equal("value2", value2);

            this.InnerBatchDelete(writeBatch, "key2");
            LevelDBInterop.leveldb_writebatch_clear(writeBatch);
            LevelDBInterop.leveldb_write(Database, writeOptions, writeBatch, out error);
            LevelDBException.Check(error);
            value2 = this.InnerGet(readOptions, "key2");
            Assert.Equal("value2", value2);

            LevelDBInterop.leveldb_writebatch_destroy(writeBatch);
            LevelDBInterop.leveldb_writeoptions_destroy(writeOptions);
            LevelDBInterop.leveldb_writeoptions_destroy(readOptions);
        }
예제 #2
0
        /// <summary>
        /// 修复指定目录的数据库。
        /// </summary>
        /// <param name="dbFolder">数据库的目录。</param>
        /// <param name="options">数据库的选项。</param>
        public static void Repair(string dbFolder, Options options)
        {
            IntPtr error;

            LevelDBInterop.leveldb_repair_db(options._handle, dbFolder, out error);
            LevelDBException.Check(error);
            GC.KeepAlive(options);
        }
예제 #3
0
파일: Iterator.cs 프로젝트: sinxiaji/Aoite
        void CheckLastError()
        {
            IntPtr error;

            LevelDBInterop.leveldb_iter_get_error(this._handle, out error);
            LevelDBException.Check(error);
            GC.KeepAlive(this);
        }
예제 #4
0
        private void InnerDelete(IntPtr writeOptions, string key)
        {
            var    keyData = Encoding.UTF8.GetBytes(key);
            IntPtr error;

            LevelDBInterop.leveldb_delete(Database, writeOptions, keyData, (IntPtr)keyData.Length, out error);
            LevelDBException.Check(error);
        }
예제 #5
0
        private void InnerPut(IntPtr options, string key, string value)
        {
            var keyData   = Encoding.UTF8.GetBytes(key);
            var valueData = Encoding.UTF8.GetBytes(value);

            IntPtr error;

            LevelDBInterop.leveldb_put(Database, options, keyData, (IntPtr)keyData.Length, valueData, (IntPtr)valueData.LongLength, out error);
            LevelDBException.Check(error);
            GC.KeepAlive(options);
            GC.KeepAlive(this);
        }
예제 #6
0
        public void Repair()
        {
            LevelDBInterop.leveldb_close(Database);
            Database = IntPtr.Zero;

            var    options = LevelDBInterop.leveldb_options_create();
            IntPtr error;

            LevelDBInterop.leveldb_repair_db(options, DatabasePath, out error);
            LevelDBException.Check(error);
            LevelDBInterop.leveldb_options_destroy(options);
        }
예제 #7
0
        /// <summary>
        /// 写入批量的操作。
        /// </summary>
        /// <param name="batch">批量的操作。</param>
        /// <param name="sync">指示是否同步操作。</param>
        public void Write(WriteBatch batch, bool sync = false)
        {
            this.ThrowWhenDisposed();

            var    options = new WriteOptions(sync);
            IntPtr error;

            LevelDBInterop.leveldb_write(this._handle, options._handle, batch._handle, out error);
            LevelDBException.Check(error);
            GC.KeepAlive(batch);
            GC.KeepAlive(options);
            GC.KeepAlive(this);
        }
예제 #8
0
        /// <summary>
        /// 删除指定键。
        /// </summary>
        /// <param name="key">键。</param>
        /// <param name="sync">指示是否同步操作。</param>
        public void Delete(BinaryValue key, bool sync = false)
        {
            this.ThrowWhenDisposed();

            var    options = new WriteOptions(sync);
            var    keyData = key.ByteArray;
            IntPtr error;

            LevelDBInterop.leveldb_delete(this._handle, options._handle, keyData, (IntPtr)keyData.LongLength, out error);
            LevelDBException.Check(error);
            GC.KeepAlive(options);
            GC.KeepAlive(this);
        }
예제 #9
0
        public NativeTests()
        {
            var tempPath = Path.GetTempPath();
            var randName = Path.GetRandomFileName();

            DatabasePath = Path.Combine(tempPath, randName);
            var options = LevelDBInterop.leveldb_options_create();

            LevelDBInterop.leveldb_options_set_create_if_missing(options, 1);
            IntPtr error;

            Database = LevelDBInterop.leveldb_open(options, DatabasePath, out error);
            LevelDBException.Check(error);
        }
예제 #10
0
        /// <summary>
        /// 指定数据库目录和选项,初始化一个 <see cref="Aoite.LevelDB.LDB"/> 类的新实例。
        /// </summary>
        /// <param name="dbFolder">数据库的目录。</param>
        /// <param name="options">数据库的选项。</param>
        public LDB(string dbFolder, Options options)
        {
            if (dbFolder == null)
            {
                throw new ArgumentNullException("dbFolder");
            }

            Options = options ?? new Options();
            IntPtr error;

            _handle = LevelDBInterop.leveldb_open(Options._handle, dbFolder, out error);
            LevelDBException.Check(error);
            GC.KeepAlive(Options);
            this._DbFolder = dbFolder;
        }
예제 #11
0
        /// <summary>
        /// 设置指定键的值。
        /// </summary>
        /// <param name="key">键。</param>
        /// <param name="value">值。</param>
        /// <param name="sync">指示是否同步操作。</param>
        public LDB Set(BinaryValue key, BinaryValue value, bool sync = false)
        {
            this.ThrowIfDisposed();

            var    options = new WriteOptions(sync);
            IntPtr error;
            var    keyData   = key.ByteArray;
            var    valueData = value.ByteArray;

            LevelDBInterop.leveldb_put(this._handle, options._handle, keyData, (IntPtr)keyData.LongLength, valueData, (IntPtr)valueData.LongLength, out error);
            LevelDBException.Check(error);
            GC.KeepAlive(options);
            GC.KeepAlive(this);
            return(this);
        }
예제 #12
0
        public void Reopen()
        {
            LevelDBInterop.leveldb_close(Database);
            Database = IntPtr.Zero;

            var    options = LevelDBInterop.leveldb_options_create();
            IntPtr error;

            Database = LevelDBInterop.leveldb_open(options, DatabasePath, out error);
            LevelDBException.Check(error);
            var readOptions = LevelDBInterop.leveldb_readoptions_create();

            this.InnerGet(readOptions, "key1");
            LevelDBInterop.leveldb_readoptions_destroy(readOptions);
        }
예제 #13
0
        public void Cache()
        {
            LevelDBInterop.leveldb_close(Database);
            Database = IntPtr.Zero;

            // open the DB with a cache that is not owned by LevelDB, then
            // close DB and then free the cache
            var options = LevelDBInterop.leveldb_options_create();
            var cache   = LevelDBInterop.leveldb_cache_create_lru((IntPtr)64);

            LevelDBInterop.leveldb_options_set_cache(options, cache);
            IntPtr error;

            Database = LevelDBInterop.leveldb_open(options, DatabasePath, out error);
            LevelDBException.Check(error);
            LevelDBInterop.leveldb_close(Database);
            Database = IntPtr.Zero;

            LevelDBInterop.leveldb_cache_destroy(cache);
            LevelDBInterop.leveldb_options_destroy(options);
        }
예제 #14
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);
            }
        }
예제 #15
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);
            }
        }