From: Evan Shaw Date: Wed, 18 Jun 2014 02:23:47 +0000 (+1200) Subject: Support for compaction filters in the C API X-Git-Tag: rocksdb-3.2~2^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=df2701373d6247c540b8818e2c14c1b1f02c8cfe;p=rocksdb.git Support for compaction filters in the C API --- diff --git a/db/c.cc b/db/c.cc index b50e59ecc..ec4788844 100644 --- a/db/c.cc +++ b/db/c.cc @@ -14,6 +14,7 @@ #include #include #include "rocksdb/cache.h" +#include "rocksdb/compaction_filter.h" #include "rocksdb/comparator.h" #include "rocksdb/db.h" #include "rocksdb/env.h" @@ -30,6 +31,7 @@ #include "rocksdb/table.h" using rocksdb::Cache; +using rocksdb::CompactionFilter; using rocksdb::Comparator; using rocksdb::CompressionType; using rocksdb::DB; @@ -77,6 +79,49 @@ struct rocksdb_logger_t { shared_ptr rep; }; struct rocksdb_cache_t { shared_ptr rep; }; struct rocksdb_livefiles_t { std::vector rep; }; +struct rocksdb_compactionfilter_t : public CompactionFilter { + void* state_; + void (*destructor_)(void*); + unsigned char (*filter_)( + void*, + int level, + const char* key, size_t key_length, + const char* existing_value, size_t value_length, + char** new_value, size_t *new_value_length, + unsigned char* value_changed); + const char* (*name_)(void*); + + virtual ~rocksdb_compactionfilter_t() { + (*destructor_)(state_); + } + + virtual bool Filter( + int level, + const Slice& key, + const Slice& existing_value, + std::string* new_value, + bool* value_changed) const { + char* c_new_value = NULL; + size_t new_value_length = 0; + unsigned char c_value_changed = 0; + unsigned char result = (*filter_)( + state_, + level, + key.data(), key.size(), + existing_value.data(), existing_value.size(), + &c_new_value, &new_value_length, &c_value_changed); + if (c_value_changed) { + new_value->assign(c_new_value, new_value_length); + *value_changed = true; + } + return result; + } + + virtual const char* Name() const { + return (*name_)(state_); + } +}; + struct rocksdb_comparator_t : public Comparator { void* state_; void (*destructor_)(void*); @@ -1119,10 +1164,32 @@ DB::GetUpdatesSince DB::GetDbIdentity DB::RunManualCompaction custom cache -compaction_filter table_properties_collectors */ +rocksdb_compactionfilter_t* rocksdb_compactionfilter_create( + void* state, + void (*destructor)(void*), + unsigned char (*filter)( + void*, + int level, + const char* key, size_t key_length, + const char* existing_value, size_t value_length, + char** new_value, size_t *new_value_length, + unsigned char* value_changed), + const char* (*name)(void*)) { + rocksdb_compactionfilter_t* result = new rocksdb_compactionfilter_t; + result->state_ = state; + result->destructor_ = destructor; + result->filter_ = filter; + result->name_ = name; + return result; +} + +void rocksdb_compactionfilter_destroy(rocksdb_compactionfilter_t* filter) { + delete filter; +} + rocksdb_comparator_t* rocksdb_comparator_create( void* state, void (*destructor)(void*), diff --git a/include/rocksdb/c.h b/include/rocksdb/c.h index 013ee5d2a..3a96bfbd1 100644 --- a/include/rocksdb/c.h +++ b/include/rocksdb/c.h @@ -56,6 +56,7 @@ extern "C" { typedef struct rocksdb_t rocksdb_t; typedef struct rocksdb_cache_t rocksdb_cache_t; +typedef struct rocksdb_compactionfilter_t rocksdb_compactionfilter_t; typedef struct rocksdb_comparator_t rocksdb_comparator_t; typedef struct rocksdb_env_t rocksdb_env_t; typedef struct rocksdb_filelock_t rocksdb_filelock_t; @@ -401,6 +402,22 @@ enum { }; extern void rocksdb_options_set_compaction_style(rocksdb_options_t*, int); extern void rocksdb_options_set_universal_compaction_options(rocksdb_options_t*, rocksdb_universal_compaction_options_t*); + +/* Compaction Filter */ + +extern rocksdb_compactionfilter_t* rocksdb_compactionfilter_create( + void* state, + void (*destructor)(void*), + unsigned char (*filter)( + void*, + int level, + const char* key, size_t key_length, + const char* existing_value, size_t value_length, + char** new_value, size_t *new_value_length, + unsigned char* value_changed), + const char* (*name)(void*)); +extern void rocksdb_compactionfilter_destroy(rocksdb_compactionfilter_t*); + /* Comparator */ extern rocksdb_comparator_t* rocksdb_comparator_create(