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); }
/// <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); }
void CheckLastError() { IntPtr error; LevelDBInterop.leveldb_iter_get_error(this._handle, out error); LevelDBException.Check(error); GC.KeepAlive(this); }
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); }
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); }
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); }
/// <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); }
/// <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); }
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); }
/// <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; }
/// <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); }
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); }
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); }
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); } }