Skip to content

Instantly share code, notes, and snippets.

@risent
Created March 24, 2018 06:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save risent/c8513c8a4ee06b394c4fe3e1216d5318 to your computer and use it in GitHub Desktop.
Save risent/c8513c8a4ee06b394c4fe3e1216d5318 to your computer and use it in GitHub Desktop.
Lua binding for RocksDB
local ffi = require("ffi")
-- cut from https://github.com/facebook/rocksdb/blob/e59cb2a19b2971707d75552ae517586ca0785a6a/include/rocksdb/c.h
ffi.cdef[[
/* Exported types */
typedef struct rocksdb_t rocksdb_t;
typedef struct rocksdb_backup_engine_t rocksdb_backup_engine_t;
typedef struct rocksdb_backup_engine_info_t rocksdb_backup_engine_info_t;
typedef struct rocksdb_restore_options_t rocksdb_restore_options_t;
typedef struct rocksdb_cache_t rocksdb_cache_t;
typedef struct rocksdb_compactionfilter_t rocksdb_compactionfilter_t;
typedef struct rocksdb_compactionfiltercontext_t
rocksdb_compactionfiltercontext_t;
typedef struct rocksdb_compactionfilterfactory_t
rocksdb_compactionfilterfactory_t;
typedef struct rocksdb_comparator_t rocksdb_comparator_t;
typedef struct rocksdb_dbpath_t rocksdb_dbpath_t;
typedef struct rocksdb_env_t rocksdb_env_t;
typedef struct rocksdb_fifo_compaction_options_t rocksdb_fifo_compaction_options_t;
typedef struct rocksdb_filelock_t rocksdb_filelock_t;
typedef struct rocksdb_filterpolicy_t rocksdb_filterpolicy_t;
typedef struct rocksdb_flushoptions_t rocksdb_flushoptions_t;
typedef struct rocksdb_iterator_t rocksdb_iterator_t;
typedef struct rocksdb_logger_t rocksdb_logger_t;
typedef struct rocksdb_mergeoperator_t rocksdb_mergeoperator_t;
typedef struct rocksdb_options_t rocksdb_options_t;
typedef struct rocksdb_compactoptions_t rocksdb_compactoptions_t;
typedef struct rocksdb_block_based_table_options_t
rocksdb_block_based_table_options_t;
typedef struct rocksdb_cuckoo_table_options_t
rocksdb_cuckoo_table_options_t;
typedef struct rocksdb_randomfile_t rocksdb_randomfile_t;
typedef struct rocksdb_readoptions_t rocksdb_readoptions_t;
typedef struct rocksdb_seqfile_t rocksdb_seqfile_t;
typedef struct rocksdb_slicetransform_t rocksdb_slicetransform_t;
typedef struct rocksdb_snapshot_t rocksdb_snapshot_t;
typedef struct rocksdb_writablefile_t rocksdb_writablefile_t;
typedef struct rocksdb_writebatch_t rocksdb_writebatch_t;
typedef struct rocksdb_writebatch_wi_t rocksdb_writebatch_wi_t;
typedef struct rocksdb_writeoptions_t rocksdb_writeoptions_t;
typedef struct rocksdb_universal_compaction_options_t rocksdb_universal_compaction_options_t;
typedef struct rocksdb_livefiles_t rocksdb_livefiles_t;
typedef struct rocksdb_column_family_handle_t rocksdb_column_family_handle_t;
typedef struct rocksdb_envoptions_t rocksdb_envoptions_t;
typedef struct rocksdb_ingestexternalfileoptions_t rocksdb_ingestexternalfileoptions_t;
typedef struct rocksdb_sstfilewriter_t rocksdb_sstfilewriter_t;
typedef struct rocksdb_ratelimiter_t rocksdb_ratelimiter_t;
typedef struct rocksdb_pinnableslice_t rocksdb_pinnableslice_t;
typedef struct rocksdb_transactiondb_options_t rocksdb_transactiondb_options_t;
typedef struct rocksdb_transactiondb_t rocksdb_transactiondb_t;
typedef struct rocksdb_transaction_options_t rocksdb_transaction_options_t;
typedef struct rocksdb_optimistictransactiondb_t
rocksdb_optimistictransactiondb_t;
typedef struct rocksdb_optimistictransaction_options_t
rocksdb_optimistictransaction_options_t;
typedef struct rocksdb_transaction_t rocksdb_transaction_t;
typedef struct rocksdb_checkpoint_t rocksdb_checkpoint_t;
/* DB operations */
extern rocksdb_t* rocksdb_open(
const rocksdb_options_t* options, const char* name, char** errptr);
extern rocksdb_t* rocksdb_open_for_read_only(
const rocksdb_options_t* options, const char* name,
unsigned char error_if_log_file_exist, char** errptr);
extern rocksdb_backup_engine_t* rocksdb_backup_engine_open(
const rocksdb_options_t* options, const char* path, char** errptr);
extern void rocksdb_backup_engine_create_new_backup(
rocksdb_backup_engine_t* be, rocksdb_t* db, char** errptr);
extern void rocksdb_backup_engine_purge_old_backups(
rocksdb_backup_engine_t* be, uint32_t num_backups_to_keep, char** errptr);
extern rocksdb_restore_options_t*
rocksdb_restore_options_create();
extern void rocksdb_restore_options_destroy(
rocksdb_restore_options_t* opt);
extern void rocksdb_restore_options_set_keep_log_files(
rocksdb_restore_options_t* opt, int v);
extern void
rocksdb_backup_engine_restore_db_from_latest_backup(
rocksdb_backup_engine_t* be, const char* db_dir, const char* wal_dir,
const rocksdb_restore_options_t* restore_options, char** errptr);
extern const rocksdb_backup_engine_info_t*
rocksdb_backup_engine_get_backup_info(rocksdb_backup_engine_t* be);
extern int rocksdb_backup_engine_info_count(
const rocksdb_backup_engine_info_t* info);
extern int64_t
rocksdb_backup_engine_info_timestamp(const rocksdb_backup_engine_info_t* info,
int index);
extern uint32_t
rocksdb_backup_engine_info_backup_id(const rocksdb_backup_engine_info_t* info,
int index);
extern uint64_t
rocksdb_backup_engine_info_size(const rocksdb_backup_engine_info_t* info,
int index);
extern uint32_t rocksdb_backup_engine_info_number_files(
const rocksdb_backup_engine_info_t* info, int index);
extern void rocksdb_backup_engine_info_destroy(
const rocksdb_backup_engine_info_t* info);
extern void rocksdb_backup_engine_close(
rocksdb_backup_engine_t* be);
extern rocksdb_checkpoint_t*
rocksdb_checkpoint_object_create(rocksdb_t* db, char** errptr);
extern void rocksdb_checkpoint_create(
rocksdb_checkpoint_t* checkpoint, const char* checkpoint_dir,
uint64_t log_size_for_flush, char** errptr);
extern void rocksdb_checkpoint_object_destroy(
rocksdb_checkpoint_t* checkpoint);
extern rocksdb_t* rocksdb_open_column_families(
const rocksdb_options_t* options, const char* name, int num_column_families,
const char** column_family_names,
const rocksdb_options_t** column_family_options,
rocksdb_column_family_handle_t** column_family_handles, char** errptr);
extern rocksdb_t*
rocksdb_open_for_read_only_column_families(
const rocksdb_options_t* options, const char* name, int num_column_families,
const char** column_family_names,
const rocksdb_options_t** column_family_options,
rocksdb_column_family_handle_t** column_family_handles,
unsigned char error_if_log_file_exist, char** errptr);
extern char** rocksdb_list_column_families(
const rocksdb_options_t* options, const char* name, size_t* lencf,
char** errptr);
extern void rocksdb_list_column_families_destroy(
char** list, size_t len);
extern rocksdb_column_family_handle_t*
rocksdb_create_column_family(rocksdb_t* db,
const rocksdb_options_t* column_family_options,
const char* column_family_name, char** errptr);
extern void rocksdb_drop_column_family(
rocksdb_t* db, rocksdb_column_family_handle_t* handle, char** errptr);
extern void rocksdb_column_family_handle_destroy(
rocksdb_column_family_handle_t*);
extern void rocksdb_close(rocksdb_t* db);
extern void rocksdb_put(
rocksdb_t* db, const rocksdb_writeoptions_t* options, const char* key,
size_t keylen, const char* val, size_t vallen, char** errptr);
extern void rocksdb_put_cf(
rocksdb_t* db, const rocksdb_writeoptions_t* options,
rocksdb_column_family_handle_t* column_family, const char* key,
size_t keylen, const char* val, size_t vallen, char** errptr);
extern void rocksdb_delete(
rocksdb_t* db, const rocksdb_writeoptions_t* options, const char* key,
size_t keylen, char** errptr);
extern void rocksdb_delete_cf(
rocksdb_t* db, const rocksdb_writeoptions_t* options,
rocksdb_column_family_handle_t* column_family, const char* key,
size_t keylen, char** errptr);
extern void rocksdb_merge(
rocksdb_t* db, const rocksdb_writeoptions_t* options, const char* key,
size_t keylen, const char* val, size_t vallen, char** errptr);
extern void rocksdb_merge_cf(
rocksdb_t* db, const rocksdb_writeoptions_t* options,
rocksdb_column_family_handle_t* column_family, const char* key,
size_t keylen, const char* val, size_t vallen, char** errptr);
extern void rocksdb_write(
rocksdb_t* db, const rocksdb_writeoptions_t* options,
rocksdb_writebatch_t* batch, char** errptr);
/* Returns NULL if not found. A malloc()ed array otherwise.
Stores the length of the array in *vallen. */
extern char* rocksdb_get(
rocksdb_t* db, const rocksdb_readoptions_t* options, const char* key,
size_t keylen, size_t* vallen, char** errptr);
extern char* rocksdb_get_cf(
rocksdb_t* db, const rocksdb_readoptions_t* options,
rocksdb_column_family_handle_t* column_family, const char* key,
size_t keylen, size_t* vallen, char** errptr);
// if values_list[i] == NULL and errs[i] == NULL,
// then we got status.IsNotFound(), which we will not return.
// all errors except status status.ok() and status.IsNotFound() are returned.
//
// errs, values_list and values_list_sizes must be num_keys in length,
// allocated by the caller.
// errs is a list of strings as opposed to the conventional one error,
// where errs[i] is the status for retrieval of keys_list[i].
// each non-NULL errs entry is a malloc()ed, null terminated string.
// each non-NULL values_list entry is a malloc()ed array, with
// the length for each stored in values_list_sizes[i].
extern void rocksdb_multi_get(
rocksdb_t* db, const rocksdb_readoptions_t* options, size_t num_keys,
const char* const* keys_list, const size_t* keys_list_sizes,
char** values_list, size_t* values_list_sizes, char** errs);
extern void rocksdb_multi_get_cf(
rocksdb_t* db, const rocksdb_readoptions_t* options,
const rocksdb_column_family_handle_t* const* column_families,
size_t num_keys, const char* const* keys_list,
const size_t* keys_list_sizes, char** values_list,
size_t* values_list_sizes, char** errs);
extern rocksdb_iterator_t* rocksdb_create_iterator(
rocksdb_t* db, const rocksdb_readoptions_t* options);
extern rocksdb_iterator_t* rocksdb_create_iterator_cf(
rocksdb_t* db, const rocksdb_readoptions_t* options,
rocksdb_column_family_handle_t* column_family);
extern void rocksdb_create_iterators(
rocksdb_t *db, rocksdb_readoptions_t* opts,
rocksdb_column_family_handle_t** column_families,
rocksdb_iterator_t** iterators, size_t size, char** errptr);
extern const rocksdb_snapshot_t* rocksdb_create_snapshot(
rocksdb_t* db);
extern void rocksdb_release_snapshot(
rocksdb_t* db, const rocksdb_snapshot_t* snapshot);
/* Returns NULL if property name is unknown.
Else returns a pointer to a malloc()-ed null-terminated value. */
extern char* rocksdb_property_value(rocksdb_t* db,
const char* propname);
/* returns 0 on success, -1 otherwise */
int rocksdb_property_int(
rocksdb_t* db,
const char* propname, uint64_t *out_val);
extern char* rocksdb_property_value_cf(
rocksdb_t* db, rocksdb_column_family_handle_t* column_family,
const char* propname);
extern void rocksdb_approximate_sizes(
rocksdb_t* db, int num_ranges, const char* const* range_start_key,
const size_t* range_start_key_len, const char* const* range_limit_key,
const size_t* range_limit_key_len, uint64_t* sizes);
extern void rocksdb_approximate_sizes_cf(
rocksdb_t* db, rocksdb_column_family_handle_t* column_family,
int num_ranges, const char* const* range_start_key,
const size_t* range_start_key_len, const char* const* range_limit_key,
const size_t* range_limit_key_len, uint64_t* sizes);
extern void rocksdb_compact_range(rocksdb_t* db,
const char* start_key,
size_t start_key_len,
const char* limit_key,
size_t limit_key_len);
extern void rocksdb_compact_range_cf(
rocksdb_t* db, rocksdb_column_family_handle_t* column_family,
const char* start_key, size_t start_key_len, const char* limit_key,
size_t limit_key_len);
extern void rocksdb_compact_range_opt(
rocksdb_t* db, rocksdb_compactoptions_t* opt, const char* start_key,
size_t start_key_len, const char* limit_key, size_t limit_key_len);
extern void rocksdb_compact_range_cf_opt(
rocksdb_t* db, rocksdb_column_family_handle_t* column_family,
rocksdb_compactoptions_t* opt, const char* start_key, size_t start_key_len,
const char* limit_key, size_t limit_key_len);
extern void rocksdb_delete_file(rocksdb_t* db,
const char* name);
extern const rocksdb_livefiles_t* rocksdb_livefiles(
rocksdb_t* db);
extern void rocksdb_flush(
rocksdb_t* db, const rocksdb_flushoptions_t* options, char** errptr);
extern void rocksdb_disable_file_deletions(rocksdb_t* db,
char** errptr);
extern void rocksdb_enable_file_deletions(
rocksdb_t* db, unsigned char force, char** errptr);
/* Management operations */
extern void rocksdb_destroy_db(
const rocksdb_options_t* options, const char* name, char** errptr);
extern void rocksdb_repair_db(
const rocksdb_options_t* options, const char* name, char** errptr);
/* Iterator */
extern void rocksdb_iter_destroy(rocksdb_iterator_t*);
extern unsigned char rocksdb_iter_valid(
const rocksdb_iterator_t*);
extern void rocksdb_iter_seek_to_first(rocksdb_iterator_t*);
extern void rocksdb_iter_seek_to_last(rocksdb_iterator_t*);
extern void rocksdb_iter_seek(rocksdb_iterator_t*,
const char* k, size_t klen);
extern void rocksdb_iter_seek_for_prev(rocksdb_iterator_t*,
const char* k,
size_t klen);
extern void rocksdb_iter_next(rocksdb_iterator_t*);
extern void rocksdb_iter_prev(rocksdb_iterator_t*);
extern const char* rocksdb_iter_key(
const rocksdb_iterator_t*, size_t* klen);
extern const char* rocksdb_iter_value(
const rocksdb_iterator_t*, size_t* vlen);
extern void rocksdb_iter_get_error(
const rocksdb_iterator_t*, char** errptr);
/* Write batch */
extern rocksdb_writebatch_t* rocksdb_writebatch_create();
extern rocksdb_writebatch_t* rocksdb_writebatch_create_from(
const char* rep, size_t size);
extern void rocksdb_writebatch_destroy(
rocksdb_writebatch_t*);
extern void rocksdb_writebatch_clear(rocksdb_writebatch_t*);
extern int rocksdb_writebatch_count(rocksdb_writebatch_t*);
extern void rocksdb_writebatch_put(rocksdb_writebatch_t*,
const char* key,
size_t klen,
const char* val,
size_t vlen);
extern void rocksdb_writebatch_put_cf(
rocksdb_writebatch_t*, rocksdb_column_family_handle_t* column_family,
const char* key, size_t klen, const char* val, size_t vlen);
extern void rocksdb_writebatch_putv(
rocksdb_writebatch_t* b, int num_keys, const char* const* keys_list,
const size_t* keys_list_sizes, int num_values,
const char* const* values_list, const size_t* values_list_sizes);
extern void rocksdb_writebatch_putv_cf(
rocksdb_writebatch_t* b, rocksdb_column_family_handle_t* column_family,
int num_keys, const char* const* keys_list, const size_t* keys_list_sizes,
int num_values, const char* const* values_list,
const size_t* values_list_sizes);
extern void rocksdb_writebatch_merge(rocksdb_writebatch_t*,
const char* key,
size_t klen,
const char* val,
size_t vlen);
extern void rocksdb_writebatch_merge_cf(
rocksdb_writebatch_t*, rocksdb_column_family_handle_t* column_family,
const char* key, size_t klen, const char* val, size_t vlen);
extern void rocksdb_writebatch_mergev(
rocksdb_writebatch_t* b, int num_keys, const char* const* keys_list,
const size_t* keys_list_sizes, int num_values,
const char* const* values_list, const size_t* values_list_sizes);
extern void rocksdb_writebatch_mergev_cf(
rocksdb_writebatch_t* b, rocksdb_column_family_handle_t* column_family,
int num_keys, const char* const* keys_list, const size_t* keys_list_sizes,
int num_values, const char* const* values_list,
const size_t* values_list_sizes);
extern void rocksdb_writebatch_delete(rocksdb_writebatch_t*,
const char* key,
size_t klen);
extern void rocksdb_writebatch_delete_cf(
rocksdb_writebatch_t*, rocksdb_column_family_handle_t* column_family,
const char* key, size_t klen);
extern void rocksdb_writebatch_deletev(
rocksdb_writebatch_t* b, int num_keys, const char* const* keys_list,
const size_t* keys_list_sizes);
extern void rocksdb_writebatch_deletev_cf(
rocksdb_writebatch_t* b, rocksdb_column_family_handle_t* column_family,
int num_keys, const char* const* keys_list, const size_t* keys_list_sizes);
extern void rocksdb_writebatch_delete_range(
rocksdb_writebatch_t* b, const char* start_key, size_t start_key_len,
const char* end_key, size_t end_key_len);
extern void rocksdb_writebatch_delete_range_cf(
rocksdb_writebatch_t* b, rocksdb_column_family_handle_t* column_family,
const char* start_key, size_t start_key_len, const char* end_key,
size_t end_key_len);
extern void rocksdb_writebatch_delete_rangev(
rocksdb_writebatch_t* b, int num_keys, const char* const* start_keys_list,
const size_t* start_keys_list_sizes, const char* const* end_keys_list,
const size_t* end_keys_list_sizes);
extern void rocksdb_writebatch_delete_rangev_cf(
rocksdb_writebatch_t* b, rocksdb_column_family_handle_t* column_family,
int num_keys, const char* const* start_keys_list,
const size_t* start_keys_list_sizes, const char* const* end_keys_list,
const size_t* end_keys_list_sizes);
extern void rocksdb_writebatch_put_log_data(
rocksdb_writebatch_t*, const char* blob, size_t len);
extern void rocksdb_writebatch_iterate(
rocksdb_writebatch_t*, void* state,
void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen),
void (*deleted)(void*, const char* k, size_t klen));
extern const char* rocksdb_writebatch_data(
rocksdb_writebatch_t*, size_t* size);
extern void rocksdb_writebatch_set_save_point(
rocksdb_writebatch_t*);
extern void rocksdb_writebatch_rollback_to_save_point(
rocksdb_writebatch_t*, char** errptr);
extern void rocksdb_writebatch_pop_save_point(
rocksdb_writebatch_t*, char** errptr);
/* Write batch with index */
extern rocksdb_writebatch_wi_t* rocksdb_writebatch_wi_create(
size_t reserved_bytes,
unsigned char overwrite_keys);
extern rocksdb_writebatch_wi_t* rocksdb_writebatch_wi_create_from(
const char* rep, size_t size);
extern void rocksdb_writebatch_wi_destroy(
rocksdb_writebatch_wi_t*);
extern void rocksdb_writebatch_wi_clear(rocksdb_writebatch_wi_t*);
extern int rocksdb_writebatch_wi_count(rocksdb_writebatch_wi_t* b);
extern void rocksdb_writebatch_wi_put(rocksdb_writebatch_wi_t*,
const char* key,
size_t klen,
const char* val,
size_t vlen);
extern void rocksdb_writebatch_wi_put_cf(
rocksdb_writebatch_wi_t*, rocksdb_column_family_handle_t* column_family,
const char* key, size_t klen, const char* val, size_t vlen);
extern void rocksdb_writebatch_wi_putv(
rocksdb_writebatch_wi_t* b, int num_keys, const char* const* keys_list,
const size_t* keys_list_sizes, int num_values,
const char* const* values_list, const size_t* values_list_sizes);
extern void rocksdb_writebatch_wi_putv_cf(
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
int num_keys, const char* const* keys_list, const size_t* keys_list_sizes,
int num_values, const char* const* values_list,
const size_t* values_list_sizes);
extern void rocksdb_writebatch_wi_merge(rocksdb_writebatch_wi_t*,
const char* key,
size_t klen,
const char* val,
size_t vlen);
extern void rocksdb_writebatch_wi_merge_cf(
rocksdb_writebatch_wi_t*, rocksdb_column_family_handle_t* column_family,
const char* key, size_t klen, const char* val, size_t vlen);
extern void rocksdb_writebatch_wi_mergev(
rocksdb_writebatch_wi_t* b, int num_keys, const char* const* keys_list,
const size_t* keys_list_sizes, int num_values,
const char* const* values_list, const size_t* values_list_sizes);
extern void rocksdb_writebatch_wi_mergev_cf(
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
int num_keys, const char* const* keys_list, const size_t* keys_list_sizes,
int num_values, const char* const* values_list,
const size_t* values_list_sizes);
extern void rocksdb_writebatch_wi_delete(rocksdb_writebatch_wi_t*,
const char* key,
size_t klen);
extern void rocksdb_writebatch_wi_delete_cf(
rocksdb_writebatch_wi_t*, rocksdb_column_family_handle_t* column_family,
const char* key, size_t klen);
extern void rocksdb_writebatch_wi_deletev(
rocksdb_writebatch_wi_t* b, int num_keys, const char* const* keys_list,
const size_t* keys_list_sizes);
extern void rocksdb_writebatch_wi_deletev_cf(
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
int num_keys, const char* const* keys_list, const size_t* keys_list_sizes);
extern void rocksdb_writebatch_wi_delete_range(
rocksdb_writebatch_wi_t* b, const char* start_key, size_t start_key_len,
const char* end_key, size_t end_key_len);
extern void rocksdb_writebatch_wi_delete_range_cf(
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
const char* start_key, size_t start_key_len, const char* end_key,
size_t end_key_len);
extern void rocksdb_writebatch_wi_delete_rangev(
rocksdb_writebatch_wi_t* b, int num_keys, const char* const* start_keys_list,
const size_t* start_keys_list_sizes, const char* const* end_keys_list,
const size_t* end_keys_list_sizes);
extern void rocksdb_writebatch_wi_delete_rangev_cf(
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
int num_keys, const char* const* start_keys_list,
const size_t* start_keys_list_sizes, const char* const* end_keys_list,
const size_t* end_keys_list_sizes);
extern void rocksdb_writebatch_wi_put_log_data(
rocksdb_writebatch_wi_t*, const char* blob, size_t len);
extern void rocksdb_writebatch_wi_iterate(
rocksdb_writebatch_wi_t* b,
void* state,
void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen),
void (*deleted)(void*, const char* k, size_t klen));
extern const char* rocksdb_writebatch_wi_data(
rocksdb_writebatch_wi_t* b,
size_t* size);
extern void rocksdb_writebatch_wi_set_save_point(
rocksdb_writebatch_wi_t*);
extern void rocksdb_writebatch_wi_rollback_to_save_point(
rocksdb_writebatch_wi_t*, char** errptr);
extern char* rocksdb_writebatch_wi_get_from_batch(
rocksdb_writebatch_wi_t* wbwi,
const rocksdb_options_t* options,
const char* key, size_t keylen,
size_t* vallen,
char** errptr);
extern char* rocksdb_writebatch_wi_get_from_batch_cf(
rocksdb_writebatch_wi_t* wbwi,
const rocksdb_options_t* options,
rocksdb_column_family_handle_t* column_family,
const char* key, size_t keylen,
size_t* vallen,
char** errptr);
extern char* rocksdb_writebatch_wi_get_from_batch_and_db(
rocksdb_writebatch_wi_t* wbwi,
rocksdb_t* db,
const rocksdb_readoptions_t* options,
const char* key, size_t keylen,
size_t* vallen,
char** errptr);
extern char* rocksdb_writebatch_wi_get_from_batch_and_db_cf(
rocksdb_writebatch_wi_t* wbwi,
rocksdb_t* db,
const rocksdb_readoptions_t* options,
rocksdb_column_family_handle_t* column_family,
const char* key, size_t keylen,
size_t* vallen,
char** errptr);
extern void rocksdb_write_writebatch_wi(
rocksdb_t* db,
const rocksdb_writeoptions_t* options,
rocksdb_writebatch_wi_t* wbwi,
char** errptr);
extern rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base(
rocksdb_writebatch_wi_t* wbwi,
rocksdb_iterator_t* base_iterator);
extern rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base_cf(
rocksdb_writebatch_wi_t* wbwi,
rocksdb_iterator_t* base_iterator,
rocksdb_column_family_handle_t* cf);
/* Block based table options */
extern rocksdb_block_based_table_options_t*
rocksdb_block_based_options_create();
extern void rocksdb_block_based_options_destroy(
rocksdb_block_based_table_options_t* options);
extern void rocksdb_block_based_options_set_block_size(
rocksdb_block_based_table_options_t* options, size_t block_size);
extern void
rocksdb_block_based_options_set_block_size_deviation(
rocksdb_block_based_table_options_t* options, int block_size_deviation);
extern void
rocksdb_block_based_options_set_block_restart_interval(
rocksdb_block_based_table_options_t* options, int block_restart_interval);
extern void rocksdb_block_based_options_set_filter_policy(
rocksdb_block_based_table_options_t* options,
rocksdb_filterpolicy_t* filter_policy);
extern void rocksdb_block_based_options_set_no_block_cache(
rocksdb_block_based_table_options_t* options, unsigned char no_block_cache);
extern void rocksdb_block_based_options_set_block_cache(
rocksdb_block_based_table_options_t* options, rocksdb_cache_t* block_cache);
extern void
rocksdb_block_based_options_set_block_cache_compressed(
rocksdb_block_based_table_options_t* options,
rocksdb_cache_t* block_cache_compressed);
extern void
rocksdb_block_based_options_set_whole_key_filtering(
rocksdb_block_based_table_options_t*, unsigned char);
extern void rocksdb_block_based_options_set_format_version(
rocksdb_block_based_table_options_t*, int);
enum {
rocksdb_block_based_table_index_type_binary_search = 0,
rocksdb_block_based_table_index_type_hash_search = 1,
rocksdb_block_based_table_index_type_two_level_index_search = 2,
};
extern void rocksdb_block_based_options_set_index_type(
rocksdb_block_based_table_options_t*, int); // uses one of the above enums
extern void
rocksdb_block_based_options_set_hash_index_allow_collision(
rocksdb_block_based_table_options_t*, unsigned char);
extern void
rocksdb_block_based_options_set_cache_index_and_filter_blocks(
rocksdb_block_based_table_options_t*, unsigned char);
extern void
rocksdb_block_based_options_set_pin_l0_filter_and_index_blocks_in_cache(
rocksdb_block_based_table_options_t*, unsigned char);
extern void rocksdb_options_set_block_based_table_factory(
rocksdb_options_t* opt, rocksdb_block_based_table_options_t* table_options);
/* Cuckoo table options */
extern rocksdb_cuckoo_table_options_t*
rocksdb_cuckoo_options_create();
extern void rocksdb_cuckoo_options_destroy(
rocksdb_cuckoo_table_options_t* options);
extern void rocksdb_cuckoo_options_set_hash_ratio(
rocksdb_cuckoo_table_options_t* options, double v);
extern void rocksdb_cuckoo_options_set_max_search_depth(
rocksdb_cuckoo_table_options_t* options, uint32_t v);
extern void rocksdb_cuckoo_options_set_cuckoo_block_size(
rocksdb_cuckoo_table_options_t* options, uint32_t v);
extern void
rocksdb_cuckoo_options_set_identity_as_first_hash(
rocksdb_cuckoo_table_options_t* options, unsigned char v);
extern void rocksdb_cuckoo_options_set_use_module_hash(
rocksdb_cuckoo_table_options_t* options, unsigned char v);
extern void rocksdb_options_set_cuckoo_table_factory(
rocksdb_options_t* opt, rocksdb_cuckoo_table_options_t* table_options);
/* Options */
extern void rocksdb_set_options(
rocksdb_t* db, int count, const char* const keys[], const char* const values[], char** errptr);
extern rocksdb_options_t* rocksdb_options_create();
extern void rocksdb_options_destroy(rocksdb_options_t*);
extern void rocksdb_options_increase_parallelism(
rocksdb_options_t* opt, int total_threads);
extern void rocksdb_options_optimize_for_point_lookup(
rocksdb_options_t* opt, uint64_t block_cache_size_mb);
extern void rocksdb_options_optimize_level_style_compaction(
rocksdb_options_t* opt, uint64_t memtable_memory_budget);
extern void
rocksdb_options_optimize_universal_style_compaction(
rocksdb_options_t* opt, uint64_t memtable_memory_budget);
extern void rocksdb_options_set_compaction_filter(
rocksdb_options_t*, rocksdb_compactionfilter_t*);
extern void rocksdb_options_set_compaction_filter_factory(
rocksdb_options_t*, rocksdb_compactionfilterfactory_t*);
extern void rocksdb_options_compaction_readahead_size(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_comparator(
rocksdb_options_t*, rocksdb_comparator_t*);
extern void rocksdb_options_set_merge_operator(
rocksdb_options_t*, rocksdb_mergeoperator_t*);
extern void rocksdb_options_set_uint64add_merge_operator(
rocksdb_options_t*);
extern void rocksdb_options_set_compression_per_level(
rocksdb_options_t* opt, int* level_values, size_t num_levels);
extern void rocksdb_options_set_create_if_missing(
rocksdb_options_t*, unsigned char);
extern void
rocksdb_options_set_create_missing_column_families(rocksdb_options_t*,
unsigned char);
extern void rocksdb_options_set_error_if_exists(
rocksdb_options_t*, unsigned char);
extern void rocksdb_options_set_paranoid_checks(
rocksdb_options_t*, unsigned char);
extern void rocksdb_options_set_db_paths(rocksdb_options_t*,
const rocksdb_dbpath_t** path_values,
size_t num_paths);
extern void rocksdb_options_set_env(rocksdb_options_t*,
rocksdb_env_t*);
extern void rocksdb_options_set_info_log(rocksdb_options_t*,
rocksdb_logger_t*);
extern void rocksdb_options_set_info_log_level(
rocksdb_options_t*, int);
extern void rocksdb_options_set_write_buffer_size(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_db_write_buffer_size(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_max_open_files(
rocksdb_options_t*, int);
extern void rocksdb_options_set_max_file_opening_threads(
rocksdb_options_t*, int);
extern void rocksdb_options_set_max_total_wal_size(
rocksdb_options_t* opt, uint64_t n);
extern void rocksdb_options_set_compression_options(
rocksdb_options_t*, int, int, int, int);
extern void rocksdb_options_set_prefix_extractor(
rocksdb_options_t*, rocksdb_slicetransform_t*);
extern void rocksdb_options_set_num_levels(
rocksdb_options_t*, int);
extern void
rocksdb_options_set_level0_file_num_compaction_trigger(rocksdb_options_t*, int);
extern void
rocksdb_options_set_level0_slowdown_writes_trigger(rocksdb_options_t*, int);
extern void rocksdb_options_set_level0_stop_writes_trigger(
rocksdb_options_t*, int);
extern void rocksdb_options_set_max_mem_compaction_level(
rocksdb_options_t*, int);
extern void rocksdb_options_set_target_file_size_base(
rocksdb_options_t*, uint64_t);
extern void rocksdb_options_set_target_file_size_multiplier(
rocksdb_options_t*, int);
extern void rocksdb_options_set_max_bytes_for_level_base(
rocksdb_options_t*, uint64_t);
extern void
rocksdb_options_set_level_compaction_dynamic_level_bytes(rocksdb_options_t*,
unsigned char);
extern void
rocksdb_options_set_max_bytes_for_level_multiplier(rocksdb_options_t*, double);
extern void
rocksdb_options_set_max_bytes_for_level_multiplier_additional(
rocksdb_options_t*, int* level_values, size_t num_levels);
extern void rocksdb_options_enable_statistics(
rocksdb_options_t*);
extern void
rocksdb_options_set_skip_stats_update_on_db_open(rocksdb_options_t* opt,
unsigned char val);
/* returns a pointer to a malloc()-ed, null terminated string */
extern char* rocksdb_options_statistics_get_string(
rocksdb_options_t* opt);
extern void rocksdb_options_set_max_write_buffer_number(
rocksdb_options_t*, int);
extern void
rocksdb_options_set_min_write_buffer_number_to_merge(rocksdb_options_t*, int);
extern void
rocksdb_options_set_max_write_buffer_number_to_maintain(rocksdb_options_t*,
int);
extern void rocksdb_options_set_max_background_compactions(
rocksdb_options_t*, int);
extern void rocksdb_options_set_base_background_compactions(
rocksdb_options_t*, int);
extern void rocksdb_options_set_max_background_flushes(
rocksdb_options_t*, int);
extern void rocksdb_options_set_max_log_file_size(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_log_file_time_to_roll(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_keep_log_file_num(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_recycle_log_file_num(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_soft_rate_limit(
rocksdb_options_t*, double);
extern void rocksdb_options_set_hard_rate_limit(
rocksdb_options_t*, double);
extern void rocksdb_options_set_soft_pending_compaction_bytes_limit(
rocksdb_options_t* opt, size_t v);
extern void rocksdb_options_set_hard_pending_compaction_bytes_limit(
rocksdb_options_t* opt, size_t v);
extern void
rocksdb_options_set_rate_limit_delay_max_milliseconds(rocksdb_options_t*,
unsigned int);
extern void rocksdb_options_set_max_manifest_file_size(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_table_cache_numshardbits(
rocksdb_options_t*, int);
extern void
rocksdb_options_set_table_cache_remove_scan_count_limit(rocksdb_options_t*,
int);
extern void rocksdb_options_set_arena_block_size(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_use_fsync(
rocksdb_options_t*, int);
extern void rocksdb_options_set_db_log_dir(
rocksdb_options_t*, const char*);
extern void rocksdb_options_set_wal_dir(rocksdb_options_t*,
const char*);
extern void rocksdb_options_set_WAL_ttl_seconds(
rocksdb_options_t*, uint64_t);
extern void rocksdb_options_set_WAL_size_limit_MB(
rocksdb_options_t*, uint64_t);
extern void rocksdb_options_set_manifest_preallocation_size(
rocksdb_options_t*, size_t);
extern void
rocksdb_options_set_purge_redundant_kvs_while_flush(rocksdb_options_t*,
unsigned char);
extern void rocksdb_options_set_allow_mmap_reads(
rocksdb_options_t*, unsigned char);
extern void rocksdb_options_set_allow_mmap_writes(
rocksdb_options_t*, unsigned char);
extern void rocksdb_options_set_use_direct_reads(
rocksdb_options_t*, unsigned char);
extern void
rocksdb_options_set_use_direct_io_for_flush_and_compaction(rocksdb_options_t*,
unsigned char);
extern void rocksdb_options_set_is_fd_close_on_exec(
rocksdb_options_t*, unsigned char);
extern void rocksdb_options_set_skip_log_error_on_recovery(
rocksdb_options_t*, unsigned char);
extern void rocksdb_options_set_stats_dump_period_sec(
rocksdb_options_t*, unsigned int);
extern void rocksdb_options_set_advise_random_on_open(
rocksdb_options_t*, unsigned char);
extern void
rocksdb_options_set_access_hint_on_compaction_start(rocksdb_options_t*, int);
extern void rocksdb_options_set_use_adaptive_mutex(
rocksdb_options_t*, unsigned char);
extern void rocksdb_options_set_bytes_per_sync(
rocksdb_options_t*, uint64_t);
extern void rocksdb_options_set_wal_bytes_per_sync(
rocksdb_options_t*, uint64_t);
extern void
rocksdb_options_set_writable_file_max_buffer_size(rocksdb_options_t*, uint64_t);
extern void
rocksdb_options_set_allow_concurrent_memtable_write(rocksdb_options_t*,
unsigned char);
extern void
rocksdb_options_set_enable_write_thread_adaptive_yield(rocksdb_options_t*,
unsigned char);
extern void
rocksdb_options_set_max_sequential_skip_in_iterations(rocksdb_options_t*,
uint64_t);
extern void rocksdb_options_set_disable_auto_compactions(
rocksdb_options_t*, int);
extern void rocksdb_options_set_optimize_filters_for_hits(
rocksdb_options_t*, int);
extern void
rocksdb_options_set_delete_obsolete_files_period_micros(rocksdb_options_t*,
uint64_t);
extern void rocksdb_options_prepare_for_bulk_load(
rocksdb_options_t*);
extern void rocksdb_options_set_memtable_vector_rep(
rocksdb_options_t*);
extern void rocksdb_options_set_memtable_prefix_bloom_size_ratio(
rocksdb_options_t*, double);
extern void rocksdb_options_set_max_compaction_bytes(
rocksdb_options_t*, uint64_t);
extern void rocksdb_options_set_hash_skip_list_rep(
rocksdb_options_t*, size_t, int32_t, int32_t);
extern void rocksdb_options_set_hash_link_list_rep(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_plain_table_factory(
rocksdb_options_t*, uint32_t, int, double, size_t);
extern void rocksdb_options_set_min_level_to_compress(
rocksdb_options_t* opt, int level);
extern void rocksdb_options_set_memtable_huge_page_size(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_max_successive_merges(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_bloom_locality(
rocksdb_options_t*, uint32_t);
extern void rocksdb_options_set_inplace_update_support(
rocksdb_options_t*, unsigned char);
extern void rocksdb_options_set_inplace_update_num_locks(
rocksdb_options_t*, size_t);
extern void rocksdb_options_set_report_bg_io_stats(
rocksdb_options_t*, int);
enum {
rocksdb_tolerate_corrupted_tail_records_recovery = 0,
rocksdb_absolute_consistency_recovery = 1,
rocksdb_point_in_time_recovery = 2,
rocksdb_skip_any_corrupted_records_recovery = 3
};
extern void rocksdb_options_set_wal_recovery_mode(
rocksdb_options_t*, int);
enum {
rocksdb_no_compression = 0,
rocksdb_snappy_compression = 1,
rocksdb_zlib_compression = 2,
rocksdb_bz2_compression = 3,
rocksdb_lz4_compression = 4,
rocksdb_lz4hc_compression = 5,
rocksdb_xpress_compression = 6,
rocksdb_zstd_compression = 7
};
extern void rocksdb_options_set_compression(
rocksdb_options_t*, int);
enum {
rocksdb_level_compaction = 0,
rocksdb_universal_compaction = 1,
rocksdb_fifo_compaction = 2
};
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*);
extern void rocksdb_options_set_fifo_compaction_options(
rocksdb_options_t* opt, rocksdb_fifo_compaction_options_t* fifo);
extern void rocksdb_options_set_ratelimiter(
rocksdb_options_t* opt, rocksdb_ratelimiter_t* limiter);
/* RateLimiter */
extern rocksdb_ratelimiter_t* rocksdb_ratelimiter_create(
int64_t rate_bytes_per_sec, int64_t refill_period_us, int32_t fairness);
extern void rocksdb_ratelimiter_destroy(rocksdb_ratelimiter_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_set_ignore_snapshots(
rocksdb_compactionfilter_t*, unsigned char);
extern void rocksdb_compactionfilter_destroy(
rocksdb_compactionfilter_t*);
/* Compaction Filter Context */
extern unsigned char
rocksdb_compactionfiltercontext_is_full_compaction(
rocksdb_compactionfiltercontext_t* context);
extern unsigned char
rocksdb_compactionfiltercontext_is_manual_compaction(
rocksdb_compactionfiltercontext_t* context);
/* Compaction Filter Factory */
extern rocksdb_compactionfilterfactory_t*
rocksdb_compactionfilterfactory_create(
void* state, void (*destructor)(void*),
rocksdb_compactionfilter_t* (*create_compaction_filter)(
void*, rocksdb_compactionfiltercontext_t* context),
const char* (*name)(void*));
extern void rocksdb_compactionfilterfactory_destroy(
rocksdb_compactionfilterfactory_t*);
/* Comparator */
extern rocksdb_comparator_t* rocksdb_comparator_create(
void* state, void (*destructor)(void*),
int (*compare)(void*, const char* a, size_t alen, const char* b,
size_t blen),
const char* (*name)(void*));
extern void rocksdb_comparator_destroy(
rocksdb_comparator_t*);
/* Filter policy */
extern rocksdb_filterpolicy_t* rocksdb_filterpolicy_create(
void* state, void (*destructor)(void*),
char* (*create_filter)(void*, const char* const* key_array,
const size_t* key_length_array, int num_keys,
size_t* filter_length),
unsigned char (*key_may_match)(void*, const char* key, size_t length,
const char* filter, size_t filter_length),
void (*delete_filter)(void*, const char* filter, size_t filter_length),
const char* (*name)(void*));
extern void rocksdb_filterpolicy_destroy(
rocksdb_filterpolicy_t*);
extern rocksdb_filterpolicy_t*
rocksdb_filterpolicy_create_bloom(int bits_per_key);
extern rocksdb_filterpolicy_t*
rocksdb_filterpolicy_create_bloom_full(int bits_per_key);
/* Merge Operator */
extern rocksdb_mergeoperator_t*
rocksdb_mergeoperator_create(
void* state, void (*destructor)(void*),
char* (*full_merge)(void*, const char* key, size_t key_length,
const char* existing_value,
size_t existing_value_length,
const char* const* operands_list,
const size_t* operands_list_length, int num_operands,
unsigned char* success, size_t* new_value_length),
char* (*partial_merge)(void*, const char* key, size_t key_length,
const char* const* operands_list,
const size_t* operands_list_length, int num_operands,
unsigned char* success, size_t* new_value_length),
void (*delete_value)(void*, const char* value, size_t value_length),
const char* (*name)(void*));
extern void rocksdb_mergeoperator_destroy(
rocksdb_mergeoperator_t*);
/* Read options */
extern rocksdb_readoptions_t* rocksdb_readoptions_create();
extern void rocksdb_readoptions_destroy(
rocksdb_readoptions_t*);
extern void rocksdb_readoptions_set_verify_checksums(
rocksdb_readoptions_t*, unsigned char);
extern void rocksdb_readoptions_set_fill_cache(
rocksdb_readoptions_t*, unsigned char);
extern void rocksdb_readoptions_set_snapshot(
rocksdb_readoptions_t*, const rocksdb_snapshot_t*);
extern void rocksdb_readoptions_set_iterate_upper_bound(
rocksdb_readoptions_t*, const char* key, size_t keylen);
extern void rocksdb_readoptions_set_read_tier(
rocksdb_readoptions_t*, int);
extern void rocksdb_readoptions_set_tailing(
rocksdb_readoptions_t*, unsigned char);
extern void rocksdb_readoptions_set_readahead_size(
rocksdb_readoptions_t*, size_t);
extern void rocksdb_readoptions_set_pin_data(
rocksdb_readoptions_t*, unsigned char);
extern void rocksdb_readoptions_set_total_order_seek(
rocksdb_readoptions_t*, unsigned char);
/* Write options */
extern rocksdb_writeoptions_t*
rocksdb_writeoptions_create();
extern void rocksdb_writeoptions_destroy(
rocksdb_writeoptions_t*);
extern void rocksdb_writeoptions_set_sync(
rocksdb_writeoptions_t*, unsigned char);
extern void rocksdb_writeoptions_disable_WAL(
rocksdb_writeoptions_t* opt, int disable);
/* Compact range options */
extern rocksdb_compactoptions_t*
rocksdb_compactoptions_create();
extern void rocksdb_compactoptions_destroy(
rocksdb_compactoptions_t*);
extern void
rocksdb_compactoptions_set_exclusive_manual_compaction(
rocksdb_compactoptions_t*, unsigned char);
extern void rocksdb_compactoptions_set_change_level(
rocksdb_compactoptions_t*, unsigned char);
extern void rocksdb_compactoptions_set_target_level(
rocksdb_compactoptions_t*, int);
/* Flush options */
extern rocksdb_flushoptions_t*
rocksdb_flushoptions_create();
extern void rocksdb_flushoptions_destroy(
rocksdb_flushoptions_t*);
extern void rocksdb_flushoptions_set_wait(
rocksdb_flushoptions_t*, unsigned char);
/* Cache */
extern rocksdb_cache_t* rocksdb_cache_create_lru(
size_t capacity);
extern void rocksdb_cache_destroy(rocksdb_cache_t* cache);
extern void rocksdb_cache_set_capacity(
rocksdb_cache_t* cache, size_t capacity);
extern size_t
rocksdb_cache_get_usage(rocksdb_cache_t* cache);
extern size_t
rocksdb_cache_get_pinned_usage(rocksdb_cache_t* cache);
/* DBPath */
extern rocksdb_dbpath_t* rocksdb_dbpath_create(const char* path, uint64_t target_size);
extern void rocksdb_dbpath_destroy(rocksdb_dbpath_t*);
/* Env */
extern rocksdb_env_t* rocksdb_create_default_env();
extern rocksdb_env_t* rocksdb_create_mem_env();
extern void rocksdb_env_set_background_threads(
rocksdb_env_t* env, int n);
extern void
rocksdb_env_set_high_priority_background_threads(rocksdb_env_t* env, int n);
extern void rocksdb_env_join_all_threads(
rocksdb_env_t* env);
extern void rocksdb_env_destroy(rocksdb_env_t*);
extern rocksdb_envoptions_t* rocksdb_envoptions_create();
extern void rocksdb_envoptions_destroy(
rocksdb_envoptions_t* opt);
/* SstFile */
extern rocksdb_sstfilewriter_t*
rocksdb_sstfilewriter_create(const rocksdb_envoptions_t* env,
const rocksdb_options_t* io_options);
extern rocksdb_sstfilewriter_t*
rocksdb_sstfilewriter_create_with_comparator(
const rocksdb_envoptions_t* env, const rocksdb_options_t* io_options,
const rocksdb_comparator_t* comparator);
extern void rocksdb_sstfilewriter_open(
rocksdb_sstfilewriter_t* writer, const char* name, char** errptr);
extern void rocksdb_sstfilewriter_add(
rocksdb_sstfilewriter_t* writer, const char* key, size_t keylen,
const char* val, size_t vallen, char** errptr);
extern void rocksdb_sstfilewriter_put(
rocksdb_sstfilewriter_t* writer, const char* key, size_t keylen,
const char* val, size_t vallen, char** errptr);
extern void rocksdb_sstfilewriter_merge(
rocksdb_sstfilewriter_t* writer, const char* key, size_t keylen,
const char* val, size_t vallen, char** errptr);
extern void rocksdb_sstfilewriter_delete(
rocksdb_sstfilewriter_t* writer, const char* key, size_t keylen,
char** errptr);
extern void rocksdb_sstfilewriter_finish(
rocksdb_sstfilewriter_t* writer, char** errptr);
extern void rocksdb_sstfilewriter_destroy(
rocksdb_sstfilewriter_t* writer);
extern rocksdb_ingestexternalfileoptions_t*
rocksdb_ingestexternalfileoptions_create();
extern void
rocksdb_ingestexternalfileoptions_set_move_files(
rocksdb_ingestexternalfileoptions_t* opt, unsigned char move_files);
extern void
rocksdb_ingestexternalfileoptions_set_snapshot_consistency(
rocksdb_ingestexternalfileoptions_t* opt,
unsigned char snapshot_consistency);
extern void
rocksdb_ingestexternalfileoptions_set_allow_global_seqno(
rocksdb_ingestexternalfileoptions_t* opt, unsigned char allow_global_seqno);
extern void
rocksdb_ingestexternalfileoptions_set_allow_blocking_flush(
rocksdb_ingestexternalfileoptions_t* opt,
unsigned char allow_blocking_flush);
extern void
rocksdb_ingestexternalfileoptions_set_ingest_behind(
rocksdb_ingestexternalfileoptions_t* opt,
unsigned char ingest_behind);
extern void rocksdb_ingestexternalfileoptions_destroy(
rocksdb_ingestexternalfileoptions_t* opt);
extern void rocksdb_ingest_external_file(
rocksdb_t* db, const char* const* file_list, const size_t list_len,
const rocksdb_ingestexternalfileoptions_t* opt, char** errptr);
extern void rocksdb_ingest_external_file_cf(
rocksdb_t* db, rocksdb_column_family_handle_t* handle,
const char* const* file_list, const size_t list_len,
const rocksdb_ingestexternalfileoptions_t* opt, char** errptr);
/* SliceTransform */
extern rocksdb_slicetransform_t*
rocksdb_slicetransform_create(
void* state, void (*destructor)(void*),
char* (*transform)(void*, const char* key, size_t length,
size_t* dst_length),
unsigned char (*in_domain)(void*, const char* key, size_t length),
unsigned char (*in_range)(void*, const char* key, size_t length),
const char* (*name)(void*));
extern rocksdb_slicetransform_t*
rocksdb_slicetransform_create_fixed_prefix(size_t);
extern rocksdb_slicetransform_t*
rocksdb_slicetransform_create_noop();
extern void rocksdb_slicetransform_destroy(
rocksdb_slicetransform_t*);
/* Universal Compaction options */
enum {
rocksdb_similar_size_compaction_stop_style = 0,
rocksdb_total_size_compaction_stop_style = 1
};
extern rocksdb_universal_compaction_options_t*
rocksdb_universal_compaction_options_create();
extern void
rocksdb_universal_compaction_options_set_size_ratio(
rocksdb_universal_compaction_options_t*, int);
extern void
rocksdb_universal_compaction_options_set_min_merge_width(
rocksdb_universal_compaction_options_t*, int);
extern void
rocksdb_universal_compaction_options_set_max_merge_width(
rocksdb_universal_compaction_options_t*, int);
extern void
rocksdb_universal_compaction_options_set_max_size_amplification_percent(
rocksdb_universal_compaction_options_t*, int);
extern void
rocksdb_universal_compaction_options_set_compression_size_percent(
rocksdb_universal_compaction_options_t*, int);
extern void
rocksdb_universal_compaction_options_set_stop_style(
rocksdb_universal_compaction_options_t*, int);
extern void rocksdb_universal_compaction_options_destroy(
rocksdb_universal_compaction_options_t*);
extern rocksdb_fifo_compaction_options_t*
rocksdb_fifo_compaction_options_create();
extern void
rocksdb_fifo_compaction_options_set_max_table_files_size(
rocksdb_fifo_compaction_options_t* fifo_opts, uint64_t size);
extern void rocksdb_fifo_compaction_options_destroy(
rocksdb_fifo_compaction_options_t* fifo_opts);
extern int rocksdb_livefiles_count(
const rocksdb_livefiles_t*);
extern const char* rocksdb_livefiles_name(
const rocksdb_livefiles_t*, int index);
extern int rocksdb_livefiles_level(
const rocksdb_livefiles_t*, int index);
extern size_t
rocksdb_livefiles_size(const rocksdb_livefiles_t*, int index);
extern const char* rocksdb_livefiles_smallestkey(
const rocksdb_livefiles_t*, int index, size_t* size);
extern const char* rocksdb_livefiles_largestkey(
const rocksdb_livefiles_t*, int index, size_t* size);
extern void rocksdb_livefiles_destroy(
const rocksdb_livefiles_t*);
/* Utility Helpers */
extern void rocksdb_get_options_from_string(
const rocksdb_options_t* base_options, const char* opts_str,
rocksdb_options_t* new_options, char** errptr);
extern void rocksdb_delete_file_in_range(
rocksdb_t* db, const char* start_key, size_t start_key_len,
const char* limit_key, size_t limit_key_len, char** errptr);
extern void rocksdb_delete_file_in_range_cf(
rocksdb_t* db, rocksdb_column_family_handle_t* column_family,
const char* start_key, size_t start_key_len, const char* limit_key,
size_t limit_key_len, char** errptr);
/* Transactions */
extern rocksdb_column_family_handle_t*
rocksdb_transactiondb_create_column_family(
rocksdb_transactiondb_t* txn_db,
const rocksdb_options_t* column_family_options,
const char* column_family_name, char** errptr);
extern rocksdb_transactiondb_t* rocksdb_transactiondb_open(
const rocksdb_options_t* options,
const rocksdb_transactiondb_options_t* txn_db_options, const char* name,
char** errptr);
extern const rocksdb_snapshot_t*
rocksdb_transactiondb_create_snapshot(rocksdb_transactiondb_t* txn_db);
extern void rocksdb_transactiondb_release_snapshot(
rocksdb_transactiondb_t* txn_db, const rocksdb_snapshot_t* snapshot);
extern rocksdb_transaction_t* rocksdb_transaction_begin(
rocksdb_transactiondb_t* txn_db,
const rocksdb_writeoptions_t* write_options,
const rocksdb_transaction_options_t* txn_options,
rocksdb_transaction_t* old_txn);
extern void rocksdb_transaction_commit(
rocksdb_transaction_t* txn, char** errptr);
extern void rocksdb_transaction_rollback(
rocksdb_transaction_t* txn, char** errptr);
extern void rocksdb_transaction_set_savepoint(
rocksdb_transaction_t* txn);
extern void rocksdb_transaction_rollback_to_savepoint(
rocksdb_transaction_t* txn, char** errptr);
extern void rocksdb_transaction_destroy(
rocksdb_transaction_t* txn);
// This snapshot should be freed using rocksdb_free
extern const rocksdb_snapshot_t*
rocksdb_transaction_get_snapshot(rocksdb_transaction_t* txn);
extern char* rocksdb_transaction_get(
rocksdb_transaction_t* txn, const rocksdb_readoptions_t* options,
const char* key, size_t klen, size_t* vlen, char** errptr);
extern char* rocksdb_transaction_get_cf(
rocksdb_transaction_t* txn, const rocksdb_readoptions_t* options,
rocksdb_column_family_handle_t* column_family, const char* key, size_t klen,
size_t* vlen, char** errptr);
extern char* rocksdb_transaction_get_for_update(
rocksdb_transaction_t* txn, const rocksdb_readoptions_t* options,
const char* key, size_t klen, size_t* vlen, unsigned char exclusive,
char** errptr);
extern char* rocksdb_transactiondb_get(
rocksdb_transactiondb_t* txn_db, const rocksdb_readoptions_t* options,
const char* key, size_t klen, size_t* vlen, char** errptr);
extern char* rocksdb_transactiondb_get_cf(
rocksdb_transactiondb_t* txn_db, const rocksdb_readoptions_t* options,
rocksdb_column_family_handle_t* column_family, const char* key,
size_t keylen, size_t* vallen, char** errptr);
extern void rocksdb_transaction_put(
rocksdb_transaction_t* txn, const char* key, size_t klen, const char* val,
size_t vlen, char** errptr);
extern void rocksdb_transaction_put_cf(
rocksdb_transaction_t* txn, rocksdb_column_family_handle_t* column_family,
const char* key, size_t klen, const char* val, size_t vlen, char** errptr);
extern void rocksdb_transactiondb_put(
rocksdb_transactiondb_t* txn_db, const rocksdb_writeoptions_t* options,
const char* key, size_t klen, const char* val, size_t vlen, char** errptr);
extern void rocksdb_transactiondb_put_cf(
rocksdb_transactiondb_t* txn_db, const rocksdb_writeoptions_t* options,
rocksdb_column_family_handle_t* column_family, const char* key,
size_t keylen, const char* val, size_t vallen, char** errptr);
extern void rocksdb_transactiondb_write(
rocksdb_transactiondb_t* txn_db, const rocksdb_writeoptions_t* options,
rocksdb_writebatch_t *batch, char** errptr);
extern void rocksdb_transaction_merge(
rocksdb_transaction_t* txn, const char* key, size_t klen, const char* val,
size_t vlen, char** errptr);
extern void rocksdb_transactiondb_merge(
rocksdb_transactiondb_t* txn_db, const rocksdb_writeoptions_t* options,
const char* key, size_t klen, const char* val, size_t vlen, char** errptr);
extern void rocksdb_transaction_delete(
rocksdb_transaction_t* txn, const char* key, size_t klen, char** errptr);
extern void rocksdb_transaction_delete_cf(
rocksdb_transaction_t* txn, rocksdb_column_family_handle_t* column_family,
const char* key, size_t klen, char** errptr);
extern void rocksdb_transactiondb_delete(
rocksdb_transactiondb_t* txn_db, const rocksdb_writeoptions_t* options,
const char* key, size_t klen, char** errptr);
extern void rocksdb_transactiondb_delete_cf(
rocksdb_transactiondb_t* txn_db, const rocksdb_writeoptions_t* options,
rocksdb_column_family_handle_t* column_family, const char* key,
size_t keylen, char** errptr);
extern rocksdb_iterator_t*
rocksdb_transaction_create_iterator(rocksdb_transaction_t* txn,
const rocksdb_readoptions_t* options);
extern rocksdb_iterator_t*
rocksdb_transaction_create_iterator_cf(
rocksdb_transaction_t* txn, const rocksdb_readoptions_t* options,
rocksdb_column_family_handle_t* column_family);
extern rocksdb_iterator_t*
rocksdb_transactiondb_create_iterator(rocksdb_transactiondb_t* txn_db,
const rocksdb_readoptions_t* options);
extern void rocksdb_transactiondb_close(
rocksdb_transactiondb_t* txn_db);
extern rocksdb_checkpoint_t*
rocksdb_transactiondb_checkpoint_object_create(rocksdb_transactiondb_t* txn_db,
char** errptr);
extern rocksdb_optimistictransactiondb_t*
rocksdb_optimistictransactiondb_open(const rocksdb_options_t* options,
const char* name, char** errptr);
extern rocksdb_optimistictransactiondb_t*
rocksdb_optimistictransactiondb_open_column_families(
const rocksdb_options_t* options, const char* name, int num_column_families,
const char** column_family_names,
const rocksdb_options_t** column_family_options,
rocksdb_column_family_handle_t** column_family_handles, char** errptr);
extern rocksdb_t*
rocksdb_optimistictransactiondb_get_base_db(
rocksdb_optimistictransactiondb_t* otxn_db);
extern void rocksdb_optimistictransactiondb_close_base_db(
rocksdb_t* base_db);
extern rocksdb_transaction_t*
rocksdb_optimistictransaction_begin(
rocksdb_optimistictransactiondb_t* otxn_db,
const rocksdb_writeoptions_t* write_options,
const rocksdb_optimistictransaction_options_t* otxn_options,
rocksdb_transaction_t* old_txn);
extern void rocksdb_optimistictransactiondb_close(
rocksdb_optimistictransactiondb_t* otxn_db);
/* Transaction Options */
extern rocksdb_transactiondb_options_t*
rocksdb_transactiondb_options_create();
extern void rocksdb_transactiondb_options_destroy(
rocksdb_transactiondb_options_t* opt);
extern void rocksdb_transactiondb_options_set_max_num_locks(
rocksdb_transactiondb_options_t* opt, int64_t max_num_locks);
extern void rocksdb_transactiondb_options_set_num_stripes(
rocksdb_transactiondb_options_t* opt, size_t num_stripes);
extern void
rocksdb_transactiondb_options_set_transaction_lock_timeout(
rocksdb_transactiondb_options_t* opt, int64_t txn_lock_timeout);
extern void
rocksdb_transactiondb_options_set_default_lock_timeout(
rocksdb_transactiondb_options_t* opt, int64_t default_lock_timeout);
extern rocksdb_transaction_options_t*
rocksdb_transaction_options_create();
extern void rocksdb_transaction_options_destroy(
rocksdb_transaction_options_t* opt);
extern void rocksdb_transaction_options_set_set_snapshot(
rocksdb_transaction_options_t* opt, unsigned char v);
extern void rocksdb_transaction_options_set_deadlock_detect(
rocksdb_transaction_options_t* opt, unsigned char v);
extern void rocksdb_transaction_options_set_lock_timeout(
rocksdb_transaction_options_t* opt, int64_t lock_timeout);
extern void rocksdb_transaction_options_set_expiration(
rocksdb_transaction_options_t* opt, int64_t expiration);
extern void
rocksdb_transaction_options_set_deadlock_detect_depth(
rocksdb_transaction_options_t* opt, int64_t depth);
extern void
rocksdb_transaction_options_set_max_write_batch_size(
rocksdb_transaction_options_t* opt, size_t size);
extern rocksdb_optimistictransaction_options_t*
rocksdb_optimistictransaction_options_create();
extern void rocksdb_optimistictransaction_options_destroy(
rocksdb_optimistictransaction_options_t* opt);
extern void
rocksdb_optimistictransaction_options_set_set_snapshot(
rocksdb_optimistictransaction_options_t* opt, unsigned char v);
// referring to convention (3), this should be used by client
// to free memory that was malloc()ed
extern void rocksdb_free(void* ptr);
extern rocksdb_pinnableslice_t* rocksdb_get_pinned(
rocksdb_t* db, const rocksdb_readoptions_t* options, const char* key,
size_t keylen, char** errptr);
extern rocksdb_pinnableslice_t* rocksdb_get_pinned_cf(
rocksdb_t* db, const rocksdb_readoptions_t* options,
rocksdb_column_family_handle_t* column_family, const char* key,
size_t keylen, char** errptr);
extern void rocksdb_pinnableslice_destroy(
rocksdb_pinnableslice_t* v);
extern const char* rocksdb_pinnableslice_value(
const rocksdb_pinnableslice_t* t, size_t* vlen);
]]
local rocksdb = ffi.load('librocksdb', true)
if not rocksdb then
error("load rocksdb failed.")
return
end
local function create_options(options)
options = options or {}
local c_options = rocksdb.rocksdb_options_create()
if options.create_if_missing then rocksdb.rocksdb_options_set_create_if_missing(c_options,1) end
if options.error_if_exists then rocksdb.rocksdb_options_set_error_if_exists(c_options,1) end
if options.compression then rocksdb.rocksdb_options_set_compression(c_options,1) end
return c_options
end
local function create_read_options(options)
options = options or {}
local c_options = rocksdb.rocksdb_readoptions_create()
return c_options
end
local function create_write_options(options)
options = options or {}
local c_options = rocksdb.rocksdb_writeoptions_create()
return c_options
end
local ok, new_tab = pcall(require, "table.new")
if not ok or type(new_tab) ~= "function" then
new_tab = function (narr, nrec) return {} end
end
local _M = new_tab(0, 20)
_M._VERSION = '0.0.1'
local _mt = {__index = _M}
_M._db = nil
_M._options = nil
_M._batch = false
_M._iterator = nil
-- utils function
function string.startswith(str, start)
return string.sub(str, 1, str.len(start)) == start
end
-- end utils function
function _M.new(self, filename, options)
local ctx = {}
setmetatable(ctx, _mt)
self.__gc = function()
if self._db then
rocksdb.rocksdb_free(self._db)
end
end
if options == nil then
options = {create_if_missing=true, error_if_exists=false}
end
local c_options = create_options(options)
local c_err = ffi.new("char*[1]")
if self._db == nil then
self._db = rocksdb.rocksdb_open(c_options, filename, c_err)
rocksdb.rocksdb_options_destroy(c_options)
end
if c_err[0] ~= nil then
error(ffi.string(c_err[0]))
end
return ctx
end
-- set key val
function _M.set(self,key,val,options)
local c_options = create_write_options(options)
local c_err = ffi.new("char*[1]")
rocksdb.rocksdb_put(self._db, c_options, key, #key, val, #val, c_err)
rocksdb.rocksdb_writeoptions_destroy(c_options)
if c_err[0] ~= nil then
error(ffi.string(c_err[0]))
end
end
-- batch set key val
function _M.batch_set(self, stable, options)
if type(stable) ~= "table" then
error("stable is not table.")
return nil
end
if self._batch then
rocksdb.rocksdb_free(self._batch)
end
if self._options then
rocksdb.rocksdb_writeoptions_destroy(self._options)
end
self._options = create_write_options(options)
self._batch = rocksdb.rocksdb_writebatch_create()
for key, val in pairs(stable) do
rocksdb.rocksdb_writebatch_put(self._batch, key, #key, val, #val)
end
local c_err = ffi.new("char*[1]")
rocksdb.rocksdb_write(self._db, self._options, self._batch, c_err)
if c_err[0] ~= nil then
error(ffi.string(c_err[0]))
end
end
-- get key
function _M.get(self, key, options)
local c_options = create_read_options(options)
local c_err = ffi.new("char*[1]")
local c_size = ffi.new("size_t[1]")
local c_result = rocksdb.rocksdb_get(self._db, c_options, key, #key, c_size, c_err)
rocksdb.rocksdb_readoptions_destroy(c_options)
if c_err[0] ~= nil then
error(ffi.string(c_err[0]))
elseif c_size[0] == 0 then
return nil
else
return ffi.string(c_result,c_size[0])
end
end
-- del key
function _M.del(self, key, options)
local c_options = create_write_options(options)
local c_err = ffi.new("char*[1]")
rocksdb.rocksdb_delete(self._db, c_options, key, #key, c_err)
rocksdb.rocksdb_writeoptions_destory(c_options)
if c_err[0] ~= nil then
error(ffi.string(c_err[0]))
return false
end
return true
end
function _M.writeoptions_destroy(self)
rocksdb.rocksdb_writeoptions_destroy(self._options)
end
function _M.readoptions_destroy(self)
rocksdb.rocksdb_readoptions_destroy(self._options)
end
-- batch delete key
function _M.batch_del(self, stable, options)
if type(stable) ~= "table" then
error("stable is not table.")
return nil
end
if self._batch then
rocksdb.rocksdb_free(self._batch)
end
if self._options then
local ok, _ = pcall(_M.writeoptions_destroy, self)
if not ok then
rocksdb.rocksdb_readoptions_destroy(self._options)
end
end
self._options = create_write_options(options)
self._batch = rocksdb.rocksdb_writebatch_create()
for _, val in pairs(stable) do
rocksdb.rocksdb_writebatch_delete(self._batch, val, #val)
end
local c_err = ffi.new("char*[1]")
rocksdb.rocksdb_write(self._db, self._options, self._batch, c_err)
if c_err[0] ~= nil then
error(ffi.string(c_err[0]))
end
end
-- delete range
function _M.delete_range(self, start, limit)
local keys = {}
self:iterator_new()
self:iterator_seek(start)
local key, _ = self:iterator_next()
while key ~= nil and key < limit do
table.insert(keys, key)
key, _ = self:iterator_next()
end
if self._options then
rocksdb.rocksdb_readoptions_destroy(self._options)
end
self._options = rocksdb.rocksdb_writeoptions_create()
self:batch_del(keys)
end
-- delete file in range
function _M.delete_file_in_range(self, start, limit)
local c_err = ffi.new("char*[1]")
rocksdb.rocksdb_delete_file_in_range(self._db, start, #start, limit, #limit, c_err)
if c_err[0] ~= nil then
error(ffi.string(c_err[0]))
end
end
-- Prefix seek
function _M.prefix_seek(self, prefix)
local prefix_extractor = rocksdb.rocksdb_slicetransform_create_fixed_prefix(#prefix)
local c_options = rocksdb.rocksdb_options_create()
rocksdb.rocksdb_options_set_prefix_extractor(c_options, prefix_extractor)
self:iterator_new()
local keys = {}
self:iterator_seek(prefix)
local key, _ = self:iterator_next()
while key ~= nil and string.startswith(key, prefix) do
table.insert(keys, key)
key, _ = self:iterator_next()
end
return keys
end
-- Prefix delete
function _M.prefix_delete(self, prefix)
local keys = self:prefix_seek(prefix)
self:batch_del(keys)
return #keys
end
-- compact range
function _M.compact_range(self, start, limit)
rocksdb.rocksdb_compact_range(self._db, start, #start, limit, #limit)
end
-- iterator operation
function _M.iterator_new(self, options)
if self._iterator then
rocksdb.rocksdb_iter_destroy(self._iterator)
local ok, _ = pcall(_M.readoptions_destroy, self)
if not ok then
rocksdb.rocksdb_writeoptions_destroy(self._options)
end
end
-- if self._options then
-- rocksdb.rocksdb_writeoptions_destroy(self._options)
-- end
self._options = create_read_options(options)
self._iterator = rocksdb.rocksdb_create_iterator(self._db, self._options)
end
function _M.iterator_first(self)
rocksdb.rocksdb_iter_seek_to_first(self._iterator)
end
function _M.iterator_last(self)
rocksdb.rocksdb_iter_seek_to_last(self._iterator)
end
function _M.iterator_seek(self,key)
rocksdb.rocksdb_iter_seek(self._iterator, key, #key)
end
function _M.iterator_next(self)
rocksdb.rocksdb_iter_next(self._iterator)
local valid = rocksdb.rocksdb_iter_valid(self._iterator)
if valid == 0 then
return nil
end
local c_key_size = ffi.new("size_t[1]")
local c_key = rocksdb.rocksdb_iter_key(self._iterator, c_key_size)
local key = ffi.string(c_key,c_key_size[0])
local c_value_size = ffi.new("size_t[1]")
local c_value = rocksdb.rocksdb_iter_value(self._iterator, c_value_size)
local value = ffi.string(c_value, c_value_size[0])
return key, value
end
-- close db
function _M.close(self)
rocksdb.rocksdb_close(self._db)
end
return _M
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment