]> git.proxmox.com Git - ceph.git/blame - ceph/src/rocksdb/db/c.cc
import quincy beta 17.1.0
[ceph.git] / ceph / src / rocksdb / db / c.cc
CommitLineData
7c673cae 1// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
11fdf7f2
TL
2// This source code is licensed under both the GPLv2 (found in the
3// COPYING file in the root directory) and Apache 2.0 License
4// (found in the LICENSE.Apache file in the root directory).
7c673cae
FG
5//
6// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7// Use of this source code is governed by a BSD-style license that can be
8// found in the LICENSE file. See the AUTHORS file for names of contributors.
9
10#ifndef ROCKSDB_LITE
11
12#include "rocksdb/c.h"
13
14#include <stdlib.h>
15#include "port/port.h"
16#include "rocksdb/cache.h"
17#include "rocksdb/compaction_filter.h"
18#include "rocksdb/comparator.h"
19#include "rocksdb/convenience.h"
20#include "rocksdb/db.h"
21#include "rocksdb/env.h"
22#include "rocksdb/filter_policy.h"
23#include "rocksdb/iterator.h"
11fdf7f2 24#include "rocksdb/memtablerep.h"
7c673cae
FG
25#include "rocksdb/merge_operator.h"
26#include "rocksdb/options.h"
11fdf7f2 27#include "rocksdb/rate_limiter.h"
7c673cae 28#include "rocksdb/slice_transform.h"
11fdf7f2
TL
29#include "rocksdb/statistics.h"
30#include "rocksdb/status.h"
7c673cae 31#include "rocksdb/table.h"
11fdf7f2 32#include "rocksdb/universal_compaction.h"
7c673cae 33#include "rocksdb/utilities/backupable_db.h"
11fdf7f2
TL
34#include "rocksdb/utilities/checkpoint.h"
35#include "rocksdb/utilities/db_ttl.h"
36#include "rocksdb/utilities/memory_util.h"
37#include "rocksdb/utilities/optimistic_transaction_db.h"
38#include "rocksdb/utilities/transaction.h"
39#include "rocksdb/utilities/transaction_db.h"
7c673cae 40#include "rocksdb/utilities/write_batch_with_index.h"
11fdf7f2
TL
41#include "rocksdb/write_batch.h"
42#include "rocksdb/perf_context.h"
7c673cae
FG
43#include "utilities/merge_operators.h"
44
11fdf7f2
TL
45#include <vector>
46#include <unordered_set>
47#include <map>
48
f67539c2
TL
49using ROCKSDB_NAMESPACE::BackupableDBOptions;
50using ROCKSDB_NAMESPACE::BackupEngine;
51using ROCKSDB_NAMESPACE::BackupID;
52using ROCKSDB_NAMESPACE::BackupInfo;
53using ROCKSDB_NAMESPACE::BatchResult;
54using ROCKSDB_NAMESPACE::BlockBasedTableOptions;
55using ROCKSDB_NAMESPACE::BottommostLevelCompaction;
56using ROCKSDB_NAMESPACE::BytewiseComparator;
57using ROCKSDB_NAMESPACE::Cache;
58using ROCKSDB_NAMESPACE::Checkpoint;
59using ROCKSDB_NAMESPACE::ColumnFamilyDescriptor;
60using ROCKSDB_NAMESPACE::ColumnFamilyHandle;
61using ROCKSDB_NAMESPACE::ColumnFamilyOptions;
62using ROCKSDB_NAMESPACE::CompactionFilter;
f67539c2
TL
63using ROCKSDB_NAMESPACE::CompactionFilterFactory;
64using ROCKSDB_NAMESPACE::CompactionOptionsFIFO;
65using ROCKSDB_NAMESPACE::CompactRangeOptions;
66using ROCKSDB_NAMESPACE::Comparator;
67using ROCKSDB_NAMESPACE::CompressionType;
68using ROCKSDB_NAMESPACE::CuckooTableOptions;
69using ROCKSDB_NAMESPACE::DB;
70using ROCKSDB_NAMESPACE::DBOptions;
71using ROCKSDB_NAMESPACE::DbPath;
72using ROCKSDB_NAMESPACE::Env;
73using ROCKSDB_NAMESPACE::EnvOptions;
74using ROCKSDB_NAMESPACE::FileLock;
75using ROCKSDB_NAMESPACE::FilterPolicy;
76using ROCKSDB_NAMESPACE::FlushOptions;
77using ROCKSDB_NAMESPACE::InfoLogLevel;
78using ROCKSDB_NAMESPACE::IngestExternalFileOptions;
79using ROCKSDB_NAMESPACE::Iterator;
80using ROCKSDB_NAMESPACE::LiveFileMetaData;
81using ROCKSDB_NAMESPACE::Logger;
82using ROCKSDB_NAMESPACE::MemoryUtil;
83using ROCKSDB_NAMESPACE::MergeOperator;
f67539c2
TL
84using ROCKSDB_NAMESPACE::NewBloomFilterPolicy;
85using ROCKSDB_NAMESPACE::NewGenericRateLimiter;
86using ROCKSDB_NAMESPACE::NewLRUCache;
87using ROCKSDB_NAMESPACE::OptimisticTransactionDB;
88using ROCKSDB_NAMESPACE::OptimisticTransactionOptions;
89using ROCKSDB_NAMESPACE::Options;
90using ROCKSDB_NAMESPACE::PerfContext;
91using ROCKSDB_NAMESPACE::PerfLevel;
92using ROCKSDB_NAMESPACE::PinnableSlice;
93using ROCKSDB_NAMESPACE::RandomAccessFile;
94using ROCKSDB_NAMESPACE::Range;
95using ROCKSDB_NAMESPACE::RateLimiter;
96using ROCKSDB_NAMESPACE::ReadOptions;
97using ROCKSDB_NAMESPACE::RestoreOptions;
98using ROCKSDB_NAMESPACE::SequentialFile;
99using ROCKSDB_NAMESPACE::Slice;
100using ROCKSDB_NAMESPACE::SliceParts;
101using ROCKSDB_NAMESPACE::SliceTransform;
102using ROCKSDB_NAMESPACE::Snapshot;
103using ROCKSDB_NAMESPACE::SstFileWriter;
104using ROCKSDB_NAMESPACE::Status;
105using ROCKSDB_NAMESPACE::Transaction;
106using ROCKSDB_NAMESPACE::TransactionDB;
107using ROCKSDB_NAMESPACE::TransactionDBOptions;
108using ROCKSDB_NAMESPACE::TransactionLogIterator;
109using ROCKSDB_NAMESPACE::TransactionOptions;
110using ROCKSDB_NAMESPACE::WALRecoveryMode;
111using ROCKSDB_NAMESPACE::WritableFile;
112using ROCKSDB_NAMESPACE::WriteBatch;
113using ROCKSDB_NAMESPACE::WriteBatchWithIndex;
114using ROCKSDB_NAMESPACE::WriteOptions;
7c673cae 115
11fdf7f2
TL
116using std::vector;
117using std::unordered_set;
7c673cae
FG
118
119extern "C" {
120
121struct rocksdb_t { DB* rep; };
122struct rocksdb_backup_engine_t { BackupEngine* rep; };
123struct rocksdb_backup_engine_info_t { std::vector<BackupInfo> rep; };
124struct rocksdb_restore_options_t { RestoreOptions rep; };
125struct rocksdb_iterator_t { Iterator* rep; };
126struct rocksdb_writebatch_t { WriteBatch rep; };
127struct rocksdb_writebatch_wi_t { WriteBatchWithIndex* rep; };
128struct rocksdb_snapshot_t { const Snapshot* rep; };
129struct rocksdb_flushoptions_t { FlushOptions rep; };
130struct rocksdb_fifo_compaction_options_t { CompactionOptionsFIFO rep; };
131struct rocksdb_readoptions_t {
132 ReadOptions rep;
11fdf7f2
TL
133 // stack variables to set pointers to in ReadOptions
134 Slice upper_bound;
135 Slice lower_bound;
7c673cae
FG
136};
137struct rocksdb_writeoptions_t { WriteOptions rep; };
138struct rocksdb_options_t { Options rep; };
139struct rocksdb_compactoptions_t {
140 CompactRangeOptions rep;
141};
142struct rocksdb_block_based_table_options_t { BlockBasedTableOptions rep; };
143struct rocksdb_cuckoo_table_options_t { CuckooTableOptions rep; };
144struct rocksdb_seqfile_t { SequentialFile* rep; };
145struct rocksdb_randomfile_t { RandomAccessFile* rep; };
146struct rocksdb_writablefile_t { WritableFile* rep; };
11fdf7f2
TL
147struct rocksdb_wal_iterator_t { TransactionLogIterator* rep; };
148struct rocksdb_wal_readoptions_t { TransactionLogIterator::ReadOptions rep; };
7c673cae 149struct rocksdb_filelock_t { FileLock* rep; };
494da23a
TL
150struct rocksdb_logger_t {
151 std::shared_ptr<Logger> rep;
152};
153struct rocksdb_cache_t {
154 std::shared_ptr<Cache> rep;
155};
7c673cae
FG
156struct rocksdb_livefiles_t { std::vector<LiveFileMetaData> rep; };
157struct rocksdb_column_family_handle_t { ColumnFamilyHandle* rep; };
158struct rocksdb_envoptions_t { EnvOptions rep; };
159struct rocksdb_ingestexternalfileoptions_t { IngestExternalFileOptions rep; };
160struct rocksdb_sstfilewriter_t { SstFileWriter* rep; };
494da23a
TL
161struct rocksdb_ratelimiter_t {
162 std::shared_ptr<RateLimiter> rep;
163};
11fdf7f2
TL
164struct rocksdb_perfcontext_t { PerfContext* rep; };
165struct rocksdb_pinnableslice_t {
166 PinnableSlice rep;
167};
168struct rocksdb_transactiondb_options_t {
169 TransactionDBOptions rep;
170};
171struct rocksdb_transactiondb_t {
172 TransactionDB* rep;
173};
174struct rocksdb_transaction_options_t {
175 TransactionOptions rep;
176};
177struct rocksdb_transaction_t {
178 Transaction* rep;
179};
20effc67
TL
180struct rocksdb_backupable_db_options_t {
181 BackupableDBOptions rep;
182};
11fdf7f2
TL
183struct rocksdb_checkpoint_t {
184 Checkpoint* rep;
185};
186struct rocksdb_optimistictransactiondb_t {
187 OptimisticTransactionDB* rep;
188};
189struct rocksdb_optimistictransaction_options_t {
190 OptimisticTransactionOptions rep;
191};
7c673cae
FG
192
193struct rocksdb_compactionfiltercontext_t {
194 CompactionFilter::Context rep;
195};
196
197struct rocksdb_compactionfilter_t : public CompactionFilter {
198 void* state_;
199 void (*destructor_)(void*);
200 unsigned char (*filter_)(
201 void*,
202 int level,
203 const char* key, size_t key_length,
204 const char* existing_value, size_t value_length,
205 char** new_value, size_t *new_value_length,
206 unsigned char* value_changed);
207 const char* (*name_)(void*);
208 unsigned char ignore_snapshots_;
209
494da23a 210 ~rocksdb_compactionfilter_t() override { (*destructor_)(state_); }
7c673cae 211
494da23a
TL
212 bool Filter(int level, const Slice& key, const Slice& existing_value,
213 std::string* new_value, bool* value_changed) const override {
7c673cae
FG
214 char* c_new_value = nullptr;
215 size_t new_value_length = 0;
216 unsigned char c_value_changed = 0;
217 unsigned char result = (*filter_)(
218 state_,
219 level,
220 key.data(), key.size(),
221 existing_value.data(), existing_value.size(),
222 &c_new_value, &new_value_length, &c_value_changed);
223 if (c_value_changed) {
224 new_value->assign(c_new_value, new_value_length);
225 *value_changed = true;
226 }
227 return result;
228 }
229
494da23a 230 const char* Name() const override { return (*name_)(state_); }
7c673cae 231
494da23a 232 bool IgnoreSnapshots() const override { return ignore_snapshots_; }
7c673cae
FG
233};
234
235struct rocksdb_compactionfilterfactory_t : public CompactionFilterFactory {
236 void* state_;
237 void (*destructor_)(void*);
238 rocksdb_compactionfilter_t* (*create_compaction_filter_)(
239 void*, rocksdb_compactionfiltercontext_t* context);
240 const char* (*name_)(void*);
241
494da23a 242 ~rocksdb_compactionfilterfactory_t() override { (*destructor_)(state_); }
7c673cae 243
494da23a 244 std::unique_ptr<CompactionFilter> CreateCompactionFilter(
7c673cae
FG
245 const CompactionFilter::Context& context) override {
246 rocksdb_compactionfiltercontext_t ccontext;
247 ccontext.rep = context;
248 CompactionFilter* cf = (*create_compaction_filter_)(state_, &ccontext);
249 return std::unique_ptr<CompactionFilter>(cf);
250 }
251
494da23a 252 const char* Name() const override { return (*name_)(state_); }
7c673cae
FG
253};
254
255struct rocksdb_comparator_t : public Comparator {
256 void* state_;
257 void (*destructor_)(void*);
258 int (*compare_)(
259 void*,
260 const char* a, size_t alen,
261 const char* b, size_t blen);
262 const char* (*name_)(void*);
263
494da23a 264 ~rocksdb_comparator_t() override { (*destructor_)(state_); }
7c673cae 265
494da23a 266 int Compare(const Slice& a, const Slice& b) const override {
7c673cae
FG
267 return (*compare_)(state_, a.data(), a.size(), b.data(), b.size());
268 }
269
494da23a 270 const char* Name() const override { return (*name_)(state_); }
7c673cae
FG
271
272 // No-ops since the C binding does not support key shortening methods.
494da23a
TL
273 void FindShortestSeparator(std::string*, const Slice&) const override {}
274 void FindShortSuccessor(std::string* /*key*/) const override {}
7c673cae
FG
275};
276
277struct rocksdb_filterpolicy_t : public FilterPolicy {
278 void* state_;
279 void (*destructor_)(void*);
280 const char* (*name_)(void*);
281 char* (*create_)(
282 void*,
283 const char* const* key_array, const size_t* key_length_array,
284 int num_keys,
285 size_t* filter_length);
286 unsigned char (*key_match_)(
287 void*,
288 const char* key, size_t length,
289 const char* filter, size_t filter_length);
290 void (*delete_filter_)(
291 void*,
292 const char* filter, size_t filter_length);
293
494da23a 294 ~rocksdb_filterpolicy_t() override { (*destructor_)(state_); }
7c673cae 295
494da23a 296 const char* Name() const override { return (*name_)(state_); }
7c673cae 297
494da23a 298 void CreateFilter(const Slice* keys, int n, std::string* dst) const override {
7c673cae
FG
299 std::vector<const char*> key_pointers(n);
300 std::vector<size_t> key_sizes(n);
301 for (int i = 0; i < n; i++) {
302 key_pointers[i] = keys[i].data();
303 key_sizes[i] = keys[i].size();
304 }
305 size_t len;
306 char* filter = (*create_)(state_, &key_pointers[0], &key_sizes[0], n, &len);
307 dst->append(filter, len);
308
309 if (delete_filter_ != nullptr) {
310 (*delete_filter_)(state_, filter, len);
311 } else {
312 free(filter);
313 }
314 }
315
494da23a 316 bool KeyMayMatch(const Slice& key, const Slice& filter) const override {
7c673cae
FG
317 return (*key_match_)(state_, key.data(), key.size(),
318 filter.data(), filter.size());
319 }
320};
321
322struct rocksdb_mergeoperator_t : public MergeOperator {
323 void* state_;
324 void (*destructor_)(void*);
325 const char* (*name_)(void*);
326 char* (*full_merge_)(
327 void*,
328 const char* key, size_t key_length,
329 const char* existing_value, size_t existing_value_length,
330 const char* const* operands_list, const size_t* operands_list_length,
331 int num_operands,
332 unsigned char* success, size_t* new_value_length);
333 char* (*partial_merge_)(void*, const char* key, size_t key_length,
334 const char* const* operands_list,
335 const size_t* operands_list_length, int num_operands,
336 unsigned char* success, size_t* new_value_length);
337 void (*delete_value_)(
338 void*,
339 const char* value, size_t value_length);
340
494da23a 341 ~rocksdb_mergeoperator_t() override { (*destructor_)(state_); }
7c673cae 342
494da23a 343 const char* Name() const override { return (*name_)(state_); }
7c673cae 344
494da23a
TL
345 bool FullMergeV2(const MergeOperationInput& merge_in,
346 MergeOperationOutput* merge_out) const override {
7c673cae
FG
347 size_t n = merge_in.operand_list.size();
348 std::vector<const char*> operand_pointers(n);
349 std::vector<size_t> operand_sizes(n);
350 for (size_t i = 0; i < n; i++) {
351 Slice operand(merge_in.operand_list[i]);
352 operand_pointers[i] = operand.data();
353 operand_sizes[i] = operand.size();
354 }
355
356 const char* existing_value_data = nullptr;
357 size_t existing_value_len = 0;
358 if (merge_in.existing_value != nullptr) {
359 existing_value_data = merge_in.existing_value->data();
360 existing_value_len = merge_in.existing_value->size();
361 }
362
363 unsigned char success;
364 size_t new_value_len;
365 char* tmp_new_value = (*full_merge_)(
366 state_, merge_in.key.data(), merge_in.key.size(), existing_value_data,
367 existing_value_len, &operand_pointers[0], &operand_sizes[0],
368 static_cast<int>(n), &success, &new_value_len);
369 merge_out->new_value.assign(tmp_new_value, new_value_len);
370
371 if (delete_value_ != nullptr) {
372 (*delete_value_)(state_, tmp_new_value, new_value_len);
373 } else {
374 free(tmp_new_value);
375 }
376
377 return success;
378 }
379
494da23a
TL
380 bool PartialMergeMulti(const Slice& key,
381 const std::deque<Slice>& operand_list,
382 std::string* new_value,
383 Logger* /*logger*/) const override {
7c673cae
FG
384 size_t operand_count = operand_list.size();
385 std::vector<const char*> operand_pointers(operand_count);
386 std::vector<size_t> operand_sizes(operand_count);
387 for (size_t i = 0; i < operand_count; ++i) {
388 Slice operand(operand_list[i]);
389 operand_pointers[i] = operand.data();
390 operand_sizes[i] = operand.size();
391 }
392
393 unsigned char success;
394 size_t new_value_len;
395 char* tmp_new_value = (*partial_merge_)(
396 state_, key.data(), key.size(), &operand_pointers[0], &operand_sizes[0],
397 static_cast<int>(operand_count), &success, &new_value_len);
398 new_value->assign(tmp_new_value, new_value_len);
399
400 if (delete_value_ != nullptr) {
401 (*delete_value_)(state_, tmp_new_value, new_value_len);
402 } else {
403 free(tmp_new_value);
404 }
405
406 return success;
407 }
408};
409
11fdf7f2
TL
410struct rocksdb_dbpath_t {
411 DbPath rep;
412};
413
7c673cae
FG
414struct rocksdb_env_t {
415 Env* rep;
416 bool is_default;
417};
418
419struct rocksdb_slicetransform_t : public SliceTransform {
420 void* state_;
421 void (*destructor_)(void*);
422 const char* (*name_)(void*);
423 char* (*transform_)(
424 void*,
425 const char* key, size_t length,
426 size_t* dst_length);
427 unsigned char (*in_domain_)(
428 void*,
429 const char* key, size_t length);
430 unsigned char (*in_range_)(
431 void*,
432 const char* key, size_t length);
433
494da23a 434 ~rocksdb_slicetransform_t() override { (*destructor_)(state_); }
7c673cae 435
494da23a 436 const char* Name() const override { return (*name_)(state_); }
7c673cae 437
494da23a 438 Slice Transform(const Slice& src) const override {
7c673cae
FG
439 size_t len;
440 char* dst = (*transform_)(state_, src.data(), src.size(), &len);
441 return Slice(dst, len);
442 }
443
494da23a 444 bool InDomain(const Slice& src) const override {
7c673cae
FG
445 return (*in_domain_)(state_, src.data(), src.size());
446 }
447
494da23a 448 bool InRange(const Slice& src) const override {
7c673cae
FG
449 return (*in_range_)(state_, src.data(), src.size());
450 }
451};
452
453struct rocksdb_universal_compaction_options_t {
f67539c2 454 ROCKSDB_NAMESPACE::CompactionOptionsUniversal* rep;
7c673cae
FG
455};
456
457static bool SaveError(char** errptr, const Status& s) {
458 assert(errptr != nullptr);
459 if (s.ok()) {
460 return false;
461 } else if (*errptr == nullptr) {
462 *errptr = strdup(s.ToString().c_str());
463 } else {
464 // TODO(sanjay): Merge with existing error?
465 // This is a bug if *errptr is not created by malloc()
466 free(*errptr);
467 *errptr = strdup(s.ToString().c_str());
468 }
469 return true;
470}
471
472static char* CopyString(const std::string& str) {
473 char* result = reinterpret_cast<char*>(malloc(sizeof(char) * str.size()));
474 memcpy(result, str.data(), sizeof(char) * str.size());
475 return result;
476}
477
478rocksdb_t* rocksdb_open(
479 const rocksdb_options_t* options,
480 const char* name,
481 char** errptr) {
482 DB* db;
483 if (SaveError(errptr, DB::Open(options->rep, std::string(name), &db))) {
484 return nullptr;
485 }
486 rocksdb_t* result = new rocksdb_t;
487 result->rep = db;
488 return result;
489}
490
11fdf7f2
TL
491rocksdb_t* rocksdb_open_with_ttl(
492 const rocksdb_options_t* options,
493 const char* name,
494 int ttl,
495 char** errptr) {
f67539c2
TL
496 ROCKSDB_NAMESPACE::DBWithTTL* db;
497 if (SaveError(errptr, ROCKSDB_NAMESPACE::DBWithTTL::Open(
498 options->rep, std::string(name), &db, ttl))) {
11fdf7f2
TL
499 return nullptr;
500 }
501 rocksdb_t* result = new rocksdb_t;
502 result->rep = db;
503 return result;
504}
505
20effc67
TL
506rocksdb_t* rocksdb_open_for_read_only(const rocksdb_options_t* options,
507 const char* name,
508 unsigned char error_if_wal_file_exists,
509 char** errptr) {
7c673cae 510 DB* db;
20effc67
TL
511 if (SaveError(errptr, DB::OpenForReadOnly(options->rep, std::string(name),
512 &db, error_if_wal_file_exists))) {
7c673cae
FG
513 return nullptr;
514 }
515 rocksdb_t* result = new rocksdb_t;
516 result->rep = db;
517 return result;
518}
519
f67539c2
TL
520rocksdb_t* rocksdb_open_as_secondary(const rocksdb_options_t* options,
521 const char* name,
522 const char* secondary_path,
523 char** errptr) {
524 DB* db;
525 if (SaveError(errptr,
526 DB::OpenAsSecondary(options->rep, std::string(name),
527 std::string(secondary_path), &db))) {
528 return nullptr;
529 }
530 rocksdb_t* result = new rocksdb_t;
531 result->rep = db;
532 return result;
533}
534
7c673cae
FG
535rocksdb_backup_engine_t* rocksdb_backup_engine_open(
536 const rocksdb_options_t* options, const char* path, char** errptr) {
537 BackupEngine* be;
538 if (SaveError(errptr, BackupEngine::Open(options->rep.env,
539 BackupableDBOptions(path,
540 nullptr,
541 true,
542 options->rep.info_log.get()),
543 &be))) {
544 return nullptr;
545 }
546 rocksdb_backup_engine_t* result = new rocksdb_backup_engine_t;
547 result->rep = be;
548 return result;
549}
550
20effc67
TL
551rocksdb_backup_engine_t* rocksdb_backup_engine_open_opts(
552 const rocksdb_backupable_db_options_t* options, rocksdb_env_t* env,
553 char** errptr) {
554 BackupEngine* be;
555 if (SaveError(errptr, BackupEngine::Open(options->rep, env->rep, &be))) {
556 return nullptr;
557 }
558 rocksdb_backup_engine_t* result = new rocksdb_backup_engine_t;
559 result->rep = be;
560 return result;
561}
562
7c673cae 563void rocksdb_backup_engine_create_new_backup(rocksdb_backup_engine_t* be,
11fdf7f2
TL
564 rocksdb_t* db,
565 char** errptr) {
7c673cae
FG
566 SaveError(errptr, be->rep->CreateNewBackup(db->rep));
567}
568
11fdf7f2
TL
569void rocksdb_backup_engine_create_new_backup_flush(rocksdb_backup_engine_t* be,
570 rocksdb_t* db,
571 unsigned char flush_before_backup,
572 char** errptr) {
573 SaveError(errptr, be->rep->CreateNewBackup(db->rep, flush_before_backup));
574}
575
7c673cae
FG
576void rocksdb_backup_engine_purge_old_backups(rocksdb_backup_engine_t* be,
577 uint32_t num_backups_to_keep,
578 char** errptr) {
579 SaveError(errptr, be->rep->PurgeOldBackups(num_backups_to_keep));
580}
581
582rocksdb_restore_options_t* rocksdb_restore_options_create() {
583 return new rocksdb_restore_options_t;
584}
585
586void rocksdb_restore_options_destroy(rocksdb_restore_options_t* opt) {
587 delete opt;
588}
589
590void rocksdb_restore_options_set_keep_log_files(rocksdb_restore_options_t* opt,
591 int v) {
592 opt->rep.keep_log_files = v;
593}
594
11fdf7f2
TL
595
596void rocksdb_backup_engine_verify_backup(rocksdb_backup_engine_t* be,
597 uint32_t backup_id, char** errptr) {
598 SaveError(errptr, be->rep->VerifyBackup(static_cast<BackupID>(backup_id)));
599}
600
7c673cae
FG
601void rocksdb_backup_engine_restore_db_from_latest_backup(
602 rocksdb_backup_engine_t* be, const char* db_dir, const char* wal_dir,
603 const rocksdb_restore_options_t* restore_options, char** errptr) {
604 SaveError(errptr, be->rep->RestoreDBFromLatestBackup(std::string(db_dir),
605 std::string(wal_dir),
606 restore_options->rep));
607}
608
20effc67
TL
609void rocksdb_backup_engine_restore_db_from_backup(
610 rocksdb_backup_engine_t* be, const char* db_dir, const char* wal_dir,
611 const rocksdb_restore_options_t* restore_options, const uint32_t backup_id,
612 char** errptr) {
613 SaveError(errptr, be->rep->RestoreDBFromBackup(backup_id, std::string(db_dir),
614 std::string(wal_dir),
615 restore_options->rep));
616}
617
7c673cae
FG
618const rocksdb_backup_engine_info_t* rocksdb_backup_engine_get_backup_info(
619 rocksdb_backup_engine_t* be) {
620 rocksdb_backup_engine_info_t* result = new rocksdb_backup_engine_info_t;
621 be->rep->GetBackupInfo(&result->rep);
622 return result;
623}
624
625int rocksdb_backup_engine_info_count(const rocksdb_backup_engine_info_t* info) {
626 return static_cast<int>(info->rep.size());
627}
628
629int64_t rocksdb_backup_engine_info_timestamp(
630 const rocksdb_backup_engine_info_t* info, int index) {
631 return info->rep[index].timestamp;
632}
633
634uint32_t rocksdb_backup_engine_info_backup_id(
635 const rocksdb_backup_engine_info_t* info, int index) {
636 return info->rep[index].backup_id;
637}
638
639uint64_t rocksdb_backup_engine_info_size(
640 const rocksdb_backup_engine_info_t* info, int index) {
641 return info->rep[index].size;
642}
643
644uint32_t rocksdb_backup_engine_info_number_files(
645 const rocksdb_backup_engine_info_t* info, int index) {
646 return info->rep[index].number_files;
647}
648
649void rocksdb_backup_engine_info_destroy(
650 const rocksdb_backup_engine_info_t* info) {
651 delete info;
652}
653
654void rocksdb_backup_engine_close(rocksdb_backup_engine_t* be) {
655 delete be->rep;
656 delete be;
657}
658
20effc67
TL
659rocksdb_backupable_db_options_t* rocksdb_backupable_db_options_create(
660 const char* backup_dir) {
661 return new rocksdb_backupable_db_options_t{
662 BackupableDBOptions(std::string(backup_dir))};
663}
664
665void rocksdb_backupable_db_options_set_backup_dir(
666 rocksdb_backupable_db_options_t* options, const char* backup_dir) {
667 options->rep.backup_dir = std::string(backup_dir);
668}
669
670void rocksdb_backupable_db_options_set_env(
671 rocksdb_backupable_db_options_t* options, rocksdb_env_t* env) {
672 options->rep.backup_env = (env ? env->rep : nullptr);
673}
674
675void rocksdb_backupable_db_options_set_share_table_files(
676 rocksdb_backupable_db_options_t* options, unsigned char val) {
677 options->rep.share_table_files = val;
678}
679
680unsigned char rocksdb_backupable_db_options_get_share_table_files(
681 rocksdb_backupable_db_options_t* options) {
682 return options->rep.share_table_files;
683}
684
685void rocksdb_backupable_db_options_set_sync(
686 rocksdb_backupable_db_options_t* options, unsigned char val) {
687 options->rep.sync = val;
688}
689
690unsigned char rocksdb_backupable_db_options_get_sync(
691 rocksdb_backupable_db_options_t* options) {
692 return options->rep.sync;
693}
694
695void rocksdb_backupable_db_options_set_destroy_old_data(
696 rocksdb_backupable_db_options_t* options, unsigned char val) {
697 options->rep.destroy_old_data = val;
698}
699
700unsigned char rocksdb_backupable_db_options_get_destroy_old_data(
701 rocksdb_backupable_db_options_t* options) {
702 return options->rep.destroy_old_data;
703}
704
705void rocksdb_backupable_db_options_set_backup_log_files(
706 rocksdb_backupable_db_options_t* options, unsigned char val) {
707 options->rep.backup_log_files = val;
708}
709
710unsigned char rocksdb_backupable_db_options_get_backup_log_files(
711 rocksdb_backupable_db_options_t* options) {
712 return options->rep.backup_log_files;
713}
714
715void rocksdb_backupable_db_options_set_backup_rate_limit(
716 rocksdb_backupable_db_options_t* options, uint64_t limit) {
717 options->rep.backup_rate_limit = limit;
718}
719
720uint64_t rocksdb_backupable_db_options_get_backup_rate_limit(
721 rocksdb_backupable_db_options_t* options) {
722 return options->rep.backup_rate_limit;
723}
724
725void rocksdb_backupable_db_options_set_restore_rate_limit(
726 rocksdb_backupable_db_options_t* options, uint64_t limit) {
727 options->rep.restore_rate_limit = limit;
728}
729
730uint64_t rocksdb_backupable_db_options_get_restore_rate_limit(
731 rocksdb_backupable_db_options_t* options) {
732 return options->rep.restore_rate_limit;
733}
734
735void rocksdb_backupable_db_options_set_max_background_operations(
736 rocksdb_backupable_db_options_t* options, int val) {
737 options->rep.max_background_operations = val;
738}
739
740int rocksdb_backupable_db_options_get_max_background_operations(
741 rocksdb_backupable_db_options_t* options) {
742 return options->rep.max_background_operations;
743}
744
745void rocksdb_backupable_db_options_set_callback_trigger_interval_size(
746 rocksdb_backupable_db_options_t* options, uint64_t size) {
747 options->rep.callback_trigger_interval_size = size;
748}
749
750uint64_t rocksdb_backupable_db_options_get_callback_trigger_interval_size(
751 rocksdb_backupable_db_options_t* options) {
752 return options->rep.callback_trigger_interval_size;
753}
754
755void rocksdb_backupable_db_options_set_max_valid_backups_to_open(
756 rocksdb_backupable_db_options_t* options, int val) {
757 options->rep.max_valid_backups_to_open = val;
758}
759
760int rocksdb_backupable_db_options_get_max_valid_backups_to_open(
761 rocksdb_backupable_db_options_t* options) {
762 return options->rep.max_valid_backups_to_open;
763}
764
765void rocksdb_backupable_db_options_set_share_files_with_checksum_naming(
766 rocksdb_backupable_db_options_t* options, int val) {
767 options->rep.share_files_with_checksum_naming =
768 static_cast<BackupableDBOptions::ShareFilesNaming>(val);
769}
770
771int rocksdb_backupable_db_options_get_share_files_with_checksum_naming(
772 rocksdb_backupable_db_options_t* options) {
773 return static_cast<int>(options->rep.share_files_with_checksum_naming);
774}
775
776void rocksdb_backupable_db_options_destroy(
777 rocksdb_backupable_db_options_t* options) {
778 delete options;
779}
780
11fdf7f2
TL
781rocksdb_checkpoint_t* rocksdb_checkpoint_object_create(rocksdb_t* db,
782 char** errptr) {
783 Checkpoint* checkpoint;
784 if (SaveError(errptr, Checkpoint::Create(db->rep, &checkpoint))) {
785 return nullptr;
786 }
787 rocksdb_checkpoint_t* result = new rocksdb_checkpoint_t;
788 result->rep = checkpoint;
789 return result;
790}
791
792void rocksdb_checkpoint_create(rocksdb_checkpoint_t* checkpoint,
793 const char* checkpoint_dir,
794 uint64_t log_size_for_flush, char** errptr) {
795 SaveError(errptr, checkpoint->rep->CreateCheckpoint(
796 std::string(checkpoint_dir), log_size_for_flush));
797}
798
799void rocksdb_checkpoint_object_destroy(rocksdb_checkpoint_t* checkpoint) {
800 delete checkpoint->rep;
801 delete checkpoint;
802}
803
7c673cae
FG
804void rocksdb_close(rocksdb_t* db) {
805 delete db->rep;
806 delete db;
807}
808
809void rocksdb_options_set_uint64add_merge_operator(rocksdb_options_t* opt) {
f67539c2
TL
810 opt->rep.merge_operator =
811 ROCKSDB_NAMESPACE::MergeOperators::CreateUInt64AddOperator();
7c673cae
FG
812}
813
814rocksdb_t* rocksdb_open_column_families(
f67539c2
TL
815 const rocksdb_options_t* db_options, const char* name,
816 int num_column_families, const char* const* column_family_names,
817 const rocksdb_options_t* const* column_family_options,
818 rocksdb_column_family_handle_t** column_family_handles, char** errptr) {
7c673cae
FG
819 std::vector<ColumnFamilyDescriptor> column_families;
820 for (int i = 0; i < num_column_families; i++) {
821 column_families.push_back(ColumnFamilyDescriptor(
822 std::string(column_family_names[i]),
823 ColumnFamilyOptions(column_family_options[i]->rep)));
824 }
825
826 DB* db;
827 std::vector<ColumnFamilyHandle*> handles;
828 if (SaveError(errptr, DB::Open(DBOptions(db_options->rep),
829 std::string(name), column_families, &handles, &db))) {
830 return nullptr;
831 }
832
833 for (size_t i = 0; i < handles.size(); i++) {
834 rocksdb_column_family_handle_t* c_handle = new rocksdb_column_family_handle_t;
835 c_handle->rep = handles[i];
836 column_family_handles[i] = c_handle;
837 }
838 rocksdb_t* result = new rocksdb_t;
839 result->rep = db;
840 return result;
841}
842
20effc67
TL
843rocksdb_t* rocksdb_open_column_families_with_ttl(
844 const rocksdb_options_t* db_options, const char* name,
845 int num_column_families, const char* const* column_family_names,
846 const rocksdb_options_t* const* column_family_options,
847 rocksdb_column_family_handle_t** column_family_handles, const int* ttls,
848 char** errptr) {
849 std::vector<int32_t> ttls_vec;
850 std::vector<ColumnFamilyDescriptor> column_families;
851 for (int i = 0; i < num_column_families; i++) {
852 ttls_vec.push_back(ttls[i]);
853
854 column_families.push_back(ColumnFamilyDescriptor(
855 std::string(column_family_names[i]),
856 ColumnFamilyOptions(column_family_options[i]->rep)));
857 }
858
859 ROCKSDB_NAMESPACE::DBWithTTL* db;
860 std::vector<ColumnFamilyHandle*> handles;
861 if (SaveError(errptr, ROCKSDB_NAMESPACE::DBWithTTL::Open(
862 DBOptions(db_options->rep), std::string(name),
863 column_families, &handles, &db, ttls_vec))) {
864 return nullptr;
865 }
866
867 for (size_t i = 0; i < handles.size(); i++) {
868 rocksdb_column_family_handle_t* c_handle =
869 new rocksdb_column_family_handle_t;
870 c_handle->rep = handles[i];
871 column_family_handles[i] = c_handle;
872 }
873 rocksdb_t* result = new rocksdb_t;
874 result->rep = db;
875 return result;
876}
877
7c673cae 878rocksdb_t* rocksdb_open_for_read_only_column_families(
f67539c2
TL
879 const rocksdb_options_t* db_options, const char* name,
880 int num_column_families, const char* const* column_family_names,
881 const rocksdb_options_t* const* column_family_options,
7c673cae 882 rocksdb_column_family_handle_t** column_family_handles,
20effc67 883 unsigned char error_if_wal_file_exists, char** errptr) {
7c673cae
FG
884 std::vector<ColumnFamilyDescriptor> column_families;
885 for (int i = 0; i < num_column_families; i++) {
886 column_families.push_back(ColumnFamilyDescriptor(
887 std::string(column_family_names[i]),
888 ColumnFamilyOptions(column_family_options[i]->rep)));
889 }
890
891 DB* db;
892 std::vector<ColumnFamilyHandle*> handles;
20effc67
TL
893 if (SaveError(errptr,
894 DB::OpenForReadOnly(DBOptions(db_options->rep),
895 std::string(name), column_families,
896 &handles, &db, error_if_wal_file_exists))) {
7c673cae
FG
897 return nullptr;
898 }
899
900 for (size_t i = 0; i < handles.size(); i++) {
901 rocksdb_column_family_handle_t* c_handle = new rocksdb_column_family_handle_t;
902 c_handle->rep = handles[i];
903 column_family_handles[i] = c_handle;
904 }
905 rocksdb_t* result = new rocksdb_t;
906 result->rep = db;
907 return result;
908}
909
f67539c2
TL
910rocksdb_t* rocksdb_open_as_secondary_column_families(
911 const rocksdb_options_t* db_options, const char* name,
912 const char* secondary_path, int num_column_families,
913 const char* const* column_family_names,
914 const rocksdb_options_t* const* column_family_options,
915 rocksdb_column_family_handle_t** column_family_handles, char** errptr) {
916 std::vector<ColumnFamilyDescriptor> column_families;
917 for (int i = 0; i != num_column_families; ++i) {
918 column_families.emplace_back(
919 std::string(column_family_names[i]),
920 ColumnFamilyOptions(column_family_options[i]->rep));
921 }
922 DB* db;
923 std::vector<ColumnFamilyHandle*> handles;
924 if (SaveError(errptr, DB::OpenAsSecondary(DBOptions(db_options->rep),
925 std::string(name),
926 std::string(secondary_path),
927 column_families, &handles, &db))) {
928 return nullptr;
929 }
930 for (size_t i = 0; i != handles.size(); ++i) {
931 rocksdb_column_family_handle_t* c_handle =
932 new rocksdb_column_family_handle_t;
933 c_handle->rep = handles[i];
934 column_family_handles[i] = c_handle;
935 }
936 rocksdb_t* result = new rocksdb_t;
937 result->rep = db;
938 return result;
939}
940
7c673cae
FG
941char** rocksdb_list_column_families(
942 const rocksdb_options_t* options,
943 const char* name,
944 size_t* lencfs,
945 char** errptr) {
946 std::vector<std::string> fams;
947 SaveError(errptr,
948 DB::ListColumnFamilies(DBOptions(options->rep),
949 std::string(name), &fams));
950
951 *lencfs = fams.size();
952 char** column_families = static_cast<char**>(malloc(sizeof(char*) * fams.size()));
953 for (size_t i = 0; i < fams.size(); i++) {
954 column_families[i] = strdup(fams[i].c_str());
955 }
956 return column_families;
957}
958
959void rocksdb_list_column_families_destroy(char** list, size_t len) {
960 for (size_t i = 0; i < len; ++i) {
961 free(list[i]);
962 }
963 free(list);
964}
965
966rocksdb_column_family_handle_t* rocksdb_create_column_family(
967 rocksdb_t* db,
968 const rocksdb_options_t* column_family_options,
969 const char* column_family_name,
970 char** errptr) {
971 rocksdb_column_family_handle_t* handle = new rocksdb_column_family_handle_t;
972 SaveError(errptr,
973 db->rep->CreateColumnFamily(ColumnFamilyOptions(column_family_options->rep),
974 std::string(column_family_name), &(handle->rep)));
975 return handle;
976}
977
20effc67
TL
978rocksdb_column_family_handle_t* rocksdb_create_column_family_with_ttl(
979 rocksdb_t* db, const rocksdb_options_t* column_family_options,
980 const char* column_family_name, int ttl, char** errptr) {
981 ROCKSDB_NAMESPACE::DBWithTTL* db_with_ttl =
982 static_cast<ROCKSDB_NAMESPACE::DBWithTTL*>(db->rep);
983 rocksdb_column_family_handle_t* handle = new rocksdb_column_family_handle_t;
984 SaveError(errptr, db_with_ttl->CreateColumnFamilyWithTtl(
985 ColumnFamilyOptions(column_family_options->rep),
986 std::string(column_family_name), &(handle->rep), ttl));
987 return handle;
988}
989
7c673cae
FG
990void rocksdb_drop_column_family(
991 rocksdb_t* db,
992 rocksdb_column_family_handle_t* handle,
993 char** errptr) {
994 SaveError(errptr, db->rep->DropColumnFamily(handle->rep));
995}
996
997void rocksdb_column_family_handle_destroy(rocksdb_column_family_handle_t* handle) {
998 delete handle->rep;
999 delete handle;
1000}
1001
1002void rocksdb_put(
1003 rocksdb_t* db,
1004 const rocksdb_writeoptions_t* options,
1005 const char* key, size_t keylen,
1006 const char* val, size_t vallen,
1007 char** errptr) {
1008 SaveError(errptr,
1009 db->rep->Put(options->rep, Slice(key, keylen), Slice(val, vallen)));
1010}
1011
1012void rocksdb_put_cf(
1013 rocksdb_t* db,
1014 const rocksdb_writeoptions_t* options,
1015 rocksdb_column_family_handle_t* column_family,
1016 const char* key, size_t keylen,
1017 const char* val, size_t vallen,
1018 char** errptr) {
1019 SaveError(errptr,
1020 db->rep->Put(options->rep, column_family->rep,
1021 Slice(key, keylen), Slice(val, vallen)));
1022}
1023
1024void rocksdb_delete(
1025 rocksdb_t* db,
1026 const rocksdb_writeoptions_t* options,
1027 const char* key, size_t keylen,
1028 char** errptr) {
1029 SaveError(errptr, db->rep->Delete(options->rep, Slice(key, keylen)));
1030}
1031
1032void rocksdb_delete_cf(
1033 rocksdb_t* db,
1034 const rocksdb_writeoptions_t* options,
1035 rocksdb_column_family_handle_t* column_family,
1036 const char* key, size_t keylen,
1037 char** errptr) {
1038 SaveError(errptr, db->rep->Delete(options->rep, column_family->rep,
1039 Slice(key, keylen)));
1040}
1041
f67539c2
TL
1042void rocksdb_delete_range_cf(rocksdb_t* db,
1043 const rocksdb_writeoptions_t* options,
1044 rocksdb_column_family_handle_t* column_family,
1045 const char* start_key, size_t start_key_len,
1046 const char* end_key, size_t end_key_len,
1047 char** errptr) {
1048 SaveError(errptr, db->rep->DeleteRange(options->rep, column_family->rep,
1049 Slice(start_key, start_key_len),
1050 Slice(end_key, end_key_len)));
1051}
1052
7c673cae
FG
1053void rocksdb_merge(
1054 rocksdb_t* db,
1055 const rocksdb_writeoptions_t* options,
1056 const char* key, size_t keylen,
1057 const char* val, size_t vallen,
1058 char** errptr) {
1059 SaveError(errptr,
1060 db->rep->Merge(options->rep, Slice(key, keylen), Slice(val, vallen)));
1061}
1062
1063void rocksdb_merge_cf(
1064 rocksdb_t* db,
1065 const rocksdb_writeoptions_t* options,
1066 rocksdb_column_family_handle_t* column_family,
1067 const char* key, size_t keylen,
1068 const char* val, size_t vallen,
1069 char** errptr) {
1070 SaveError(errptr,
1071 db->rep->Merge(options->rep, column_family->rep,
1072 Slice(key, keylen), Slice(val, vallen)));
1073}
1074
1075void rocksdb_write(
1076 rocksdb_t* db,
1077 const rocksdb_writeoptions_t* options,
1078 rocksdb_writebatch_t* batch,
1079 char** errptr) {
1080 SaveError(errptr, db->rep->Write(options->rep, &batch->rep));
1081}
1082
1083char* rocksdb_get(
1084 rocksdb_t* db,
1085 const rocksdb_readoptions_t* options,
1086 const char* key, size_t keylen,
1087 size_t* vallen,
1088 char** errptr) {
1089 char* result = nullptr;
1090 std::string tmp;
1091 Status s = db->rep->Get(options->rep, Slice(key, keylen), &tmp);
1092 if (s.ok()) {
1093 *vallen = tmp.size();
1094 result = CopyString(tmp);
1095 } else {
1096 *vallen = 0;
1097 if (!s.IsNotFound()) {
1098 SaveError(errptr, s);
1099 }
1100 }
1101 return result;
1102}
1103
1104char* rocksdb_get_cf(
1105 rocksdb_t* db,
1106 const rocksdb_readoptions_t* options,
1107 rocksdb_column_family_handle_t* column_family,
1108 const char* key, size_t keylen,
1109 size_t* vallen,
1110 char** errptr) {
1111 char* result = nullptr;
1112 std::string tmp;
1113 Status s = db->rep->Get(options->rep, column_family->rep,
1114 Slice(key, keylen), &tmp);
1115 if (s.ok()) {
1116 *vallen = tmp.size();
1117 result = CopyString(tmp);
1118 } else {
1119 *vallen = 0;
1120 if (!s.IsNotFound()) {
1121 SaveError(errptr, s);
1122 }
1123 }
1124 return result;
1125}
1126
1127void rocksdb_multi_get(
1128 rocksdb_t* db,
1129 const rocksdb_readoptions_t* options,
1130 size_t num_keys, const char* const* keys_list,
1131 const size_t* keys_list_sizes,
1132 char** values_list, size_t* values_list_sizes,
1133 char** errs) {
1134 std::vector<Slice> keys(num_keys);
1135 for (size_t i = 0; i < num_keys; i++) {
1136 keys[i] = Slice(keys_list[i], keys_list_sizes[i]);
1137 }
1138 std::vector<std::string> values(num_keys);
1139 std::vector<Status> statuses = db->rep->MultiGet(options->rep, keys, &values);
1140 for (size_t i = 0; i < num_keys; i++) {
1141 if (statuses[i].ok()) {
1142 values_list[i] = CopyString(values[i]);
1143 values_list_sizes[i] = values[i].size();
1144 errs[i] = nullptr;
1145 } else {
1146 values_list[i] = nullptr;
1147 values_list_sizes[i] = 0;
1148 if (!statuses[i].IsNotFound()) {
1149 errs[i] = strdup(statuses[i].ToString().c_str());
1150 } else {
1151 errs[i] = nullptr;
1152 }
1153 }
1154 }
1155}
1156
1157void rocksdb_multi_get_cf(
1158 rocksdb_t* db,
1159 const rocksdb_readoptions_t* options,
1160 const rocksdb_column_family_handle_t* const* column_families,
1161 size_t num_keys, const char* const* keys_list,
1162 const size_t* keys_list_sizes,
1163 char** values_list, size_t* values_list_sizes,
1164 char** errs) {
1165 std::vector<Slice> keys(num_keys);
1166 std::vector<ColumnFamilyHandle*> cfs(num_keys);
1167 for (size_t i = 0; i < num_keys; i++) {
1168 keys[i] = Slice(keys_list[i], keys_list_sizes[i]);
1169 cfs[i] = column_families[i]->rep;
1170 }
1171 std::vector<std::string> values(num_keys);
1172 std::vector<Status> statuses = db->rep->MultiGet(options->rep, cfs, keys, &values);
1173 for (size_t i = 0; i < num_keys; i++) {
1174 if (statuses[i].ok()) {
1175 values_list[i] = CopyString(values[i]);
1176 values_list_sizes[i] = values[i].size();
1177 errs[i] = nullptr;
1178 } else {
1179 values_list[i] = nullptr;
1180 values_list_sizes[i] = 0;
1181 if (!statuses[i].IsNotFound()) {
1182 errs[i] = strdup(statuses[i].ToString().c_str());
1183 } else {
1184 errs[i] = nullptr;
1185 }
1186 }
1187 }
1188}
1189
20effc67
TL
1190unsigned char rocksdb_key_may_exist(rocksdb_t* db,
1191 const rocksdb_readoptions_t* options,
1192 const char* key, size_t key_len,
1193 char** value, size_t* val_len,
1194 const char* timestamp, size_t timestamp_len,
1195 unsigned char* value_found) {
1196 std::string tmp;
1197 std::string time;
1198 if (timestamp) {
1199 time.assign(timestamp, timestamp_len);
1200 }
1201 bool found = false;
1202 const bool result = db->rep->KeyMayExist(options->rep, Slice(key, key_len),
1203 &tmp, timestamp ? &time : nullptr,
1204 value_found ? &found : nullptr);
1205 if (value_found) {
1206 *value_found = found;
1207 if (found) {
1208 *val_len = tmp.size();
1209 *value = CopyString(tmp);
1210 }
1211 }
1212 return result;
1213}
1214
1215unsigned char rocksdb_key_may_exist_cf(
1216 rocksdb_t* db, const rocksdb_readoptions_t* options,
1217 rocksdb_column_family_handle_t* column_family, const char* key,
1218 size_t key_len, char** value, size_t* val_len, const char* timestamp,
1219 size_t timestamp_len, unsigned char* value_found) {
1220 std::string tmp;
1221 std::string time;
1222 if (timestamp) {
1223 time.assign(timestamp, timestamp_len);
1224 }
1225 bool found = false;
1226 const bool result = db->rep->KeyMayExist(
1227 options->rep, column_family->rep, Slice(key, key_len), &tmp,
1228 timestamp ? &time : nullptr, value_found ? &found : nullptr);
1229 if (value_found) {
1230 *value_found = found;
1231 if (found) {
1232 *val_len = tmp.size();
1233 *value = CopyString(tmp);
1234 }
1235 }
1236 return result;
1237}
1238
7c673cae
FG
1239rocksdb_iterator_t* rocksdb_create_iterator(
1240 rocksdb_t* db,
1241 const rocksdb_readoptions_t* options) {
1242 rocksdb_iterator_t* result = new rocksdb_iterator_t;
1243 result->rep = db->rep->NewIterator(options->rep);
1244 return result;
1245}
1246
11fdf7f2
TL
1247rocksdb_wal_iterator_t* rocksdb_get_updates_since(
1248 rocksdb_t* db, uint64_t seq_number,
1249 const rocksdb_wal_readoptions_t* options,
1250 char** errptr) {
1251 std::unique_ptr<TransactionLogIterator> iter;
1252 TransactionLogIterator::ReadOptions ro;
1253 if (options!=nullptr) {
1254 ro = options->rep;
1255 }
1256 if (SaveError(errptr, db->rep->GetUpdatesSince(seq_number, &iter, ro))) {
1257 return nullptr;
1258 }
1259 rocksdb_wal_iterator_t* result = new rocksdb_wal_iterator_t;
1260 result->rep = iter.release();
1261 return result;
1262}
1263
1264void rocksdb_wal_iter_next(rocksdb_wal_iterator_t* iter) {
1265 iter->rep->Next();
1266}
1267
1268unsigned char rocksdb_wal_iter_valid(const rocksdb_wal_iterator_t* iter) {
1269 return iter->rep->Valid();
1270}
1271
1272void rocksdb_wal_iter_status (const rocksdb_wal_iterator_t* iter, char** errptr) {
1273 SaveError(errptr, iter->rep->status());
1274}
1275
1276void rocksdb_wal_iter_destroy (const rocksdb_wal_iterator_t* iter) {
1277 delete iter->rep;
1278 delete iter;
1279}
1280
1281rocksdb_writebatch_t* rocksdb_wal_iter_get_batch (const rocksdb_wal_iterator_t* iter, uint64_t* seq) {
1282 rocksdb_writebatch_t* result = rocksdb_writebatch_create();
1283 BatchResult wal_batch = iter->rep->GetBatch();
f67539c2 1284 result->rep = std::move(*wal_batch.writeBatchPtr);
11fdf7f2
TL
1285 if (seq != nullptr) {
1286 *seq = wal_batch.sequence;
1287 }
1288 return result;
1289}
1290
1291uint64_t rocksdb_get_latest_sequence_number (rocksdb_t *db) {
1292 return db->rep->GetLatestSequenceNumber();
1293}
1294
7c673cae
FG
1295rocksdb_iterator_t* rocksdb_create_iterator_cf(
1296 rocksdb_t* db,
1297 const rocksdb_readoptions_t* options,
1298 rocksdb_column_family_handle_t* column_family) {
1299 rocksdb_iterator_t* result = new rocksdb_iterator_t;
1300 result->rep = db->rep->NewIterator(options->rep, column_family->rep);
1301 return result;
1302}
1303
1304void rocksdb_create_iterators(
1305 rocksdb_t *db,
1306 rocksdb_readoptions_t* opts,
1307 rocksdb_column_family_handle_t** column_families,
1308 rocksdb_iterator_t** iterators,
1309 size_t size,
1310 char** errptr) {
1311 std::vector<ColumnFamilyHandle*> column_families_vec;
1312 for (size_t i = 0; i < size; i++) {
1313 column_families_vec.push_back(column_families[i]->rep);
1314 }
1315
1316 std::vector<Iterator*> res;
1317 Status status = db->rep->NewIterators(opts->rep, column_families_vec, &res);
1318 assert(res.size() == size);
1319 if (SaveError(errptr, status)) {
1320 return;
1321 }
1322
1323 for (size_t i = 0; i < size; i++) {
1324 iterators[i] = new rocksdb_iterator_t;
1325 iterators[i]->rep = res[i];
1326 }
1327}
1328
1329const rocksdb_snapshot_t* rocksdb_create_snapshot(
1330 rocksdb_t* db) {
1331 rocksdb_snapshot_t* result = new rocksdb_snapshot_t;
1332 result->rep = db->rep->GetSnapshot();
1333 return result;
1334}
1335
1336void rocksdb_release_snapshot(
1337 rocksdb_t* db,
1338 const rocksdb_snapshot_t* snapshot) {
1339 db->rep->ReleaseSnapshot(snapshot->rep);
1340 delete snapshot;
1341}
1342
1343char* rocksdb_property_value(
1344 rocksdb_t* db,
1345 const char* propname) {
1346 std::string tmp;
1347 if (db->rep->GetProperty(Slice(propname), &tmp)) {
1348 // We use strdup() since we expect human readable output.
1349 return strdup(tmp.c_str());
1350 } else {
1351 return nullptr;
1352 }
1353}
1354
1355int rocksdb_property_int(
1356 rocksdb_t* db,
1357 const char* propname,
1358 uint64_t *out_val) {
1359 if (db->rep->GetIntProperty(Slice(propname), out_val)) {
1360 return 0;
1361 } else {
1362 return -1;
1363 }
1364}
1365
f67539c2
TL
1366int rocksdb_property_int_cf(
1367 rocksdb_t* db,
1368 rocksdb_column_family_handle_t* column_family,
1369 const char* propname,
1370 uint64_t *out_val) {
1371 if (db->rep->GetIntProperty(column_family->rep, Slice(propname), out_val)) {
1372 return 0;
1373 } else {
1374 return -1;
1375 }
1376}
1377
7c673cae
FG
1378char* rocksdb_property_value_cf(
1379 rocksdb_t* db,
1380 rocksdb_column_family_handle_t* column_family,
1381 const char* propname) {
1382 std::string tmp;
1383 if (db->rep->GetProperty(column_family->rep, Slice(propname), &tmp)) {
1384 // We use strdup() since we expect human readable output.
1385 return strdup(tmp.c_str());
1386 } else {
1387 return nullptr;
1388 }
1389}
1390
1391void rocksdb_approximate_sizes(
1392 rocksdb_t* db,
1393 int num_ranges,
1394 const char* const* range_start_key, const size_t* range_start_key_len,
1395 const char* const* range_limit_key, const size_t* range_limit_key_len,
1396 uint64_t* sizes) {
1397 Range* ranges = new Range[num_ranges];
1398 for (int i = 0; i < num_ranges; i++) {
1399 ranges[i].start = Slice(range_start_key[i], range_start_key_len[i]);
1400 ranges[i].limit = Slice(range_limit_key[i], range_limit_key_len[i]);
1401 }
1402 db->rep->GetApproximateSizes(ranges, num_ranges, sizes);
1403 delete[] ranges;
1404}
1405
1406void rocksdb_approximate_sizes_cf(
1407 rocksdb_t* db,
1408 rocksdb_column_family_handle_t* column_family,
1409 int num_ranges,
1410 const char* const* range_start_key, const size_t* range_start_key_len,
1411 const char* const* range_limit_key, const size_t* range_limit_key_len,
1412 uint64_t* sizes) {
1413 Range* ranges = new Range[num_ranges];
1414 for (int i = 0; i < num_ranges; i++) {
1415 ranges[i].start = Slice(range_start_key[i], range_start_key_len[i]);
1416 ranges[i].limit = Slice(range_limit_key[i], range_limit_key_len[i]);
1417 }
1418 db->rep->GetApproximateSizes(column_family->rep, ranges, num_ranges, sizes);
1419 delete[] ranges;
1420}
1421
1422void rocksdb_delete_file(
1423 rocksdb_t* db,
1424 const char* name) {
1425 db->rep->DeleteFile(name);
1426}
1427
1428const rocksdb_livefiles_t* rocksdb_livefiles(
1429 rocksdb_t* db) {
1430 rocksdb_livefiles_t* result = new rocksdb_livefiles_t;
1431 db->rep->GetLiveFilesMetaData(&result->rep);
1432 return result;
1433}
1434
1435void rocksdb_compact_range(
1436 rocksdb_t* db,
1437 const char* start_key, size_t start_key_len,
1438 const char* limit_key, size_t limit_key_len) {
1439 Slice a, b;
1440 db->rep->CompactRange(
1441 CompactRangeOptions(),
1442 // Pass nullptr Slice if corresponding "const char*" is nullptr
1443 (start_key ? (a = Slice(start_key, start_key_len), &a) : nullptr),
1444 (limit_key ? (b = Slice(limit_key, limit_key_len), &b) : nullptr));
1445}
1446
1447void rocksdb_compact_range_cf(
1448 rocksdb_t* db,
1449 rocksdb_column_family_handle_t* column_family,
1450 const char* start_key, size_t start_key_len,
1451 const char* limit_key, size_t limit_key_len) {
1452 Slice a, b;
1453 db->rep->CompactRange(
1454 CompactRangeOptions(), column_family->rep,
1455 // Pass nullptr Slice if corresponding "const char*" is nullptr
1456 (start_key ? (a = Slice(start_key, start_key_len), &a) : nullptr),
1457 (limit_key ? (b = Slice(limit_key, limit_key_len), &b) : nullptr));
1458}
1459
1460void rocksdb_compact_range_opt(rocksdb_t* db, rocksdb_compactoptions_t* opt,
1461 const char* start_key, size_t start_key_len,
1462 const char* limit_key, size_t limit_key_len) {
1463 Slice a, b;
1464 db->rep->CompactRange(
1465 opt->rep,
1466 // Pass nullptr Slice if corresponding "const char*" is nullptr
1467 (start_key ? (a = Slice(start_key, start_key_len), &a) : nullptr),
1468 (limit_key ? (b = Slice(limit_key, limit_key_len), &b) : nullptr));
1469}
1470
1471void rocksdb_compact_range_cf_opt(rocksdb_t* db,
1472 rocksdb_column_family_handle_t* column_family,
1473 rocksdb_compactoptions_t* opt,
1474 const char* start_key, size_t start_key_len,
1475 const char* limit_key, size_t limit_key_len) {
1476 Slice a, b;
1477 db->rep->CompactRange(
1478 opt->rep, column_family->rep,
1479 // Pass nullptr Slice if corresponding "const char*" is nullptr
1480 (start_key ? (a = Slice(start_key, start_key_len), &a) : nullptr),
1481 (limit_key ? (b = Slice(limit_key, limit_key_len), &b) : nullptr));
1482}
1483
1484void rocksdb_flush(
1485 rocksdb_t* db,
1486 const rocksdb_flushoptions_t* options,
1487 char** errptr) {
1488 SaveError(errptr, db->rep->Flush(options->rep));
1489}
1490
f67539c2
TL
1491void rocksdb_flush_cf(
1492 rocksdb_t* db,
1493 const rocksdb_flushoptions_t* options,
1494 rocksdb_column_family_handle_t* column_family,
1495 char** errptr) {
1496 SaveError(errptr, db->rep->Flush(options->rep, column_family->rep));
1497}
1498
7c673cae
FG
1499void rocksdb_disable_file_deletions(
1500 rocksdb_t* db,
1501 char** errptr) {
1502 SaveError(errptr, db->rep->DisableFileDeletions());
1503}
1504
1505void rocksdb_enable_file_deletions(
1506 rocksdb_t* db,
1507 unsigned char force,
1508 char** errptr) {
1509 SaveError(errptr, db->rep->EnableFileDeletions(force));
1510}
1511
1512void rocksdb_destroy_db(
1513 const rocksdb_options_t* options,
1514 const char* name,
1515 char** errptr) {
1516 SaveError(errptr, DestroyDB(name, options->rep));
1517}
1518
1519void rocksdb_repair_db(
1520 const rocksdb_options_t* options,
1521 const char* name,
1522 char** errptr) {
1523 SaveError(errptr, RepairDB(name, options->rep));
1524}
1525
1526void rocksdb_iter_destroy(rocksdb_iterator_t* iter) {
1527 delete iter->rep;
1528 delete iter;
1529}
1530
1531unsigned char rocksdb_iter_valid(const rocksdb_iterator_t* iter) {
1532 return iter->rep->Valid();
1533}
1534
1535void rocksdb_iter_seek_to_first(rocksdb_iterator_t* iter) {
1536 iter->rep->SeekToFirst();
1537}
1538
1539void rocksdb_iter_seek_to_last(rocksdb_iterator_t* iter) {
1540 iter->rep->SeekToLast();
1541}
1542
1543void rocksdb_iter_seek(rocksdb_iterator_t* iter, const char* k, size_t klen) {
1544 iter->rep->Seek(Slice(k, klen));
1545}
1546
1547void rocksdb_iter_seek_for_prev(rocksdb_iterator_t* iter, const char* k,
1548 size_t klen) {
1549 iter->rep->SeekForPrev(Slice(k, klen));
1550}
1551
1552void rocksdb_iter_next(rocksdb_iterator_t* iter) {
1553 iter->rep->Next();
1554}
1555
1556void rocksdb_iter_prev(rocksdb_iterator_t* iter) {
1557 iter->rep->Prev();
1558}
1559
1560const char* rocksdb_iter_key(const rocksdb_iterator_t* iter, size_t* klen) {
1561 Slice s = iter->rep->key();
1562 *klen = s.size();
1563 return s.data();
1564}
1565
1566const char* rocksdb_iter_value(const rocksdb_iterator_t* iter, size_t* vlen) {
1567 Slice s = iter->rep->value();
1568 *vlen = s.size();
1569 return s.data();
1570}
1571
1572void rocksdb_iter_get_error(const rocksdb_iterator_t* iter, char** errptr) {
1573 SaveError(errptr, iter->rep->status());
1574}
1575
1576rocksdb_writebatch_t* rocksdb_writebatch_create() {
1577 return new rocksdb_writebatch_t;
1578}
1579
1580rocksdb_writebatch_t* rocksdb_writebatch_create_from(const char* rep,
1581 size_t size) {
1582 rocksdb_writebatch_t* b = new rocksdb_writebatch_t;
1583 b->rep = WriteBatch(std::string(rep, size));
1584 return b;
1585}
1586
1587void rocksdb_writebatch_destroy(rocksdb_writebatch_t* b) {
1588 delete b;
1589}
1590
1591void rocksdb_writebatch_clear(rocksdb_writebatch_t* b) {
1592 b->rep.Clear();
1593}
1594
1595int rocksdb_writebatch_count(rocksdb_writebatch_t* b) {
1596 return b->rep.Count();
1597}
1598
1599void rocksdb_writebatch_put(
1600 rocksdb_writebatch_t* b,
1601 const char* key, size_t klen,
1602 const char* val, size_t vlen) {
1603 b->rep.Put(Slice(key, klen), Slice(val, vlen));
1604}
1605
1606void rocksdb_writebatch_put_cf(
1607 rocksdb_writebatch_t* b,
1608 rocksdb_column_family_handle_t* column_family,
1609 const char* key, size_t klen,
1610 const char* val, size_t vlen) {
1611 b->rep.Put(column_family->rep, Slice(key, klen), Slice(val, vlen));
1612}
1613
1614void rocksdb_writebatch_putv(
1615 rocksdb_writebatch_t* b,
1616 int num_keys, const char* const* keys_list,
1617 const size_t* keys_list_sizes,
1618 int num_values, const char* const* values_list,
1619 const size_t* values_list_sizes) {
1620 std::vector<Slice> key_slices(num_keys);
1621 for (int i = 0; i < num_keys; i++) {
1622 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
1623 }
1624 std::vector<Slice> value_slices(num_values);
1625 for (int i = 0; i < num_values; i++) {
1626 value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
1627 }
1628 b->rep.Put(SliceParts(key_slices.data(), num_keys),
1629 SliceParts(value_slices.data(), num_values));
1630}
1631
1632void rocksdb_writebatch_putv_cf(
1633 rocksdb_writebatch_t* b,
1634 rocksdb_column_family_handle_t* column_family,
1635 int num_keys, const char* const* keys_list,
1636 const size_t* keys_list_sizes,
1637 int num_values, const char* const* values_list,
1638 const size_t* values_list_sizes) {
1639 std::vector<Slice> key_slices(num_keys);
1640 for (int i = 0; i < num_keys; i++) {
1641 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
1642 }
1643 std::vector<Slice> value_slices(num_values);
1644 for (int i = 0; i < num_values; i++) {
1645 value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
1646 }
1647 b->rep.Put(column_family->rep, SliceParts(key_slices.data(), num_keys),
1648 SliceParts(value_slices.data(), num_values));
1649}
1650
1651void rocksdb_writebatch_merge(
1652 rocksdb_writebatch_t* b,
1653 const char* key, size_t klen,
1654 const char* val, size_t vlen) {
1655 b->rep.Merge(Slice(key, klen), Slice(val, vlen));
1656}
1657
1658void rocksdb_writebatch_merge_cf(
1659 rocksdb_writebatch_t* b,
1660 rocksdb_column_family_handle_t* column_family,
1661 const char* key, size_t klen,
1662 const char* val, size_t vlen) {
1663 b->rep.Merge(column_family->rep, Slice(key, klen), Slice(val, vlen));
1664}
1665
1666void rocksdb_writebatch_mergev(
1667 rocksdb_writebatch_t* b,
1668 int num_keys, const char* const* keys_list,
1669 const size_t* keys_list_sizes,
1670 int num_values, const char* const* values_list,
1671 const size_t* values_list_sizes) {
1672 std::vector<Slice> key_slices(num_keys);
1673 for (int i = 0; i < num_keys; i++) {
1674 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
1675 }
1676 std::vector<Slice> value_slices(num_values);
1677 for (int i = 0; i < num_values; i++) {
1678 value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
1679 }
1680 b->rep.Merge(SliceParts(key_slices.data(), num_keys),
1681 SliceParts(value_slices.data(), num_values));
1682}
1683
1684void rocksdb_writebatch_mergev_cf(
1685 rocksdb_writebatch_t* b,
1686 rocksdb_column_family_handle_t* column_family,
1687 int num_keys, const char* const* keys_list,
1688 const size_t* keys_list_sizes,
1689 int num_values, const char* const* values_list,
1690 const size_t* values_list_sizes) {
1691 std::vector<Slice> key_slices(num_keys);
1692 for (int i = 0; i < num_keys; i++) {
1693 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
1694 }
1695 std::vector<Slice> value_slices(num_values);
1696 for (int i = 0; i < num_values; i++) {
1697 value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
1698 }
1699 b->rep.Merge(column_family->rep, SliceParts(key_slices.data(), num_keys),
1700 SliceParts(value_slices.data(), num_values));
1701}
1702
1703void rocksdb_writebatch_delete(
1704 rocksdb_writebatch_t* b,
1705 const char* key, size_t klen) {
1706 b->rep.Delete(Slice(key, klen));
1707}
1708
20effc67
TL
1709void rocksdb_writebatch_singledelete(rocksdb_writebatch_t* b, const char* key,
1710 size_t klen) {
1711 b->rep.SingleDelete(Slice(key, klen));
1712}
1713
7c673cae
FG
1714void rocksdb_writebatch_delete_cf(
1715 rocksdb_writebatch_t* b,
1716 rocksdb_column_family_handle_t* column_family,
1717 const char* key, size_t klen) {
1718 b->rep.Delete(column_family->rep, Slice(key, klen));
1719}
1720
20effc67
TL
1721void rocksdb_writebatch_singledelete_cf(
1722 rocksdb_writebatch_t* b, rocksdb_column_family_handle_t* column_family,
1723 const char* key, size_t klen) {
1724 b->rep.SingleDelete(column_family->rep, Slice(key, klen));
1725}
1726
7c673cae
FG
1727void rocksdb_writebatch_deletev(
1728 rocksdb_writebatch_t* b,
1729 int num_keys, const char* const* keys_list,
1730 const size_t* keys_list_sizes) {
1731 std::vector<Slice> key_slices(num_keys);
1732 for (int i = 0; i < num_keys; i++) {
1733 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
1734 }
1735 b->rep.Delete(SliceParts(key_slices.data(), num_keys));
1736}
1737
1738void rocksdb_writebatch_deletev_cf(
1739 rocksdb_writebatch_t* b,
1740 rocksdb_column_family_handle_t* column_family,
1741 int num_keys, const char* const* keys_list,
1742 const size_t* keys_list_sizes) {
1743 std::vector<Slice> key_slices(num_keys);
1744 for (int i = 0; i < num_keys; i++) {
1745 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
1746 }
1747 b->rep.Delete(column_family->rep, SliceParts(key_slices.data(), num_keys));
1748}
1749
1750void rocksdb_writebatch_delete_range(rocksdb_writebatch_t* b,
1751 const char* start_key,
1752 size_t start_key_len, const char* end_key,
1753 size_t end_key_len) {
1754 b->rep.DeleteRange(Slice(start_key, start_key_len),
1755 Slice(end_key, end_key_len));
1756}
1757
1758void rocksdb_writebatch_delete_range_cf(
1759 rocksdb_writebatch_t* b, rocksdb_column_family_handle_t* column_family,
1760 const char* start_key, size_t start_key_len, const char* end_key,
1761 size_t end_key_len) {
1762 b->rep.DeleteRange(column_family->rep, Slice(start_key, start_key_len),
1763 Slice(end_key, end_key_len));
1764}
1765
1766void rocksdb_writebatch_delete_rangev(rocksdb_writebatch_t* b, int num_keys,
1767 const char* const* start_keys_list,
1768 const size_t* start_keys_list_sizes,
1769 const char* const* end_keys_list,
1770 const size_t* end_keys_list_sizes) {
1771 std::vector<Slice> start_key_slices(num_keys);
1772 std::vector<Slice> end_key_slices(num_keys);
1773 for (int i = 0; i < num_keys; i++) {
1774 start_key_slices[i] = Slice(start_keys_list[i], start_keys_list_sizes[i]);
1775 end_key_slices[i] = Slice(end_keys_list[i], end_keys_list_sizes[i]);
1776 }
1777 b->rep.DeleteRange(SliceParts(start_key_slices.data(), num_keys),
1778 SliceParts(end_key_slices.data(), num_keys));
1779}
1780
1781void rocksdb_writebatch_delete_rangev_cf(
1782 rocksdb_writebatch_t* b, rocksdb_column_family_handle_t* column_family,
1783 int num_keys, const char* const* start_keys_list,
1784 const size_t* start_keys_list_sizes, const char* const* end_keys_list,
1785 const size_t* end_keys_list_sizes) {
1786 std::vector<Slice> start_key_slices(num_keys);
1787 std::vector<Slice> end_key_slices(num_keys);
1788 for (int i = 0; i < num_keys; i++) {
1789 start_key_slices[i] = Slice(start_keys_list[i], start_keys_list_sizes[i]);
1790 end_key_slices[i] = Slice(end_keys_list[i], end_keys_list_sizes[i]);
1791 }
1792 b->rep.DeleteRange(column_family->rep,
1793 SliceParts(start_key_slices.data(), num_keys),
1794 SliceParts(end_key_slices.data(), num_keys));
1795}
1796
1797void rocksdb_writebatch_put_log_data(
1798 rocksdb_writebatch_t* b,
1799 const char* blob, size_t len) {
1800 b->rep.PutLogData(Slice(blob, len));
1801}
1802
11fdf7f2
TL
1803class H : public WriteBatch::Handler {
1804 public:
1805 void* state_;
1806 void (*put_)(void*, const char* k, size_t klen, const char* v, size_t vlen);
1807 void (*deleted_)(void*, const char* k, size_t klen);
494da23a 1808 void Put(const Slice& key, const Slice& value) override {
11fdf7f2
TL
1809 (*put_)(state_, key.data(), key.size(), value.data(), value.size());
1810 }
494da23a 1811 void Delete(const Slice& key) override {
11fdf7f2
TL
1812 (*deleted_)(state_, key.data(), key.size());
1813 }
1814};
1815
7c673cae
FG
1816void rocksdb_writebatch_iterate(
1817 rocksdb_writebatch_t* b,
1818 void* state,
1819 void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen),
1820 void (*deleted)(void*, const char* k, size_t klen)) {
7c673cae
FG
1821 H handler;
1822 handler.state_ = state;
1823 handler.put_ = put;
1824 handler.deleted_ = deleted;
1825 b->rep.Iterate(&handler);
1826}
1827
1828const char* rocksdb_writebatch_data(rocksdb_writebatch_t* b, size_t* size) {
1829 *size = b->rep.GetDataSize();
1830 return b->rep.Data().c_str();
1831}
1832
1833void rocksdb_writebatch_set_save_point(rocksdb_writebatch_t* b) {
1834 b->rep.SetSavePoint();
1835}
1836
1837void rocksdb_writebatch_rollback_to_save_point(rocksdb_writebatch_t* b,
1838 char** errptr) {
1839 SaveError(errptr, b->rep.RollbackToSavePoint());
1840}
1841
11fdf7f2
TL
1842void rocksdb_writebatch_pop_save_point(rocksdb_writebatch_t* b, char** errptr) {
1843 SaveError(errptr, b->rep.PopSavePoint());
1844}
1845
7c673cae
FG
1846rocksdb_writebatch_wi_t* rocksdb_writebatch_wi_create(size_t reserved_bytes, unsigned char overwrite_key) {
1847 rocksdb_writebatch_wi_t* b = new rocksdb_writebatch_wi_t;
1848 b->rep = new WriteBatchWithIndex(BytewiseComparator(), reserved_bytes, overwrite_key);
1849 return b;
1850}
1851
1852void rocksdb_writebatch_wi_destroy(rocksdb_writebatch_wi_t* b) {
1853 if (b->rep) {
1854 delete b->rep;
1855 }
1856 delete b;
1857}
1858
1859void rocksdb_writebatch_wi_clear(rocksdb_writebatch_wi_t* b) {
1860 b->rep->Clear();
1861}
1862
1863int rocksdb_writebatch_wi_count(rocksdb_writebatch_wi_t* b) {
1864 return b->rep->GetWriteBatch()->Count();
1865}
1866
1867void rocksdb_writebatch_wi_put(
1868 rocksdb_writebatch_wi_t* b,
1869 const char* key, size_t klen,
1870 const char* val, size_t vlen) {
1871 b->rep->Put(Slice(key, klen), Slice(val, vlen));
1872}
1873
1874void rocksdb_writebatch_wi_put_cf(
1875 rocksdb_writebatch_wi_t* b,
1876 rocksdb_column_family_handle_t* column_family,
1877 const char* key, size_t klen,
1878 const char* val, size_t vlen) {
1879 b->rep->Put(column_family->rep, Slice(key, klen), Slice(val, vlen));
1880}
1881
1882void rocksdb_writebatch_wi_putv(
1883 rocksdb_writebatch_wi_t* b,
1884 int num_keys, const char* const* keys_list,
1885 const size_t* keys_list_sizes,
1886 int num_values, const char* const* values_list,
1887 const size_t* values_list_sizes) {
1888 std::vector<Slice> key_slices(num_keys);
1889 for (int i = 0; i < num_keys; i++) {
1890 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
1891 }
1892 std::vector<Slice> value_slices(num_values);
1893 for (int i = 0; i < num_values; i++) {
1894 value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
1895 }
1896 b->rep->Put(SliceParts(key_slices.data(), num_keys),
1897 SliceParts(value_slices.data(), num_values));
1898}
1899
1900void rocksdb_writebatch_wi_putv_cf(
1901 rocksdb_writebatch_wi_t* b,
1902 rocksdb_column_family_handle_t* column_family,
1903 int num_keys, const char* const* keys_list,
1904 const size_t* keys_list_sizes,
1905 int num_values, const char* const* values_list,
1906 const size_t* values_list_sizes) {
1907 std::vector<Slice> key_slices(num_keys);
1908 for (int i = 0; i < num_keys; i++) {
1909 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
1910 }
1911 std::vector<Slice> value_slices(num_values);
1912 for (int i = 0; i < num_values; i++) {
1913 value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
1914 }
1915 b->rep->Put(column_family->rep, SliceParts(key_slices.data(), num_keys),
1916 SliceParts(value_slices.data(), num_values));
1917}
1918
1919void rocksdb_writebatch_wi_merge(
1920 rocksdb_writebatch_wi_t* b,
1921 const char* key, size_t klen,
1922 const char* val, size_t vlen) {
1923 b->rep->Merge(Slice(key, klen), Slice(val, vlen));
1924}
1925
1926void rocksdb_writebatch_wi_merge_cf(
1927 rocksdb_writebatch_wi_t* b,
1928 rocksdb_column_family_handle_t* column_family,
1929 const char* key, size_t klen,
1930 const char* val, size_t vlen) {
1931 b->rep->Merge(column_family->rep, Slice(key, klen), Slice(val, vlen));
1932}
1933
1934void rocksdb_writebatch_wi_mergev(
1935 rocksdb_writebatch_wi_t* b,
1936 int num_keys, const char* const* keys_list,
1937 const size_t* keys_list_sizes,
1938 int num_values, const char* const* values_list,
1939 const size_t* values_list_sizes) {
1940 std::vector<Slice> key_slices(num_keys);
1941 for (int i = 0; i < num_keys; i++) {
1942 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
1943 }
1944 std::vector<Slice> value_slices(num_values);
1945 for (int i = 0; i < num_values; i++) {
1946 value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
1947 }
1948 b->rep->Merge(SliceParts(key_slices.data(), num_keys),
1949 SliceParts(value_slices.data(), num_values));
1950}
1951
1952void rocksdb_writebatch_wi_mergev_cf(
1953 rocksdb_writebatch_wi_t* b,
1954 rocksdb_column_family_handle_t* column_family,
1955 int num_keys, const char* const* keys_list,
1956 const size_t* keys_list_sizes,
1957 int num_values, const char* const* values_list,
1958 const size_t* values_list_sizes) {
1959 std::vector<Slice> key_slices(num_keys);
1960 for (int i = 0; i < num_keys; i++) {
1961 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
1962 }
1963 std::vector<Slice> value_slices(num_values);
1964 for (int i = 0; i < num_values; i++) {
1965 value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
1966 }
1967 b->rep->Merge(column_family->rep, SliceParts(key_slices.data(), num_keys),
1968 SliceParts(value_slices.data(), num_values));
1969}
1970
1971void rocksdb_writebatch_wi_delete(
1972 rocksdb_writebatch_wi_t* b,
1973 const char* key, size_t klen) {
1974 b->rep->Delete(Slice(key, klen));
1975}
1976
20effc67
TL
1977void rocksdb_writebatch_wi_singledelete(rocksdb_writebatch_wi_t* b,
1978 const char* key, size_t klen) {
1979 b->rep->SingleDelete(Slice(key, klen));
1980}
1981
7c673cae
FG
1982void rocksdb_writebatch_wi_delete_cf(
1983 rocksdb_writebatch_wi_t* b,
1984 rocksdb_column_family_handle_t* column_family,
1985 const char* key, size_t klen) {
1986 b->rep->Delete(column_family->rep, Slice(key, klen));
1987}
1988
20effc67
TL
1989void rocksdb_writebatch_wi_singledelete_cf(
1990 rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
1991 const char* key, size_t klen) {
1992 b->rep->SingleDelete(column_family->rep, Slice(key, klen));
1993}
1994
7c673cae
FG
1995void rocksdb_writebatch_wi_deletev(
1996 rocksdb_writebatch_wi_t* b,
1997 int num_keys, const char* const* keys_list,
1998 const size_t* keys_list_sizes) {
1999 std::vector<Slice> key_slices(num_keys);
2000 for (int i = 0; i < num_keys; i++) {
2001 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
2002 }
2003 b->rep->Delete(SliceParts(key_slices.data(), num_keys));
2004}
2005
2006void rocksdb_writebatch_wi_deletev_cf(
2007 rocksdb_writebatch_wi_t* b,
2008 rocksdb_column_family_handle_t* column_family,
2009 int num_keys, const char* const* keys_list,
2010 const size_t* keys_list_sizes) {
2011 std::vector<Slice> key_slices(num_keys);
2012 for (int i = 0; i < num_keys; i++) {
2013 key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
2014 }
2015 b->rep->Delete(column_family->rep, SliceParts(key_slices.data(), num_keys));
2016}
2017
2018void rocksdb_writebatch_wi_delete_range(rocksdb_writebatch_wi_t* b,
2019 const char* start_key,
2020 size_t start_key_len, const char* end_key,
2021 size_t end_key_len) {
2022 b->rep->DeleteRange(Slice(start_key, start_key_len),
2023 Slice(end_key, end_key_len));
2024}
2025
2026void rocksdb_writebatch_wi_delete_range_cf(
2027 rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
2028 const char* start_key, size_t start_key_len, const char* end_key,
2029 size_t end_key_len) {
2030 b->rep->DeleteRange(column_family->rep, Slice(start_key, start_key_len),
2031 Slice(end_key, end_key_len));
2032}
2033
2034void rocksdb_writebatch_wi_delete_rangev(rocksdb_writebatch_wi_t* b, int num_keys,
2035 const char* const* start_keys_list,
2036 const size_t* start_keys_list_sizes,
2037 const char* const* end_keys_list,
2038 const size_t* end_keys_list_sizes) {
2039 std::vector<Slice> start_key_slices(num_keys);
2040 std::vector<Slice> end_key_slices(num_keys);
2041 for (int i = 0; i < num_keys; i++) {
2042 start_key_slices[i] = Slice(start_keys_list[i], start_keys_list_sizes[i]);
2043 end_key_slices[i] = Slice(end_keys_list[i], end_keys_list_sizes[i]);
2044 }
2045 b->rep->DeleteRange(SliceParts(start_key_slices.data(), num_keys),
2046 SliceParts(end_key_slices.data(), num_keys));
2047}
2048
2049void rocksdb_writebatch_wi_delete_rangev_cf(
2050 rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
2051 int num_keys, const char* const* start_keys_list,
2052 const size_t* start_keys_list_sizes, const char* const* end_keys_list,
2053 const size_t* end_keys_list_sizes) {
2054 std::vector<Slice> start_key_slices(num_keys);
2055 std::vector<Slice> end_key_slices(num_keys);
2056 for (int i = 0; i < num_keys; i++) {
2057 start_key_slices[i] = Slice(start_keys_list[i], start_keys_list_sizes[i]);
2058 end_key_slices[i] = Slice(end_keys_list[i], end_keys_list_sizes[i]);
2059 }
2060 b->rep->DeleteRange(column_family->rep,
2061 SliceParts(start_key_slices.data(), num_keys),
2062 SliceParts(end_key_slices.data(), num_keys));
2063}
2064
2065void rocksdb_writebatch_wi_put_log_data(
2066 rocksdb_writebatch_wi_t* b,
2067 const char* blob, size_t len) {
2068 b->rep->PutLogData(Slice(blob, len));
2069}
2070
2071void rocksdb_writebatch_wi_iterate(
2072 rocksdb_writebatch_wi_t* b,
2073 void* state,
2074 void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen),
2075 void (*deleted)(void*, const char* k, size_t klen)) {
7c673cae
FG
2076 H handler;
2077 handler.state_ = state;
2078 handler.put_ = put;
2079 handler.deleted_ = deleted;
2080 b->rep->GetWriteBatch()->Iterate(&handler);
2081}
2082
2083const char* rocksdb_writebatch_wi_data(rocksdb_writebatch_wi_t* b, size_t* size) {
2084 WriteBatch* wb = b->rep->GetWriteBatch();
2085 *size = wb->GetDataSize();
2086 return wb->Data().c_str();
2087}
2088
2089void rocksdb_writebatch_wi_set_save_point(rocksdb_writebatch_wi_t* b) {
2090 b->rep->SetSavePoint();
2091}
2092
2093void rocksdb_writebatch_wi_rollback_to_save_point(rocksdb_writebatch_wi_t* b,
2094 char** errptr) {
2095 SaveError(errptr, b->rep->RollbackToSavePoint());
2096}
2097
2098rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base(
2099 rocksdb_writebatch_wi_t* wbwi,
2100 rocksdb_iterator_t* base_iterator) {
2101 rocksdb_iterator_t* result = new rocksdb_iterator_t;
2102 result->rep = wbwi->rep->NewIteratorWithBase(base_iterator->rep);
2103 delete base_iterator;
2104 return result;
2105}
2106
2107rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base_cf(
494da23a 2108 rocksdb_writebatch_wi_t* wbwi, rocksdb_iterator_t* base_iterator,
7c673cae
FG
2109 rocksdb_column_family_handle_t* column_family) {
2110 rocksdb_iterator_t* result = new rocksdb_iterator_t;
494da23a
TL
2111 result->rep =
2112 wbwi->rep->NewIteratorWithBase(column_family->rep, base_iterator->rep);
7c673cae
FG
2113 delete base_iterator;
2114 return result;
2115}
2116
2117char* rocksdb_writebatch_wi_get_from_batch(
2118 rocksdb_writebatch_wi_t* wbwi,
2119 const rocksdb_options_t* options,
2120 const char* key, size_t keylen,
2121 size_t* vallen,
2122 char** errptr) {
2123 char* result = nullptr;
2124 std::string tmp;
2125 Status s = wbwi->rep->GetFromBatch(options->rep, Slice(key, keylen), &tmp);
2126 if (s.ok()) {
2127 *vallen = tmp.size();
2128 result = CopyString(tmp);
2129 } else {
2130 *vallen = 0;
2131 if (!s.IsNotFound()) {
2132 SaveError(errptr, s);
2133 }
2134 }
2135 return result;
2136}
2137
2138char* rocksdb_writebatch_wi_get_from_batch_cf(
2139 rocksdb_writebatch_wi_t* wbwi,
2140 const rocksdb_options_t* options,
2141 rocksdb_column_family_handle_t* column_family,
2142 const char* key, size_t keylen,
2143 size_t* vallen,
2144 char** errptr) {
2145 char* result = nullptr;
2146 std::string tmp;
2147 Status s = wbwi->rep->GetFromBatch(column_family->rep, options->rep,
2148 Slice(key, keylen), &tmp);
2149 if (s.ok()) {
2150 *vallen = tmp.size();
2151 result = CopyString(tmp);
2152 } else {
2153 *vallen = 0;
2154 if (!s.IsNotFound()) {
2155 SaveError(errptr, s);
2156 }
2157 }
2158 return result;
2159}
2160
2161char* rocksdb_writebatch_wi_get_from_batch_and_db(
2162 rocksdb_writebatch_wi_t* wbwi,
2163 rocksdb_t* db,
2164 const rocksdb_readoptions_t* options,
2165 const char* key, size_t keylen,
2166 size_t* vallen,
2167 char** errptr) {
2168 char* result = nullptr;
2169 std::string tmp;
2170 Status s = wbwi->rep->GetFromBatchAndDB(db->rep, options->rep, Slice(key, keylen), &tmp);
2171 if (s.ok()) {
2172 *vallen = tmp.size();
2173 result = CopyString(tmp);
2174 } else {
2175 *vallen = 0;
2176 if (!s.IsNotFound()) {
2177 SaveError(errptr, s);
2178 }
2179 }
2180 return result;
2181}
2182
2183char* rocksdb_writebatch_wi_get_from_batch_and_db_cf(
2184 rocksdb_writebatch_wi_t* wbwi,
2185 rocksdb_t* db,
2186 const rocksdb_readoptions_t* options,
2187 rocksdb_column_family_handle_t* column_family,
2188 const char* key, size_t keylen,
2189 size_t* vallen,
2190 char** errptr) {
2191 char* result = nullptr;
2192 std::string tmp;
2193 Status s = wbwi->rep->GetFromBatchAndDB(db->rep, options->rep, column_family->rep,
2194 Slice(key, keylen), &tmp);
2195 if (s.ok()) {
2196 *vallen = tmp.size();
2197 result = CopyString(tmp);
2198 } else {
2199 *vallen = 0;
2200 if (!s.IsNotFound()) {
2201 SaveError(errptr, s);
2202 }
2203 }
2204 return result;
2205}
2206
2207void rocksdb_write_writebatch_wi(
2208 rocksdb_t* db,
2209 const rocksdb_writeoptions_t* options,
2210 rocksdb_writebatch_wi_t* wbwi,
2211 char** errptr) {
2212 WriteBatch* wb = wbwi->rep->GetWriteBatch();
2213 SaveError(errptr, db->rep->Write(options->rep, wb));
2214}
2215
2216rocksdb_block_based_table_options_t*
2217rocksdb_block_based_options_create() {
2218 return new rocksdb_block_based_table_options_t;
2219}
2220
2221void rocksdb_block_based_options_destroy(
2222 rocksdb_block_based_table_options_t* options) {
2223 delete options;
2224}
2225
2226void rocksdb_block_based_options_set_block_size(
2227 rocksdb_block_based_table_options_t* options, size_t block_size) {
2228 options->rep.block_size = block_size;
2229}
2230
2231void rocksdb_block_based_options_set_block_size_deviation(
2232 rocksdb_block_based_table_options_t* options, int block_size_deviation) {
2233 options->rep.block_size_deviation = block_size_deviation;
2234}
2235
2236void rocksdb_block_based_options_set_block_restart_interval(
2237 rocksdb_block_based_table_options_t* options, int block_restart_interval) {
2238 options->rep.block_restart_interval = block_restart_interval;
2239}
2240
11fdf7f2
TL
2241void rocksdb_block_based_options_set_index_block_restart_interval(
2242 rocksdb_block_based_table_options_t* options, int index_block_restart_interval) {
2243 options->rep.index_block_restart_interval = index_block_restart_interval;
2244}
2245
2246void rocksdb_block_based_options_set_metadata_block_size(
2247 rocksdb_block_based_table_options_t* options, uint64_t metadata_block_size) {
2248 options->rep.metadata_block_size = metadata_block_size;
2249}
2250
2251void rocksdb_block_based_options_set_partition_filters(
2252 rocksdb_block_based_table_options_t* options, unsigned char partition_filters) {
2253 options->rep.partition_filters = partition_filters;
2254}
2255
2256void rocksdb_block_based_options_set_use_delta_encoding(
2257 rocksdb_block_based_table_options_t* options, unsigned char use_delta_encoding) {
2258 options->rep.use_delta_encoding = use_delta_encoding;
2259}
2260
7c673cae
FG
2261void rocksdb_block_based_options_set_filter_policy(
2262 rocksdb_block_based_table_options_t* options,
2263 rocksdb_filterpolicy_t* filter_policy) {
2264 options->rep.filter_policy.reset(filter_policy);
2265}
2266
2267void rocksdb_block_based_options_set_no_block_cache(
2268 rocksdb_block_based_table_options_t* options,
2269 unsigned char no_block_cache) {
2270 options->rep.no_block_cache = no_block_cache;
2271}
2272
2273void rocksdb_block_based_options_set_block_cache(
2274 rocksdb_block_based_table_options_t* options,
2275 rocksdb_cache_t* block_cache) {
2276 if (block_cache) {
2277 options->rep.block_cache = block_cache->rep;
2278 }
2279}
2280
2281void rocksdb_block_based_options_set_block_cache_compressed(
2282 rocksdb_block_based_table_options_t* options,
2283 rocksdb_cache_t* block_cache_compressed) {
2284 if (block_cache_compressed) {
2285 options->rep.block_cache_compressed = block_cache_compressed->rep;
2286 }
2287}
2288
2289void rocksdb_block_based_options_set_whole_key_filtering(
2290 rocksdb_block_based_table_options_t* options, unsigned char v) {
2291 options->rep.whole_key_filtering = v;
2292}
2293
2294void rocksdb_block_based_options_set_format_version(
2295 rocksdb_block_based_table_options_t* options, int v) {
2296 options->rep.format_version = v;
2297}
2298
2299void rocksdb_block_based_options_set_index_type(
2300 rocksdb_block_based_table_options_t* options, int v) {
2301 options->rep.index_type = static_cast<BlockBasedTableOptions::IndexType>(v);
2302}
2303
f67539c2
TL
2304void rocksdb_block_based_options_set_data_block_index_type(
2305 rocksdb_block_based_table_options_t* options, int v) {
2306 options->rep.data_block_index_type =
2307 static_cast<BlockBasedTableOptions::DataBlockIndexType>(v);
2308}
2309
2310void rocksdb_block_based_options_set_data_block_hash_ratio(
2311 rocksdb_block_based_table_options_t* options, double v) {
2312 options->rep.data_block_hash_table_util_ratio = v;
2313}
2314
7c673cae
FG
2315void rocksdb_block_based_options_set_hash_index_allow_collision(
2316 rocksdb_block_based_table_options_t* options, unsigned char v) {
2317 options->rep.hash_index_allow_collision = v;
2318}
2319
2320void rocksdb_block_based_options_set_cache_index_and_filter_blocks(
2321 rocksdb_block_based_table_options_t* options, unsigned char v) {
2322 options->rep.cache_index_and_filter_blocks = v;
2323}
2324
11fdf7f2
TL
2325void rocksdb_block_based_options_set_cache_index_and_filter_blocks_with_high_priority(
2326 rocksdb_block_based_table_options_t* options, unsigned char v) {
2327 options->rep.cache_index_and_filter_blocks_with_high_priority = v;
2328}
2329
7c673cae
FG
2330void rocksdb_block_based_options_set_pin_l0_filter_and_index_blocks_in_cache(
2331 rocksdb_block_based_table_options_t* options, unsigned char v) {
2332 options->rep.pin_l0_filter_and_index_blocks_in_cache = v;
2333}
2334
11fdf7f2
TL
2335void rocksdb_block_based_options_set_pin_top_level_index_and_filter(
2336 rocksdb_block_based_table_options_t* options, unsigned char v) {
2337 options->rep.pin_top_level_index_and_filter = v;
2338}
2339
7c673cae
FG
2340void rocksdb_options_set_block_based_table_factory(
2341 rocksdb_options_t *opt,
2342 rocksdb_block_based_table_options_t* table_options) {
2343 if (table_options) {
2344 opt->rep.table_factory.reset(
f67539c2 2345 ROCKSDB_NAMESPACE::NewBlockBasedTableFactory(table_options->rep));
7c673cae
FG
2346 }
2347}
2348
7c673cae
FG
2349rocksdb_cuckoo_table_options_t*
2350rocksdb_cuckoo_options_create() {
2351 return new rocksdb_cuckoo_table_options_t;
2352}
2353
2354void rocksdb_cuckoo_options_destroy(
2355 rocksdb_cuckoo_table_options_t* options) {
2356 delete options;
2357}
2358
2359void rocksdb_cuckoo_options_set_hash_ratio(
2360 rocksdb_cuckoo_table_options_t* options, double v) {
2361 options->rep.hash_table_ratio = v;
2362}
2363
2364void rocksdb_cuckoo_options_set_max_search_depth(
2365 rocksdb_cuckoo_table_options_t* options, uint32_t v) {
2366 options->rep.max_search_depth = v;
2367}
2368
2369void rocksdb_cuckoo_options_set_cuckoo_block_size(
2370 rocksdb_cuckoo_table_options_t* options, uint32_t v) {
2371 options->rep.cuckoo_block_size = v;
2372}
2373
2374void rocksdb_cuckoo_options_set_identity_as_first_hash(
2375 rocksdb_cuckoo_table_options_t* options, unsigned char v) {
2376 options->rep.identity_as_first_hash = v;
2377}
2378
2379void rocksdb_cuckoo_options_set_use_module_hash(
2380 rocksdb_cuckoo_table_options_t* options, unsigned char v) {
2381 options->rep.use_module_hash = v;
2382}
2383
2384void rocksdb_options_set_cuckoo_table_factory(
2385 rocksdb_options_t *opt,
2386 rocksdb_cuckoo_table_options_t* table_options) {
2387 if (table_options) {
2388 opt->rep.table_factory.reset(
f67539c2 2389 ROCKSDB_NAMESPACE::NewCuckooTableFactory(table_options->rep));
7c673cae
FG
2390 }
2391}
2392
2393void rocksdb_set_options(
2394 rocksdb_t* db, int count, const char* const keys[], const char* const values[], char** errptr) {
2395 std::unordered_map<std::string, std::string> options_map;
2396 for (int i=0; i<count; i++)
2397 options_map[keys[i]] = values[i];
2398 SaveError(errptr,
2399 db->rep->SetOptions(options_map));
2400 }
2401
494da23a
TL
2402void rocksdb_set_options_cf(
2403 rocksdb_t* db, rocksdb_column_family_handle_t* handle, int count, const char* const keys[], const char* const values[], char** errptr) {
2404 std::unordered_map<std::string, std::string> options_map;
2405 for (int i=0; i<count; i++)
2406 options_map[keys[i]] = values[i];
2407 SaveError(errptr,
2408 db->rep->SetOptions(handle->rep, options_map));
2409 }
2410
7c673cae
FG
2411rocksdb_options_t* rocksdb_options_create() {
2412 return new rocksdb_options_t;
2413}
2414
2415void rocksdb_options_destroy(rocksdb_options_t* options) {
2416 delete options;
2417}
2418
20effc67
TL
2419rocksdb_options_t* rocksdb_options_create_copy(rocksdb_options_t* options) {
2420 return new rocksdb_options_t(*options);
2421}
2422
7c673cae
FG
2423void rocksdb_options_increase_parallelism(
2424 rocksdb_options_t* opt, int total_threads) {
2425 opt->rep.IncreaseParallelism(total_threads);
2426}
2427
2428void rocksdb_options_optimize_for_point_lookup(
2429 rocksdb_options_t* opt, uint64_t block_cache_size_mb) {
2430 opt->rep.OptimizeForPointLookup(block_cache_size_mb);
2431}
2432
2433void rocksdb_options_optimize_level_style_compaction(
2434 rocksdb_options_t* opt, uint64_t memtable_memory_budget) {
2435 opt->rep.OptimizeLevelStyleCompaction(memtable_memory_budget);
2436}
2437
2438void rocksdb_options_optimize_universal_style_compaction(
2439 rocksdb_options_t* opt, uint64_t memtable_memory_budget) {
2440 opt->rep.OptimizeUniversalStyleCompaction(memtable_memory_budget);
2441}
2442
11fdf7f2
TL
2443void rocksdb_options_set_allow_ingest_behind(
2444 rocksdb_options_t* opt, unsigned char v) {
2445 opt->rep.allow_ingest_behind = v;
2446}
2447
20effc67
TL
2448unsigned char rocksdb_options_get_allow_ingest_behind(rocksdb_options_t* opt) {
2449 return opt->rep.allow_ingest_behind;
2450}
2451
7c673cae
FG
2452void rocksdb_options_set_compaction_filter(
2453 rocksdb_options_t* opt,
2454 rocksdb_compactionfilter_t* filter) {
2455 opt->rep.compaction_filter = filter;
2456}
2457
2458void rocksdb_options_set_compaction_filter_factory(
2459 rocksdb_options_t* opt, rocksdb_compactionfilterfactory_t* factory) {
2460 opt->rep.compaction_filter_factory =
2461 std::shared_ptr<CompactionFilterFactory>(factory);
2462}
2463
2464void rocksdb_options_compaction_readahead_size(
2465 rocksdb_options_t* opt, size_t s) {
2466 opt->rep.compaction_readahead_size = s;
2467}
2468
20effc67
TL
2469size_t rocksdb_options_get_compaction_readahead_size(rocksdb_options_t* opt) {
2470 return opt->rep.compaction_readahead_size;
2471}
2472
7c673cae
FG
2473void rocksdb_options_set_comparator(
2474 rocksdb_options_t* opt,
2475 rocksdb_comparator_t* cmp) {
2476 opt->rep.comparator = cmp;
2477}
2478
2479void rocksdb_options_set_merge_operator(
2480 rocksdb_options_t* opt,
2481 rocksdb_mergeoperator_t* merge_operator) {
2482 opt->rep.merge_operator = std::shared_ptr<MergeOperator>(merge_operator);
2483}
2484
7c673cae
FG
2485void rocksdb_options_set_create_if_missing(
2486 rocksdb_options_t* opt, unsigned char v) {
2487 opt->rep.create_if_missing = v;
2488}
2489
20effc67
TL
2490unsigned char rocksdb_options_get_create_if_missing(rocksdb_options_t* opt) {
2491 return opt->rep.create_if_missing;
2492}
2493
7c673cae
FG
2494void rocksdb_options_set_create_missing_column_families(
2495 rocksdb_options_t* opt, unsigned char v) {
2496 opt->rep.create_missing_column_families = v;
2497}
2498
20effc67
TL
2499unsigned char rocksdb_options_get_create_missing_column_families(
2500 rocksdb_options_t* opt) {
2501 return opt->rep.create_missing_column_families;
2502}
2503
7c673cae
FG
2504void rocksdb_options_set_error_if_exists(
2505 rocksdb_options_t* opt, unsigned char v) {
2506 opt->rep.error_if_exists = v;
2507}
2508
20effc67
TL
2509unsigned char rocksdb_options_get_error_if_exists(rocksdb_options_t* opt) {
2510 return opt->rep.error_if_exists;
2511}
2512
7c673cae
FG
2513void rocksdb_options_set_paranoid_checks(
2514 rocksdb_options_t* opt, unsigned char v) {
2515 opt->rep.paranoid_checks = v;
2516}
2517
20effc67
TL
2518unsigned char rocksdb_options_get_paranoid_checks(rocksdb_options_t* opt) {
2519 return opt->rep.paranoid_checks;
2520}
2521
11fdf7f2
TL
2522void rocksdb_options_set_db_paths(rocksdb_options_t* opt,
2523 const rocksdb_dbpath_t** dbpath_values,
2524 size_t num_paths) {
2525 std::vector<DbPath> db_paths(num_paths);
2526 for (size_t i = 0; i < num_paths; ++i) {
2527 db_paths[i] = dbpath_values[i]->rep;
2528 }
2529 opt->rep.db_paths = db_paths;
2530}
2531
7c673cae
FG
2532void rocksdb_options_set_env(rocksdb_options_t* opt, rocksdb_env_t* env) {
2533 opt->rep.env = (env ? env->rep : nullptr);
2534}
2535
2536void rocksdb_options_set_info_log(rocksdb_options_t* opt, rocksdb_logger_t* l) {
2537 if (l) {
2538 opt->rep.info_log = l->rep;
2539 }
2540}
2541
2542void rocksdb_options_set_info_log_level(
2543 rocksdb_options_t* opt, int v) {
2544 opt->rep.info_log_level = static_cast<InfoLogLevel>(v);
2545}
2546
20effc67
TL
2547int rocksdb_options_get_info_log_level(rocksdb_options_t* opt) {
2548 return static_cast<int>(opt->rep.info_log_level);
2549}
2550
7c673cae
FG
2551void rocksdb_options_set_db_write_buffer_size(rocksdb_options_t* opt,
2552 size_t s) {
2553 opt->rep.db_write_buffer_size = s;
2554}
2555
20effc67
TL
2556size_t rocksdb_options_get_db_write_buffer_size(rocksdb_options_t* opt) {
2557 return opt->rep.db_write_buffer_size;
2558}
2559
7c673cae
FG
2560void rocksdb_options_set_write_buffer_size(rocksdb_options_t* opt, size_t s) {
2561 opt->rep.write_buffer_size = s;
2562}
2563
20effc67
TL
2564size_t rocksdb_options_get_write_buffer_size(rocksdb_options_t* opt) {
2565 return opt->rep.write_buffer_size;
2566}
2567
7c673cae
FG
2568void rocksdb_options_set_max_open_files(rocksdb_options_t* opt, int n) {
2569 opt->rep.max_open_files = n;
2570}
2571
20effc67
TL
2572int rocksdb_options_get_max_open_files(rocksdb_options_t* opt) {
2573 return opt->rep.max_open_files;
2574}
2575
11fdf7f2
TL
2576void rocksdb_options_set_max_file_opening_threads(rocksdb_options_t* opt, int n) {
2577 opt->rep.max_file_opening_threads = n;
2578}
2579
20effc67
TL
2580int rocksdb_options_get_max_file_opening_threads(rocksdb_options_t* opt) {
2581 return opt->rep.max_file_opening_threads;
2582}
2583
7c673cae
FG
2584void rocksdb_options_set_max_total_wal_size(rocksdb_options_t* opt, uint64_t n) {
2585 opt->rep.max_total_wal_size = n;
2586}
2587
20effc67
TL
2588uint64_t rocksdb_options_get_max_total_wal_size(rocksdb_options_t* opt) {
2589 return opt->rep.max_total_wal_size;
2590}
2591
7c673cae
FG
2592void rocksdb_options_set_target_file_size_base(
2593 rocksdb_options_t* opt, uint64_t n) {
2594 opt->rep.target_file_size_base = n;
2595}
2596
20effc67
TL
2597uint64_t rocksdb_options_get_target_file_size_base(rocksdb_options_t* opt) {
2598 return opt->rep.target_file_size_base;
2599}
2600
7c673cae
FG
2601void rocksdb_options_set_target_file_size_multiplier(
2602 rocksdb_options_t* opt, int n) {
2603 opt->rep.target_file_size_multiplier = n;
2604}
2605
20effc67
TL
2606int rocksdb_options_get_target_file_size_multiplier(rocksdb_options_t* opt) {
2607 return opt->rep.target_file_size_multiplier;
2608}
2609
7c673cae
FG
2610void rocksdb_options_set_max_bytes_for_level_base(
2611 rocksdb_options_t* opt, uint64_t n) {
2612 opt->rep.max_bytes_for_level_base = n;
2613}
2614
20effc67
TL
2615uint64_t rocksdb_options_get_max_bytes_for_level_base(rocksdb_options_t* opt) {
2616 return opt->rep.max_bytes_for_level_base;
2617}
2618
7c673cae
FG
2619void rocksdb_options_set_level_compaction_dynamic_level_bytes(
2620 rocksdb_options_t* opt, unsigned char v) {
2621 opt->rep.level_compaction_dynamic_level_bytes = v;
2622}
2623
20effc67
TL
2624unsigned char rocksdb_options_get_level_compaction_dynamic_level_bytes(
2625 rocksdb_options_t* opt) {
2626 return opt->rep.level_compaction_dynamic_level_bytes;
2627}
2628
7c673cae
FG
2629void rocksdb_options_set_max_bytes_for_level_multiplier(rocksdb_options_t* opt,
2630 double n) {
2631 opt->rep.max_bytes_for_level_multiplier = n;
2632}
2633
20effc67
TL
2634double rocksdb_options_get_max_bytes_for_level_multiplier(
2635 rocksdb_options_t* opt) {
2636 return opt->rep.max_bytes_for_level_multiplier;
2637}
2638
7c673cae
FG
2639void rocksdb_options_set_max_compaction_bytes(rocksdb_options_t* opt,
2640 uint64_t n) {
2641 opt->rep.max_compaction_bytes = n;
2642}
2643
20effc67
TL
2644uint64_t rocksdb_options_get_max_compaction_bytes(rocksdb_options_t* opt) {
2645 return opt->rep.max_compaction_bytes;
2646}
2647
7c673cae
FG
2648void rocksdb_options_set_max_bytes_for_level_multiplier_additional(
2649 rocksdb_options_t* opt, int* level_values, size_t num_levels) {
2650 opt->rep.max_bytes_for_level_multiplier_additional.resize(num_levels);
2651 for (size_t i = 0; i < num_levels; ++i) {
2652 opt->rep.max_bytes_for_level_multiplier_additional[i] = level_values[i];
2653 }
2654}
2655
2656void rocksdb_options_enable_statistics(rocksdb_options_t* opt) {
f67539c2 2657 opt->rep.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
7c673cae
FG
2658}
2659
11fdf7f2
TL
2660void rocksdb_options_set_skip_stats_update_on_db_open(rocksdb_options_t* opt,
2661 unsigned char val) {
2662 opt->rep.skip_stats_update_on_db_open = val;
2663}
2664
20effc67
TL
2665unsigned char rocksdb_options_get_skip_stats_update_on_db_open(
2666 rocksdb_options_t* opt) {
2667 return opt->rep.skip_stats_update_on_db_open;
2668}
2669
f67539c2
TL
2670void rocksdb_options_set_skip_checking_sst_file_sizes_on_db_open(
2671 rocksdb_options_t* opt, unsigned char val) {
2672 opt->rep.skip_checking_sst_file_sizes_on_db_open = val;
2673}
2674
20effc67
TL
2675unsigned char rocksdb_options_get_skip_checking_sst_file_sizes_on_db_open(
2676 rocksdb_options_t* opt) {
2677 return opt->rep.skip_checking_sst_file_sizes_on_db_open;
2678}
2679
7c673cae
FG
2680void rocksdb_options_set_num_levels(rocksdb_options_t* opt, int n) {
2681 opt->rep.num_levels = n;
2682}
2683
20effc67
TL
2684int rocksdb_options_get_num_levels(rocksdb_options_t* opt) {
2685 return opt->rep.num_levels;
2686}
2687
7c673cae
FG
2688void rocksdb_options_set_level0_file_num_compaction_trigger(
2689 rocksdb_options_t* opt, int n) {
2690 opt->rep.level0_file_num_compaction_trigger = n;
2691}
2692
20effc67
TL
2693int rocksdb_options_get_level0_file_num_compaction_trigger(
2694 rocksdb_options_t* opt) {
2695 return opt->rep.level0_file_num_compaction_trigger;
2696}
2697
7c673cae
FG
2698void rocksdb_options_set_level0_slowdown_writes_trigger(
2699 rocksdb_options_t* opt, int n) {
2700 opt->rep.level0_slowdown_writes_trigger = n;
2701}
2702
20effc67
TL
2703int rocksdb_options_get_level0_slowdown_writes_trigger(rocksdb_options_t* opt) {
2704 return opt->rep.level0_slowdown_writes_trigger;
2705}
2706
7c673cae
FG
2707void rocksdb_options_set_level0_stop_writes_trigger(
2708 rocksdb_options_t* opt, int n) {
2709 opt->rep.level0_stop_writes_trigger = n;
2710}
2711
20effc67
TL
2712int rocksdb_options_get_level0_stop_writes_trigger(rocksdb_options_t* opt) {
2713 return opt->rep.level0_stop_writes_trigger;
2714}
2715
11fdf7f2
TL
2716void rocksdb_options_set_max_mem_compaction_level(rocksdb_options_t* /*opt*/,
2717 int /*n*/) {}
7c673cae
FG
2718
2719void rocksdb_options_set_wal_recovery_mode(rocksdb_options_t* opt,int mode) {
2720 opt->rep.wal_recovery_mode = static_cast<WALRecoveryMode>(mode);
2721}
2722
20effc67
TL
2723int rocksdb_options_get_wal_recovery_mode(rocksdb_options_t* opt) {
2724 return static_cast<int>(opt->rep.wal_recovery_mode);
2725}
2726
7c673cae
FG
2727void rocksdb_options_set_compression(rocksdb_options_t* opt, int t) {
2728 opt->rep.compression = static_cast<CompressionType>(t);
2729}
2730
20effc67
TL
2731int rocksdb_options_get_compression(rocksdb_options_t* opt) {
2732 return opt->rep.compression;
2733}
2734
2735void rocksdb_options_set_bottommost_compression(rocksdb_options_t* opt, int t) {
2736 opt->rep.bottommost_compression = static_cast<CompressionType>(t);
2737}
2738
2739int rocksdb_options_get_bottommost_compression(rocksdb_options_t* opt) {
2740 return opt->rep.bottommost_compression;
2741}
2742
7c673cae
FG
2743void rocksdb_options_set_compression_per_level(rocksdb_options_t* opt,
2744 int* level_values,
2745 size_t num_levels) {
2746 opt->rep.compression_per_level.resize(num_levels);
2747 for (size_t i = 0; i < num_levels; ++i) {
2748 opt->rep.compression_per_level[i] =
2749 static_cast<CompressionType>(level_values[i]);
2750 }
2751}
2752
11fdf7f2
TL
2753void rocksdb_options_set_bottommost_compression_options(rocksdb_options_t* opt,
2754 int w_bits, int level,
2755 int strategy,
2756 int max_dict_bytes,
20effc67 2757 unsigned char enabled) {
11fdf7f2
TL
2758 opt->rep.bottommost_compression_opts.window_bits = w_bits;
2759 opt->rep.bottommost_compression_opts.level = level;
2760 opt->rep.bottommost_compression_opts.strategy = strategy;
2761 opt->rep.bottommost_compression_opts.max_dict_bytes = max_dict_bytes;
2762 opt->rep.bottommost_compression_opts.enabled = enabled;
2763}
2764
20effc67
TL
2765void rocksdb_options_set_bottommost_compression_options_zstd_max_train_bytes(
2766 rocksdb_options_t* opt, int zstd_max_train_bytes, unsigned char enabled) {
2767 opt->rep.bottommost_compression_opts.zstd_max_train_bytes =
2768 zstd_max_train_bytes;
2769 opt->rep.bottommost_compression_opts.enabled = enabled;
2770}
2771
7c673cae
FG
2772void rocksdb_options_set_compression_options(rocksdb_options_t* opt, int w_bits,
2773 int level, int strategy,
2774 int max_dict_bytes) {
2775 opt->rep.compression_opts.window_bits = w_bits;
2776 opt->rep.compression_opts.level = level;
2777 opt->rep.compression_opts.strategy = strategy;
2778 opt->rep.compression_opts.max_dict_bytes = max_dict_bytes;
2779}
2780
20effc67
TL
2781void rocksdb_options_set_compression_options_zstd_max_train_bytes(
2782 rocksdb_options_t* opt, int zstd_max_train_bytes) {
2783 opt->rep.compression_opts.zstd_max_train_bytes = zstd_max_train_bytes;
2784}
2785
7c673cae
FG
2786void rocksdb_options_set_prefix_extractor(
2787 rocksdb_options_t* opt, rocksdb_slicetransform_t* prefix_extractor) {
2788 opt->rep.prefix_extractor.reset(prefix_extractor);
2789}
2790
2791void rocksdb_options_set_use_fsync(
2792 rocksdb_options_t* opt, int use_fsync) {
2793 opt->rep.use_fsync = use_fsync;
2794}
2795
20effc67
TL
2796int rocksdb_options_get_use_fsync(rocksdb_options_t* opt) {
2797 return opt->rep.use_fsync;
2798}
2799
7c673cae
FG
2800void rocksdb_options_set_db_log_dir(
2801 rocksdb_options_t* opt, const char* db_log_dir) {
2802 opt->rep.db_log_dir = db_log_dir;
2803}
2804
2805void rocksdb_options_set_wal_dir(
2806 rocksdb_options_t* opt, const char* v) {
2807 opt->rep.wal_dir = v;
2808}
2809
2810void rocksdb_options_set_WAL_ttl_seconds(rocksdb_options_t* opt, uint64_t ttl) {
2811 opt->rep.WAL_ttl_seconds = ttl;
2812}
2813
20effc67
TL
2814uint64_t rocksdb_options_get_WAL_ttl_seconds(rocksdb_options_t* opt) {
2815 return opt->rep.WAL_ttl_seconds;
2816}
2817
7c673cae
FG
2818void rocksdb_options_set_WAL_size_limit_MB(
2819 rocksdb_options_t* opt, uint64_t limit) {
2820 opt->rep.WAL_size_limit_MB = limit;
2821}
2822
20effc67
TL
2823uint64_t rocksdb_options_get_WAL_size_limit_MB(rocksdb_options_t* opt) {
2824 return opt->rep.WAL_size_limit_MB;
2825}
2826
7c673cae
FG
2827void rocksdb_options_set_manifest_preallocation_size(
2828 rocksdb_options_t* opt, size_t v) {
2829 opt->rep.manifest_preallocation_size = v;
2830}
2831
20effc67
TL
2832size_t rocksdb_options_get_manifest_preallocation_size(rocksdb_options_t* opt) {
2833 return opt->rep.manifest_preallocation_size;
2834}
2835
7c673cae 2836// noop
11fdf7f2
TL
2837void rocksdb_options_set_purge_redundant_kvs_while_flush(
2838 rocksdb_options_t* /*opt*/, unsigned char /*v*/) {}
7c673cae
FG
2839
2840void rocksdb_options_set_use_direct_reads(rocksdb_options_t* opt,
2841 unsigned char v) {
2842 opt->rep.use_direct_reads = v;
2843}
2844
20effc67
TL
2845unsigned char rocksdb_options_get_use_direct_reads(rocksdb_options_t* opt) {
2846 return opt->rep.use_direct_reads;
2847}
2848
7c673cae
FG
2849void rocksdb_options_set_use_direct_io_for_flush_and_compaction(
2850 rocksdb_options_t* opt, unsigned char v) {
2851 opt->rep.use_direct_io_for_flush_and_compaction = v;
2852}
2853
20effc67
TL
2854unsigned char rocksdb_options_get_use_direct_io_for_flush_and_compaction(
2855 rocksdb_options_t* opt) {
2856 return opt->rep.use_direct_io_for_flush_and_compaction;
2857}
2858
7c673cae
FG
2859void rocksdb_options_set_allow_mmap_reads(
2860 rocksdb_options_t* opt, unsigned char v) {
2861 opt->rep.allow_mmap_reads = v;
2862}
2863
20effc67
TL
2864unsigned char rocksdb_options_get_allow_mmap_reads(rocksdb_options_t* opt) {
2865 return opt->rep.allow_mmap_reads;
2866}
2867
7c673cae
FG
2868void rocksdb_options_set_allow_mmap_writes(
2869 rocksdb_options_t* opt, unsigned char v) {
2870 opt->rep.allow_mmap_writes = v;
2871}
2872
20effc67
TL
2873unsigned char rocksdb_options_get_allow_mmap_writes(rocksdb_options_t* opt) {
2874 return opt->rep.allow_mmap_writes;
2875}
2876
7c673cae
FG
2877void rocksdb_options_set_is_fd_close_on_exec(
2878 rocksdb_options_t* opt, unsigned char v) {
2879 opt->rep.is_fd_close_on_exec = v;
2880}
2881
20effc67
TL
2882unsigned char rocksdb_options_get_is_fd_close_on_exec(rocksdb_options_t* opt) {
2883 return opt->rep.is_fd_close_on_exec;
2884}
2885
7c673cae
FG
2886void rocksdb_options_set_skip_log_error_on_recovery(
2887 rocksdb_options_t* opt, unsigned char v) {
2888 opt->rep.skip_log_error_on_recovery = v;
2889}
2890
20effc67
TL
2891unsigned char rocksdb_options_get_skip_log_error_on_recovery(
2892 rocksdb_options_t* opt) {
2893 return opt->rep.skip_log_error_on_recovery;
2894}
2895
7c673cae
FG
2896void rocksdb_options_set_stats_dump_period_sec(
2897 rocksdb_options_t* opt, unsigned int v) {
2898 opt->rep.stats_dump_period_sec = v;
2899}
2900
20effc67
TL
2901unsigned int rocksdb_options_get_stats_dump_period_sec(rocksdb_options_t* opt) {
2902 return opt->rep.stats_dump_period_sec;
2903}
2904
2905void rocksdb_options_set_stats_persist_period_sec(rocksdb_options_t* opt,
2906 unsigned int v) {
2907 opt->rep.stats_persist_period_sec = v;
2908}
2909
2910unsigned int rocksdb_options_get_stats_persist_period_sec(
2911 rocksdb_options_t* opt) {
2912 return opt->rep.stats_persist_period_sec;
2913}
2914
7c673cae
FG
2915void rocksdb_options_set_advise_random_on_open(
2916 rocksdb_options_t* opt, unsigned char v) {
2917 opt->rep.advise_random_on_open = v;
2918}
2919
20effc67
TL
2920unsigned char rocksdb_options_get_advise_random_on_open(
2921 rocksdb_options_t* opt) {
2922 return opt->rep.advise_random_on_open;
2923}
2924
7c673cae
FG
2925void rocksdb_options_set_access_hint_on_compaction_start(
2926 rocksdb_options_t* opt, int v) {
2927 switch(v) {
2928 case 0:
f67539c2
TL
2929 opt->rep.access_hint_on_compaction_start =
2930 ROCKSDB_NAMESPACE::Options::NONE;
7c673cae
FG
2931 break;
2932 case 1:
f67539c2
TL
2933 opt->rep.access_hint_on_compaction_start =
2934 ROCKSDB_NAMESPACE::Options::NORMAL;
7c673cae
FG
2935 break;
2936 case 2:
f67539c2
TL
2937 opt->rep.access_hint_on_compaction_start =
2938 ROCKSDB_NAMESPACE::Options::SEQUENTIAL;
7c673cae
FG
2939 break;
2940 case 3:
f67539c2
TL
2941 opt->rep.access_hint_on_compaction_start =
2942 ROCKSDB_NAMESPACE::Options::WILLNEED;
7c673cae
FG
2943 break;
2944 }
2945}
2946
20effc67
TL
2947int rocksdb_options_get_access_hint_on_compaction_start(
2948 rocksdb_options_t* opt) {
2949 return opt->rep.access_hint_on_compaction_start;
2950}
2951
7c673cae
FG
2952void rocksdb_options_set_use_adaptive_mutex(
2953 rocksdb_options_t* opt, unsigned char v) {
2954 opt->rep.use_adaptive_mutex = v;
2955}
2956
20effc67
TL
2957unsigned char rocksdb_options_get_use_adaptive_mutex(rocksdb_options_t* opt) {
2958 return opt->rep.use_adaptive_mutex;
2959}
2960
11fdf7f2
TL
2961void rocksdb_options_set_wal_bytes_per_sync(
2962 rocksdb_options_t* opt, uint64_t v) {
2963 opt->rep.wal_bytes_per_sync = v;
2964}
2965
20effc67
TL
2966uint64_t rocksdb_options_get_wal_bytes_per_sync(rocksdb_options_t* opt) {
2967 return opt->rep.wal_bytes_per_sync;
2968}
2969
7c673cae
FG
2970void rocksdb_options_set_bytes_per_sync(
2971 rocksdb_options_t* opt, uint64_t v) {
2972 opt->rep.bytes_per_sync = v;
2973}
2974
20effc67
TL
2975uint64_t rocksdb_options_get_bytes_per_sync(rocksdb_options_t* opt) {
2976 return opt->rep.bytes_per_sync;
2977}
2978
11fdf7f2
TL
2979void rocksdb_options_set_writable_file_max_buffer_size(rocksdb_options_t* opt,
2980 uint64_t v) {
2981 opt->rep.writable_file_max_buffer_size = static_cast<size_t>(v);
2982}
2983
20effc67
TL
2984uint64_t rocksdb_options_get_writable_file_max_buffer_size(
2985 rocksdb_options_t* opt) {
2986 return opt->rep.writable_file_max_buffer_size;
2987}
2988
7c673cae
FG
2989void rocksdb_options_set_allow_concurrent_memtable_write(rocksdb_options_t* opt,
2990 unsigned char v) {
2991 opt->rep.allow_concurrent_memtable_write = v;
2992}
2993
20effc67
TL
2994unsigned char rocksdb_options_get_allow_concurrent_memtable_write(
2995 rocksdb_options_t* opt) {
2996 return opt->rep.allow_concurrent_memtable_write;
2997}
2998
7c673cae
FG
2999void rocksdb_options_set_enable_write_thread_adaptive_yield(
3000 rocksdb_options_t* opt, unsigned char v) {
3001 opt->rep.enable_write_thread_adaptive_yield = v;
3002}
3003
20effc67
TL
3004unsigned char rocksdb_options_get_enable_write_thread_adaptive_yield(
3005 rocksdb_options_t* opt) {
3006 return opt->rep.enable_write_thread_adaptive_yield;
3007}
3008
7c673cae
FG
3009void rocksdb_options_set_max_sequential_skip_in_iterations(
3010 rocksdb_options_t* opt, uint64_t v) {
3011 opt->rep.max_sequential_skip_in_iterations = v;
3012}
3013
20effc67
TL
3014uint64_t rocksdb_options_get_max_sequential_skip_in_iterations(
3015 rocksdb_options_t* opt) {
3016 return opt->rep.max_sequential_skip_in_iterations;
3017}
3018
7c673cae
FG
3019void rocksdb_options_set_max_write_buffer_number(rocksdb_options_t* opt, int n) {
3020 opt->rep.max_write_buffer_number = n;
3021}
3022
20effc67
TL
3023int rocksdb_options_get_max_write_buffer_number(rocksdb_options_t* opt) {
3024 return opt->rep.max_write_buffer_number;
3025}
3026
7c673cae
FG
3027void rocksdb_options_set_min_write_buffer_number_to_merge(rocksdb_options_t* opt, int n) {
3028 opt->rep.min_write_buffer_number_to_merge = n;
3029}
3030
20effc67
TL
3031int rocksdb_options_get_min_write_buffer_number_to_merge(
3032 rocksdb_options_t* opt) {
3033 return opt->rep.min_write_buffer_number_to_merge;
3034}
3035
7c673cae
FG
3036void rocksdb_options_set_max_write_buffer_number_to_maintain(
3037 rocksdb_options_t* opt, int n) {
3038 opt->rep.max_write_buffer_number_to_maintain = n;
3039}
3040
20effc67
TL
3041int rocksdb_options_get_max_write_buffer_number_to_maintain(
3042 rocksdb_options_t* opt) {
3043 return opt->rep.max_write_buffer_number_to_maintain;
3044}
3045
f67539c2
TL
3046void rocksdb_options_set_max_write_buffer_size_to_maintain(
3047 rocksdb_options_t* opt, int64_t n) {
3048 opt->rep.max_write_buffer_size_to_maintain = n;
3049}
3050
20effc67
TL
3051int64_t rocksdb_options_get_max_write_buffer_size_to_maintain(
3052 rocksdb_options_t* opt) {
3053 return opt->rep.max_write_buffer_size_to_maintain;
3054}
3055
11fdf7f2
TL
3056void rocksdb_options_set_enable_pipelined_write(rocksdb_options_t* opt,
3057 unsigned char v) {
3058 opt->rep.enable_pipelined_write = v;
3059}
3060
20effc67
TL
3061unsigned char rocksdb_options_get_enable_pipelined_write(
3062 rocksdb_options_t* opt) {
3063 return opt->rep.enable_pipelined_write;
3064}
3065
f67539c2
TL
3066void rocksdb_options_set_unordered_write(rocksdb_options_t* opt,
3067 unsigned char v) {
3068 opt->rep.unordered_write = v;
3069}
3070
20effc67
TL
3071unsigned char rocksdb_options_get_unordered_write(rocksdb_options_t* opt) {
3072 return opt->rep.unordered_write;
3073}
3074
11fdf7f2
TL
3075void rocksdb_options_set_max_subcompactions(rocksdb_options_t* opt,
3076 uint32_t n) {
3077 opt->rep.max_subcompactions = n;
3078}
3079
20effc67
TL
3080uint32_t rocksdb_options_get_max_subcompactions(rocksdb_options_t* opt) {
3081 return opt->rep.max_subcompactions;
3082}
3083
11fdf7f2
TL
3084void rocksdb_options_set_max_background_jobs(rocksdb_options_t* opt, int n) {
3085 opt->rep.max_background_jobs = n;
3086}
3087
20effc67
TL
3088int rocksdb_options_get_max_background_jobs(rocksdb_options_t* opt) {
3089 return opt->rep.max_background_jobs;
3090}
3091
7c673cae
FG
3092void rocksdb_options_set_max_background_compactions(rocksdb_options_t* opt, int n) {
3093 opt->rep.max_background_compactions = n;
3094}
3095
20effc67
TL
3096int rocksdb_options_get_max_background_compactions(rocksdb_options_t* opt) {
3097 return opt->rep.max_background_compactions;
3098}
3099
7c673cae
FG
3100void rocksdb_options_set_base_background_compactions(rocksdb_options_t* opt,
3101 int n) {
3102 opt->rep.base_background_compactions = n;
3103}
3104
20effc67
TL
3105int rocksdb_options_get_base_background_compactions(rocksdb_options_t* opt) {
3106 return opt->rep.base_background_compactions;
3107}
3108
7c673cae
FG
3109void rocksdb_options_set_max_background_flushes(rocksdb_options_t* opt, int n) {
3110 opt->rep.max_background_flushes = n;
3111}
3112
20effc67
TL
3113int rocksdb_options_get_max_background_flushes(rocksdb_options_t* opt) {
3114 return opt->rep.max_background_flushes;
3115}
3116
7c673cae
FG
3117void rocksdb_options_set_max_log_file_size(rocksdb_options_t* opt, size_t v) {
3118 opt->rep.max_log_file_size = v;
3119}
3120
20effc67
TL
3121size_t rocksdb_options_get_max_log_file_size(rocksdb_options_t* opt) {
3122 return opt->rep.max_log_file_size;
3123}
3124
7c673cae
FG
3125void rocksdb_options_set_log_file_time_to_roll(rocksdb_options_t* opt, size_t v) {
3126 opt->rep.log_file_time_to_roll = v;
3127}
3128
20effc67
TL
3129size_t rocksdb_options_get_log_file_time_to_roll(rocksdb_options_t* opt) {
3130 return opt->rep.log_file_time_to_roll;
3131}
3132
7c673cae
FG
3133void rocksdb_options_set_keep_log_file_num(rocksdb_options_t* opt, size_t v) {
3134 opt->rep.keep_log_file_num = v;
3135}
3136
20effc67
TL
3137size_t rocksdb_options_get_keep_log_file_num(rocksdb_options_t* opt) {
3138 return opt->rep.keep_log_file_num;
3139}
3140
7c673cae
FG
3141void rocksdb_options_set_recycle_log_file_num(rocksdb_options_t* opt,
3142 size_t v) {
3143 opt->rep.recycle_log_file_num = v;
3144}
3145
20effc67
TL
3146size_t rocksdb_options_get_recycle_log_file_num(rocksdb_options_t* opt) {
3147 return opt->rep.recycle_log_file_num;
3148}
3149
7c673cae
FG
3150void rocksdb_options_set_soft_rate_limit(rocksdb_options_t* opt, double v) {
3151 opt->rep.soft_rate_limit = v;
3152}
3153
20effc67
TL
3154double rocksdb_options_get_soft_rate_limit(rocksdb_options_t* opt) {
3155 return opt->rep.soft_rate_limit;
3156}
3157
7c673cae
FG
3158void rocksdb_options_set_hard_rate_limit(rocksdb_options_t* opt, double v) {
3159 opt->rep.hard_rate_limit = v;
3160}
3161
20effc67
TL
3162double rocksdb_options_get_hard_rate_limit(rocksdb_options_t* opt) {
3163 return opt->rep.hard_rate_limit;
3164}
3165
7c673cae
FG
3166void rocksdb_options_set_soft_pending_compaction_bytes_limit(rocksdb_options_t* opt, size_t v) {
3167 opt->rep.soft_pending_compaction_bytes_limit = v;
3168}
3169
20effc67
TL
3170size_t rocksdb_options_get_soft_pending_compaction_bytes_limit(
3171 rocksdb_options_t* opt) {
3172 return opt->rep.soft_pending_compaction_bytes_limit;
3173}
3174
7c673cae
FG
3175void rocksdb_options_set_hard_pending_compaction_bytes_limit(rocksdb_options_t* opt, size_t v) {
3176 opt->rep.hard_pending_compaction_bytes_limit = v;
3177}
3178
20effc67
TL
3179size_t rocksdb_options_get_hard_pending_compaction_bytes_limit(
3180 rocksdb_options_t* opt) {
3181 return opt->rep.hard_pending_compaction_bytes_limit;
3182}
3183
7c673cae
FG
3184void rocksdb_options_set_rate_limit_delay_max_milliseconds(
3185 rocksdb_options_t* opt, unsigned int v) {
3186 opt->rep.rate_limit_delay_max_milliseconds = v;
3187}
3188
20effc67
TL
3189unsigned int rocksdb_options_get_rate_limit_delay_max_milliseconds(
3190 rocksdb_options_t* opt) {
3191 return opt->rep.rate_limit_delay_max_milliseconds;
3192}
3193
7c673cae
FG
3194void rocksdb_options_set_max_manifest_file_size(
3195 rocksdb_options_t* opt, size_t v) {
3196 opt->rep.max_manifest_file_size = v;
3197}
3198
20effc67
TL
3199size_t rocksdb_options_get_max_manifest_file_size(rocksdb_options_t* opt) {
3200 return opt->rep.max_manifest_file_size;
3201}
3202
7c673cae
FG
3203void rocksdb_options_set_table_cache_numshardbits(
3204 rocksdb_options_t* opt, int v) {
3205 opt->rep.table_cache_numshardbits = v;
3206}
3207
20effc67
TL
3208int rocksdb_options_get_table_cache_numshardbits(rocksdb_options_t* opt) {
3209 return opt->rep.table_cache_numshardbits;
3210}
3211
7c673cae 3212void rocksdb_options_set_table_cache_remove_scan_count_limit(
11fdf7f2 3213 rocksdb_options_t* /*opt*/, int /*v*/) {
7c673cae
FG
3214 // this option is deprecated
3215}
3216
3217void rocksdb_options_set_arena_block_size(
3218 rocksdb_options_t* opt, size_t v) {
3219 opt->rep.arena_block_size = v;
3220}
3221
20effc67
TL
3222size_t rocksdb_options_get_arena_block_size(rocksdb_options_t* opt) {
3223 return opt->rep.arena_block_size;
3224}
3225
7c673cae
FG
3226void rocksdb_options_set_disable_auto_compactions(rocksdb_options_t* opt, int disable) {
3227 opt->rep.disable_auto_compactions = disable;
3228}
3229
20effc67
TL
3230unsigned char rocksdb_options_get_disable_auto_compactions(
3231 rocksdb_options_t* opt) {
3232 return opt->rep.disable_auto_compactions;
3233}
3234
7c673cae
FG
3235void rocksdb_options_set_optimize_filters_for_hits(rocksdb_options_t* opt, int v) {
3236 opt->rep.optimize_filters_for_hits = v;
3237}
3238
20effc67
TL
3239unsigned char rocksdb_options_get_optimize_filters_for_hits(
3240 rocksdb_options_t* opt) {
3241 return opt->rep.optimize_filters_for_hits;
3242}
3243
7c673cae
FG
3244void rocksdb_options_set_delete_obsolete_files_period_micros(
3245 rocksdb_options_t* opt, uint64_t v) {
3246 opt->rep.delete_obsolete_files_period_micros = v;
3247}
3248
20effc67
TL
3249uint64_t rocksdb_options_get_delete_obsolete_files_period_micros(
3250 rocksdb_options_t* opt) {
3251 return opt->rep.delete_obsolete_files_period_micros;
3252}
3253
7c673cae
FG
3254void rocksdb_options_prepare_for_bulk_load(rocksdb_options_t* opt) {
3255 opt->rep.PrepareForBulkLoad();
3256}
3257
3258void rocksdb_options_set_memtable_vector_rep(rocksdb_options_t *opt) {
f67539c2 3259 opt->rep.memtable_factory.reset(new ROCKSDB_NAMESPACE::VectorRepFactory);
7c673cae
FG
3260}
3261
3262void rocksdb_options_set_memtable_prefix_bloom_size_ratio(
3263 rocksdb_options_t* opt, double v) {
3264 opt->rep.memtable_prefix_bloom_size_ratio = v;
3265}
3266
20effc67
TL
3267double rocksdb_options_get_memtable_prefix_bloom_size_ratio(
3268 rocksdb_options_t* opt) {
3269 return opt->rep.memtable_prefix_bloom_size_ratio;
3270}
3271
7c673cae
FG
3272void rocksdb_options_set_memtable_huge_page_size(rocksdb_options_t* opt,
3273 size_t v) {
3274 opt->rep.memtable_huge_page_size = v;
3275}
3276
20effc67
TL
3277size_t rocksdb_options_get_memtable_huge_page_size(rocksdb_options_t* opt) {
3278 return opt->rep.memtable_huge_page_size;
3279}
3280
7c673cae
FG
3281void rocksdb_options_set_hash_skip_list_rep(
3282 rocksdb_options_t *opt, size_t bucket_count,
3283 int32_t skiplist_height, int32_t skiplist_branching_factor) {
f67539c2
TL
3284 ROCKSDB_NAMESPACE::MemTableRepFactory* factory =
3285 ROCKSDB_NAMESPACE::NewHashSkipListRepFactory(
3286 bucket_count, skiplist_height, skiplist_branching_factor);
7c673cae
FG
3287 opt->rep.memtable_factory.reset(factory);
3288}
3289
3290void rocksdb_options_set_hash_link_list_rep(
3291 rocksdb_options_t *opt, size_t bucket_count) {
f67539c2
TL
3292 opt->rep.memtable_factory.reset(
3293 ROCKSDB_NAMESPACE::NewHashLinkListRepFactory(bucket_count));
7c673cae
FG
3294}
3295
3296void rocksdb_options_set_plain_table_factory(
3297 rocksdb_options_t *opt, uint32_t user_key_len, int bloom_bits_per_key,
3298 double hash_table_ratio, size_t index_sparseness) {
f67539c2 3299 ROCKSDB_NAMESPACE::PlainTableOptions options;
7c673cae
FG
3300 options.user_key_len = user_key_len;
3301 options.bloom_bits_per_key = bloom_bits_per_key;
3302 options.hash_table_ratio = hash_table_ratio;
3303 options.index_sparseness = index_sparseness;
3304
f67539c2
TL
3305 ROCKSDB_NAMESPACE::TableFactory* factory =
3306 ROCKSDB_NAMESPACE::NewPlainTableFactory(options);
7c673cae
FG
3307 opt->rep.table_factory.reset(factory);
3308}
3309
3310void rocksdb_options_set_max_successive_merges(
3311 rocksdb_options_t* opt, size_t v) {
3312 opt->rep.max_successive_merges = v;
3313}
3314
20effc67
TL
3315size_t rocksdb_options_get_max_successive_merges(rocksdb_options_t* opt) {
3316 return opt->rep.max_successive_merges;
3317}
3318
7c673cae
FG
3319void rocksdb_options_set_bloom_locality(
3320 rocksdb_options_t* opt, uint32_t v) {
3321 opt->rep.bloom_locality = v;
3322}
3323
20effc67
TL
3324uint32_t rocksdb_options_get_bloom_locality(rocksdb_options_t* opt) {
3325 return opt->rep.bloom_locality;
3326}
3327
7c673cae
FG
3328void rocksdb_options_set_inplace_update_support(
3329 rocksdb_options_t* opt, unsigned char v) {
3330 opt->rep.inplace_update_support = v;
3331}
3332
20effc67
TL
3333unsigned char rocksdb_options_get_inplace_update_support(
3334 rocksdb_options_t* opt) {
3335 return opt->rep.inplace_update_support;
3336}
3337
7c673cae
FG
3338void rocksdb_options_set_inplace_update_num_locks(
3339 rocksdb_options_t* opt, size_t v) {
3340 opt->rep.inplace_update_num_locks = v;
3341}
3342
20effc67
TL
3343size_t rocksdb_options_get_inplace_update_num_locks(rocksdb_options_t* opt) {
3344 return opt->rep.inplace_update_num_locks;
3345}
3346
7c673cae
FG
3347void rocksdb_options_set_report_bg_io_stats(
3348 rocksdb_options_t* opt, int v) {
3349 opt->rep.report_bg_io_stats = v;
3350}
3351
20effc67
TL
3352unsigned char rocksdb_options_get_report_bg_io_stats(rocksdb_options_t* opt) {
3353 return opt->rep.report_bg_io_stats;
3354}
3355
7c673cae 3356void rocksdb_options_set_compaction_style(rocksdb_options_t *opt, int style) {
f67539c2
TL
3357 opt->rep.compaction_style =
3358 static_cast<ROCKSDB_NAMESPACE::CompactionStyle>(style);
7c673cae
FG
3359}
3360
20effc67
TL
3361int rocksdb_options_get_compaction_style(rocksdb_options_t* opt) {
3362 return opt->rep.compaction_style;
3363}
3364
7c673cae
FG
3365void rocksdb_options_set_universal_compaction_options(rocksdb_options_t *opt, rocksdb_universal_compaction_options_t *uco) {
3366 opt->rep.compaction_options_universal = *(uco->rep);
3367}
3368
3369void rocksdb_options_set_fifo_compaction_options(
3370 rocksdb_options_t* opt,
3371 rocksdb_fifo_compaction_options_t* fifo) {
3372 opt->rep.compaction_options_fifo = fifo->rep;
3373}
3374
3375char *rocksdb_options_statistics_get_string(rocksdb_options_t *opt) {
f67539c2 3376 ROCKSDB_NAMESPACE::Statistics* statistics = opt->rep.statistics.get();
7c673cae
FG
3377 if (statistics) {
3378 return strdup(statistics->ToString().c_str());
3379 }
3380 return nullptr;
3381}
3382
3383void rocksdb_options_set_ratelimiter(rocksdb_options_t *opt, rocksdb_ratelimiter_t *limiter) {
11fdf7f2
TL
3384 if (limiter) {
3385 opt->rep.rate_limiter = limiter->rep;
3386 }
7c673cae
FG
3387}
3388
f67539c2
TL
3389void rocksdb_options_set_atomic_flush(rocksdb_options_t* opt,
3390 unsigned char atomic_flush) {
3391 opt->rep.atomic_flush = atomic_flush;
3392}
3393
20effc67
TL
3394unsigned char rocksdb_options_get_atomic_flush(rocksdb_options_t* opt) {
3395 return opt->rep.atomic_flush;
3396}
3397
7c673cae
FG
3398rocksdb_ratelimiter_t* rocksdb_ratelimiter_create(
3399 int64_t rate_bytes_per_sec,
3400 int64_t refill_period_us,
3401 int32_t fairness) {
3402 rocksdb_ratelimiter_t* rate_limiter = new rocksdb_ratelimiter_t;
11fdf7f2
TL
3403 rate_limiter->rep.reset(
3404 NewGenericRateLimiter(rate_bytes_per_sec,
3405 refill_period_us, fairness));
7c673cae
FG
3406 return rate_limiter;
3407}
3408
3409void rocksdb_ratelimiter_destroy(rocksdb_ratelimiter_t *limiter) {
7c673cae
FG
3410 delete limiter;
3411}
3412
f67539c2
TL
3413void rocksdb_options_set_row_cache(rocksdb_options_t* opt, rocksdb_cache_t* cache) {
3414 if(cache) {
3415 opt->rep.row_cache = cache->rep;
3416 }
3417}
3418
11fdf7f2
TL
3419void rocksdb_set_perf_level(int v) {
3420 PerfLevel level = static_cast<PerfLevel>(v);
3421 SetPerfLevel(level);
3422}
3423
3424rocksdb_perfcontext_t* rocksdb_perfcontext_create() {
3425 rocksdb_perfcontext_t* context = new rocksdb_perfcontext_t;
f67539c2 3426 context->rep = ROCKSDB_NAMESPACE::get_perf_context();
11fdf7f2
TL
3427 return context;
3428}
3429
3430void rocksdb_perfcontext_reset(rocksdb_perfcontext_t* context) {
3431 context->rep->Reset();
3432}
3433
3434char* rocksdb_perfcontext_report(rocksdb_perfcontext_t* context,
3435 unsigned char exclude_zero_counters) {
3436 return strdup(context->rep->ToString(exclude_zero_counters).c_str());
3437}
3438
3439uint64_t rocksdb_perfcontext_metric(rocksdb_perfcontext_t* context,
3440 int metric) {
3441 PerfContext* rep = context->rep;
3442 switch (metric) {
3443 case rocksdb_user_key_comparison_count:
3444 return rep->user_key_comparison_count;
3445 case rocksdb_block_cache_hit_count:
3446 return rep->block_cache_hit_count;
3447 case rocksdb_block_read_count:
3448 return rep->block_read_count;
3449 case rocksdb_block_read_byte:
3450 return rep->block_read_byte;
3451 case rocksdb_block_read_time:
3452 return rep->block_read_time;
3453 case rocksdb_block_checksum_time:
3454 return rep->block_checksum_time;
3455 case rocksdb_block_decompress_time:
3456 return rep->block_decompress_time;
3457 case rocksdb_get_read_bytes:
3458 return rep->get_read_bytes;
3459 case rocksdb_multiget_read_bytes:
3460 return rep->multiget_read_bytes;
3461 case rocksdb_iter_read_bytes:
3462 return rep->iter_read_bytes;
3463 case rocksdb_internal_key_skipped_count:
3464 return rep->internal_key_skipped_count;
3465 case rocksdb_internal_delete_skipped_count:
3466 return rep->internal_delete_skipped_count;
3467 case rocksdb_internal_recent_skipped_count:
3468 return rep->internal_recent_skipped_count;
3469 case rocksdb_internal_merge_count:
3470 return rep->internal_merge_count;
3471 case rocksdb_get_snapshot_time:
3472 return rep->get_snapshot_time;
3473 case rocksdb_get_from_memtable_time:
3474 return rep->get_from_memtable_time;
3475 case rocksdb_get_from_memtable_count:
3476 return rep->get_from_memtable_count;
3477 case rocksdb_get_post_process_time:
3478 return rep->get_post_process_time;
3479 case rocksdb_get_from_output_files_time:
3480 return rep->get_from_output_files_time;
3481 case rocksdb_seek_on_memtable_time:
3482 return rep->seek_on_memtable_time;
3483 case rocksdb_seek_on_memtable_count:
3484 return rep->seek_on_memtable_count;
3485 case rocksdb_next_on_memtable_count:
3486 return rep->next_on_memtable_count;
3487 case rocksdb_prev_on_memtable_count:
3488 return rep->prev_on_memtable_count;
3489 case rocksdb_seek_child_seek_time:
3490 return rep->seek_child_seek_time;
3491 case rocksdb_seek_child_seek_count:
3492 return rep->seek_child_seek_count;
3493 case rocksdb_seek_min_heap_time:
3494 return rep->seek_min_heap_time;
3495 case rocksdb_seek_max_heap_time:
3496 return rep->seek_max_heap_time;
3497 case rocksdb_seek_internal_seek_time:
3498 return rep->seek_internal_seek_time;
3499 case rocksdb_find_next_user_entry_time:
3500 return rep->find_next_user_entry_time;
3501 case rocksdb_write_wal_time:
3502 return rep->write_wal_time;
3503 case rocksdb_write_memtable_time:
3504 return rep->write_memtable_time;
3505 case rocksdb_write_delay_time:
3506 return rep->write_delay_time;
3507 case rocksdb_write_pre_and_post_process_time:
3508 return rep->write_pre_and_post_process_time;
3509 case rocksdb_db_mutex_lock_nanos:
3510 return rep->db_mutex_lock_nanos;
3511 case rocksdb_db_condition_wait_nanos:
3512 return rep->db_condition_wait_nanos;
3513 case rocksdb_merge_operator_time_nanos:
3514 return rep->merge_operator_time_nanos;
3515 case rocksdb_read_index_block_nanos:
3516 return rep->read_index_block_nanos;
3517 case rocksdb_read_filter_block_nanos:
3518 return rep->read_filter_block_nanos;
3519 case rocksdb_new_table_block_iter_nanos:
3520 return rep->new_table_block_iter_nanos;
3521 case rocksdb_new_table_iterator_nanos:
3522 return rep->new_table_iterator_nanos;
3523 case rocksdb_block_seek_nanos:
3524 return rep->block_seek_nanos;
3525 case rocksdb_find_table_nanos:
3526 return rep->find_table_nanos;
3527 case rocksdb_bloom_memtable_hit_count:
3528 return rep->bloom_memtable_hit_count;
3529 case rocksdb_bloom_memtable_miss_count:
3530 return rep->bloom_memtable_miss_count;
3531 case rocksdb_bloom_sst_hit_count:
3532 return rep->bloom_sst_hit_count;
3533 case rocksdb_bloom_sst_miss_count:
3534 return rep->bloom_sst_miss_count;
3535 case rocksdb_key_lock_wait_time:
3536 return rep->key_lock_wait_time;
3537 case rocksdb_key_lock_wait_count:
3538 return rep->key_lock_wait_count;
3539 case rocksdb_env_new_sequential_file_nanos:
3540 return rep->env_new_sequential_file_nanos;
3541 case rocksdb_env_new_random_access_file_nanos:
3542 return rep->env_new_random_access_file_nanos;
3543 case rocksdb_env_new_writable_file_nanos:
3544 return rep->env_new_writable_file_nanos;
3545 case rocksdb_env_reuse_writable_file_nanos:
3546 return rep->env_reuse_writable_file_nanos;
3547 case rocksdb_env_new_random_rw_file_nanos:
3548 return rep->env_new_random_rw_file_nanos;
3549 case rocksdb_env_new_directory_nanos:
3550 return rep->env_new_directory_nanos;
3551 case rocksdb_env_file_exists_nanos:
3552 return rep->env_file_exists_nanos;
3553 case rocksdb_env_get_children_nanos:
3554 return rep->env_get_children_nanos;
3555 case rocksdb_env_get_children_file_attributes_nanos:
3556 return rep->env_get_children_file_attributes_nanos;
3557 case rocksdb_env_delete_file_nanos:
3558 return rep->env_delete_file_nanos;
3559 case rocksdb_env_create_dir_nanos:
3560 return rep->env_create_dir_nanos;
3561 case rocksdb_env_create_dir_if_missing_nanos:
3562 return rep->env_create_dir_if_missing_nanos;
3563 case rocksdb_env_delete_dir_nanos:
3564 return rep->env_delete_dir_nanos;
3565 case rocksdb_env_get_file_size_nanos:
3566 return rep->env_get_file_size_nanos;
3567 case rocksdb_env_get_file_modification_time_nanos:
3568 return rep->env_get_file_modification_time_nanos;
3569 case rocksdb_env_rename_file_nanos:
3570 return rep->env_rename_file_nanos;
3571 case rocksdb_env_link_file_nanos:
3572 return rep->env_link_file_nanos;
3573 case rocksdb_env_lock_file_nanos:
3574 return rep->env_lock_file_nanos;
3575 case rocksdb_env_unlock_file_nanos:
3576 return rep->env_unlock_file_nanos;
3577 case rocksdb_env_new_logger_nanos:
3578 return rep->env_new_logger_nanos;
3579 default:
3580 break;
3581 }
3582 return 0;
3583}
3584
3585void rocksdb_perfcontext_destroy(rocksdb_perfcontext_t* context) {
3586 delete context;
3587}
3588
7c673cae
FG
3589/*
3590TODO:
3591DB::OpenForReadOnly
3592DB::KeyMayExist
3593DB::GetOptions
3594DB::GetSortedWalFiles
3595DB::GetLatestSequenceNumber
3596DB::GetUpdatesSince
3597DB::GetDbIdentity
3598DB::RunManualCompaction
3599custom cache
3600table_properties_collectors
3601*/
3602
3603rocksdb_compactionfilter_t* rocksdb_compactionfilter_create(
3604 void* state,
3605 void (*destructor)(void*),
3606 unsigned char (*filter)(
3607 void*,
3608 int level,
3609 const char* key, size_t key_length,
3610 const char* existing_value, size_t value_length,
3611 char** new_value, size_t *new_value_length,
3612 unsigned char* value_changed),
3613 const char* (*name)(void*)) {
3614 rocksdb_compactionfilter_t* result = new rocksdb_compactionfilter_t;
3615 result->state_ = state;
3616 result->destructor_ = destructor;
3617 result->filter_ = filter;
494da23a 3618 result->ignore_snapshots_ = true;
7c673cae
FG
3619 result->name_ = name;
3620 return result;
3621}
3622
3623void rocksdb_compactionfilter_set_ignore_snapshots(
3624 rocksdb_compactionfilter_t* filter,
3625 unsigned char whether_ignore) {
3626 filter->ignore_snapshots_ = whether_ignore;
3627}
3628
3629void rocksdb_compactionfilter_destroy(rocksdb_compactionfilter_t* filter) {
3630 delete filter;
3631}
3632
3633unsigned char rocksdb_compactionfiltercontext_is_full_compaction(
3634 rocksdb_compactionfiltercontext_t* context) {
3635 return context->rep.is_full_compaction;
3636}
3637
3638unsigned char rocksdb_compactionfiltercontext_is_manual_compaction(
3639 rocksdb_compactionfiltercontext_t* context) {
3640 return context->rep.is_manual_compaction;
3641}
3642
3643rocksdb_compactionfilterfactory_t* rocksdb_compactionfilterfactory_create(
3644 void* state, void (*destructor)(void*),
3645 rocksdb_compactionfilter_t* (*create_compaction_filter)(
3646 void*, rocksdb_compactionfiltercontext_t* context),
3647 const char* (*name)(void*)) {
3648 rocksdb_compactionfilterfactory_t* result =
3649 new rocksdb_compactionfilterfactory_t;
3650 result->state_ = state;
3651 result->destructor_ = destructor;
3652 result->create_compaction_filter_ = create_compaction_filter;
3653 result->name_ = name;
3654 return result;
3655}
3656
3657void rocksdb_compactionfilterfactory_destroy(
3658 rocksdb_compactionfilterfactory_t* factory) {
3659 delete factory;
3660}
3661
3662rocksdb_comparator_t* rocksdb_comparator_create(
3663 void* state,
3664 void (*destructor)(void*),
3665 int (*compare)(
3666 void*,
3667 const char* a, size_t alen,
3668 const char* b, size_t blen),
3669 const char* (*name)(void*)) {
3670 rocksdb_comparator_t* result = new rocksdb_comparator_t;
3671 result->state_ = state;
3672 result->destructor_ = destructor;
3673 result->compare_ = compare;
3674 result->name_ = name;
3675 return result;
3676}
3677
3678void rocksdb_comparator_destroy(rocksdb_comparator_t* cmp) {
3679 delete cmp;
3680}
3681
3682rocksdb_filterpolicy_t* rocksdb_filterpolicy_create(
3683 void* state,
3684 void (*destructor)(void*),
3685 char* (*create_filter)(
3686 void*,
3687 const char* const* key_array, const size_t* key_length_array,
3688 int num_keys,
3689 size_t* filter_length),
3690 unsigned char (*key_may_match)(
3691 void*,
3692 const char* key, size_t length,
3693 const char* filter, size_t filter_length),
3694 void (*delete_filter)(
3695 void*,
3696 const char* filter, size_t filter_length),
3697 const char* (*name)(void*)) {
3698 rocksdb_filterpolicy_t* result = new rocksdb_filterpolicy_t;
3699 result->state_ = state;
3700 result->destructor_ = destructor;
3701 result->create_ = create_filter;
3702 result->key_match_ = key_may_match;
3703 result->delete_filter_ = delete_filter;
3704 result->name_ = name;
3705 return result;
3706}
3707
3708void rocksdb_filterpolicy_destroy(rocksdb_filterpolicy_t* filter) {
3709 delete filter;
3710}
3711
3712rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_bloom_format(int bits_per_key, bool original_format) {
3713 // Make a rocksdb_filterpolicy_t, but override all of its methods so
3714 // they delegate to a NewBloomFilterPolicy() instead of user
3715 // supplied C functions.
3716 struct Wrapper : public rocksdb_filterpolicy_t {
3717 const FilterPolicy* rep_;
494da23a 3718 ~Wrapper() override { delete rep_; }
7c673cae
FG
3719 const char* Name() const override { return rep_->Name(); }
3720 void CreateFilter(const Slice* keys, int n,
3721 std::string* dst) const override {
3722 return rep_->CreateFilter(keys, n, dst);
3723 }
3724 bool KeyMayMatch(const Slice& key, const Slice& filter) const override {
3725 return rep_->KeyMayMatch(key, filter);
3726 }
f67539c2
TL
3727 // No need to override GetFilterBitsBuilder if this one is overridden
3728 ROCKSDB_NAMESPACE::FilterBitsBuilder* GetBuilderWithContext(
3729 const ROCKSDB_NAMESPACE::FilterBuildingContext& context)
3730 const override {
3731 return rep_->GetBuilderWithContext(context);
3732 }
3733 ROCKSDB_NAMESPACE::FilterBitsReader* GetFilterBitsReader(
3734 const Slice& contents) const override {
3735 return rep_->GetFilterBitsReader(contents);
3736 }
3737 static void DoNothing(void*) {}
7c673cae
FG
3738 };
3739 Wrapper* wrapper = new Wrapper;
3740 wrapper->rep_ = NewBloomFilterPolicy(bits_per_key, original_format);
3741 wrapper->state_ = nullptr;
3742 wrapper->delete_filter_ = nullptr;
3743 wrapper->destructor_ = &Wrapper::DoNothing;
3744 return wrapper;
3745}
3746
3747rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_bloom_full(int bits_per_key) {
3748 return rocksdb_filterpolicy_create_bloom_format(bits_per_key, false);
3749}
3750
3751rocksdb_filterpolicy_t* rocksdb_filterpolicy_create_bloom(int bits_per_key) {
3752 return rocksdb_filterpolicy_create_bloom_format(bits_per_key, true);
3753}
3754
3755rocksdb_mergeoperator_t* rocksdb_mergeoperator_create(
3756 void* state, void (*destructor)(void*),
3757 char* (*full_merge)(void*, const char* key, size_t key_length,
3758 const char* existing_value,
3759 size_t existing_value_length,
3760 const char* const* operands_list,
3761 const size_t* operands_list_length, int num_operands,
3762 unsigned char* success, size_t* new_value_length),
3763 char* (*partial_merge)(void*, const char* key, size_t key_length,
3764 const char* const* operands_list,
3765 const size_t* operands_list_length, int num_operands,
3766 unsigned char* success, size_t* new_value_length),
3767 void (*delete_value)(void*, const char* value, size_t value_length),
3768 const char* (*name)(void*)) {
3769 rocksdb_mergeoperator_t* result = new rocksdb_mergeoperator_t;
3770 result->state_ = state;
3771 result->destructor_ = destructor;
3772 result->full_merge_ = full_merge;
3773 result->partial_merge_ = partial_merge;
3774 result->delete_value_ = delete_value;
3775 result->name_ = name;
3776 return result;
3777}
3778
3779void rocksdb_mergeoperator_destroy(rocksdb_mergeoperator_t* merge_operator) {
3780 delete merge_operator;
3781}
3782
3783rocksdb_readoptions_t* rocksdb_readoptions_create() {
3784 return new rocksdb_readoptions_t;
3785}
3786
3787void rocksdb_readoptions_destroy(rocksdb_readoptions_t* opt) {
3788 delete opt;
3789}
3790
3791void rocksdb_readoptions_set_verify_checksums(
3792 rocksdb_readoptions_t* opt,
3793 unsigned char v) {
3794 opt->rep.verify_checksums = v;
3795}
3796
20effc67
TL
3797unsigned char rocksdb_readoptions_get_verify_checksums(
3798 rocksdb_readoptions_t* opt) {
3799 return opt->rep.verify_checksums;
3800}
3801
7c673cae
FG
3802void rocksdb_readoptions_set_fill_cache(
3803 rocksdb_readoptions_t* opt, unsigned char v) {
3804 opt->rep.fill_cache = v;
3805}
3806
20effc67
TL
3807unsigned char rocksdb_readoptions_get_fill_cache(rocksdb_readoptions_t* opt) {
3808 return opt->rep.fill_cache;
3809}
3810
7c673cae
FG
3811void rocksdb_readoptions_set_snapshot(
3812 rocksdb_readoptions_t* opt,
3813 const rocksdb_snapshot_t* snap) {
3814 opt->rep.snapshot = (snap ? snap->rep : nullptr);
3815}
3816
3817void rocksdb_readoptions_set_iterate_upper_bound(
3818 rocksdb_readoptions_t* opt,
3819 const char* key, size_t keylen) {
3820 if (key == nullptr) {
3821 opt->upper_bound = Slice();
3822 opt->rep.iterate_upper_bound = nullptr;
3823
3824 } else {
3825 opt->upper_bound = Slice(key, keylen);
3826 opt->rep.iterate_upper_bound = &opt->upper_bound;
3827 }
3828}
3829
11fdf7f2
TL
3830void rocksdb_readoptions_set_iterate_lower_bound(
3831 rocksdb_readoptions_t *opt,
3832 const char* key, size_t keylen) {
3833 if (key == nullptr) {
3834 opt->lower_bound = Slice();
3835 opt->rep.iterate_lower_bound = nullptr;
3836 } else {
3837 opt->lower_bound = Slice(key, keylen);
3838 opt->rep.iterate_lower_bound = &opt->lower_bound;
3839 }
3840}
3841
7c673cae
FG
3842void rocksdb_readoptions_set_read_tier(
3843 rocksdb_readoptions_t* opt, int v) {
f67539c2 3844 opt->rep.read_tier = static_cast<ROCKSDB_NAMESPACE::ReadTier>(v);
7c673cae
FG
3845}
3846
20effc67
TL
3847int rocksdb_readoptions_get_read_tier(rocksdb_readoptions_t* opt) {
3848 return static_cast<int>(opt->rep.read_tier);
3849}
3850
7c673cae
FG
3851void rocksdb_readoptions_set_tailing(
3852 rocksdb_readoptions_t* opt, unsigned char v) {
3853 opt->rep.tailing = v;
3854}
3855
20effc67
TL
3856unsigned char rocksdb_readoptions_get_tailing(rocksdb_readoptions_t* opt) {
3857 return opt->rep.tailing;
3858}
3859
11fdf7f2
TL
3860void rocksdb_readoptions_set_managed(
3861 rocksdb_readoptions_t* opt, unsigned char v) {
3862 opt->rep.managed = v;
3863}
3864
7c673cae
FG
3865void rocksdb_readoptions_set_readahead_size(
3866 rocksdb_readoptions_t* opt, size_t v) {
3867 opt->rep.readahead_size = v;
3868}
3869
20effc67
TL
3870size_t rocksdb_readoptions_get_readahead_size(rocksdb_readoptions_t* opt) {
3871 return opt->rep.readahead_size;
3872}
3873
11fdf7f2
TL
3874void rocksdb_readoptions_set_prefix_same_as_start(
3875 rocksdb_readoptions_t* opt, unsigned char v) {
3876 opt->rep.prefix_same_as_start = v;
3877}
3878
20effc67
TL
3879unsigned char rocksdb_readoptions_get_prefix_same_as_start(
3880 rocksdb_readoptions_t* opt) {
3881 return opt->rep.prefix_same_as_start;
3882}
3883
7c673cae
FG
3884void rocksdb_readoptions_set_pin_data(rocksdb_readoptions_t* opt,
3885 unsigned char v) {
3886 opt->rep.pin_data = v;
3887}
3888
20effc67
TL
3889unsigned char rocksdb_readoptions_get_pin_data(rocksdb_readoptions_t* opt) {
3890 return opt->rep.pin_data;
3891}
3892
7c673cae
FG
3893void rocksdb_readoptions_set_total_order_seek(rocksdb_readoptions_t* opt,
3894 unsigned char v) {
3895 opt->rep.total_order_seek = v;
3896}
3897
20effc67
TL
3898unsigned char rocksdb_readoptions_get_total_order_seek(
3899 rocksdb_readoptions_t* opt) {
3900 return opt->rep.total_order_seek;
3901}
3902
11fdf7f2
TL
3903void rocksdb_readoptions_set_max_skippable_internal_keys(
3904 rocksdb_readoptions_t* opt,
3905 uint64_t v) {
3906 opt->rep.max_skippable_internal_keys = v;
3907}
3908
20effc67
TL
3909uint64_t rocksdb_readoptions_get_max_skippable_internal_keys(
3910 rocksdb_readoptions_t* opt) {
3911 return opt->rep.max_skippable_internal_keys;
3912}
3913
11fdf7f2
TL
3914void rocksdb_readoptions_set_background_purge_on_iterator_cleanup(
3915 rocksdb_readoptions_t* opt, unsigned char v) {
3916 opt->rep.background_purge_on_iterator_cleanup = v;
3917}
3918
20effc67
TL
3919unsigned char rocksdb_readoptions_get_background_purge_on_iterator_cleanup(
3920 rocksdb_readoptions_t* opt) {
3921 return opt->rep.background_purge_on_iterator_cleanup;
3922}
3923
11fdf7f2
TL
3924void rocksdb_readoptions_set_ignore_range_deletions(
3925 rocksdb_readoptions_t* opt, unsigned char v) {
3926 opt->rep.ignore_range_deletions = v;
3927}
3928
20effc67
TL
3929unsigned char rocksdb_readoptions_get_ignore_range_deletions(
3930 rocksdb_readoptions_t* opt) {
3931 return opt->rep.ignore_range_deletions;
3932}
3933
7c673cae
FG
3934rocksdb_writeoptions_t* rocksdb_writeoptions_create() {
3935 return new rocksdb_writeoptions_t;
3936}
3937
3938void rocksdb_writeoptions_destroy(rocksdb_writeoptions_t* opt) {
3939 delete opt;
3940}
3941
3942void rocksdb_writeoptions_set_sync(
3943 rocksdb_writeoptions_t* opt, unsigned char v) {
3944 opt->rep.sync = v;
3945}
3946
20effc67
TL
3947unsigned char rocksdb_writeoptions_get_sync(rocksdb_writeoptions_t* opt) {
3948 return opt->rep.sync;
3949}
3950
7c673cae
FG
3951void rocksdb_writeoptions_disable_WAL(rocksdb_writeoptions_t* opt, int disable) {
3952 opt->rep.disableWAL = disable;
3953}
3954
20effc67
TL
3955unsigned char rocksdb_writeoptions_get_disable_WAL(
3956 rocksdb_writeoptions_t* opt) {
3957 return opt->rep.disableWAL;
3958}
3959
11fdf7f2
TL
3960void rocksdb_writeoptions_set_ignore_missing_column_families(
3961 rocksdb_writeoptions_t* opt,
3962 unsigned char v) {
3963 opt->rep.ignore_missing_column_families = v;
3964}
3965
20effc67
TL
3966unsigned char rocksdb_writeoptions_get_ignore_missing_column_families(
3967 rocksdb_writeoptions_t* opt) {
3968 return opt->rep.ignore_missing_column_families;
3969}
3970
11fdf7f2
TL
3971void rocksdb_writeoptions_set_no_slowdown(
3972 rocksdb_writeoptions_t* opt,
3973 unsigned char v) {
3974 opt->rep.no_slowdown = v;
3975}
3976
20effc67
TL
3977unsigned char rocksdb_writeoptions_get_no_slowdown(
3978 rocksdb_writeoptions_t* opt) {
3979 return opt->rep.no_slowdown;
3980}
3981
11fdf7f2
TL
3982void rocksdb_writeoptions_set_low_pri(
3983 rocksdb_writeoptions_t* opt,
3984 unsigned char v) {
3985 opt->rep.low_pri = v;
3986}
3987
20effc67
TL
3988unsigned char rocksdb_writeoptions_get_low_pri(rocksdb_writeoptions_t* opt) {
3989 return opt->rep.low_pri;
3990}
3991
f67539c2
TL
3992void rocksdb_writeoptions_set_memtable_insert_hint_per_batch(
3993 rocksdb_writeoptions_t* opt, unsigned char v) {
3994 opt->rep.memtable_insert_hint_per_batch = v;
3995}
3996
20effc67
TL
3997unsigned char rocksdb_writeoptions_get_memtable_insert_hint_per_batch(
3998 rocksdb_writeoptions_t* opt) {
3999 return opt->rep.memtable_insert_hint_per_batch;
4000}
4001
7c673cae
FG
4002rocksdb_compactoptions_t* rocksdb_compactoptions_create() {
4003 return new rocksdb_compactoptions_t;
4004}
4005
4006void rocksdb_compactoptions_destroy(rocksdb_compactoptions_t* opt) {
4007 delete opt;
4008}
4009
11fdf7f2
TL
4010void rocksdb_compactoptions_set_bottommost_level_compaction(
4011 rocksdb_compactoptions_t* opt, unsigned char v) {
4012 opt->rep.bottommost_level_compaction = static_cast<BottommostLevelCompaction>(v);
4013}
4014
20effc67
TL
4015unsigned char rocksdb_compactoptions_get_bottommost_level_compaction(
4016 rocksdb_compactoptions_t* opt) {
4017 return static_cast<unsigned char>(opt->rep.bottommost_level_compaction);
4018}
4019
7c673cae
FG
4020void rocksdb_compactoptions_set_exclusive_manual_compaction(
4021 rocksdb_compactoptions_t* opt, unsigned char v) {
4022 opt->rep.exclusive_manual_compaction = v;
4023}
4024
20effc67
TL
4025unsigned char rocksdb_compactoptions_get_exclusive_manual_compaction(
4026 rocksdb_compactoptions_t* opt) {
4027 return opt->rep.exclusive_manual_compaction;
4028}
4029
7c673cae
FG
4030void rocksdb_compactoptions_set_change_level(rocksdb_compactoptions_t* opt,
4031 unsigned char v) {
4032 opt->rep.change_level = v;
4033}
4034
20effc67
TL
4035unsigned char rocksdb_compactoptions_get_change_level(
4036 rocksdb_compactoptions_t* opt) {
4037 return opt->rep.change_level;
4038}
4039
7c673cae
FG
4040void rocksdb_compactoptions_set_target_level(rocksdb_compactoptions_t* opt,
4041 int n) {
4042 opt->rep.target_level = n;
4043}
4044
20effc67
TL
4045int rocksdb_compactoptions_get_target_level(rocksdb_compactoptions_t* opt) {
4046 return opt->rep.target_level;
4047}
4048
7c673cae
FG
4049rocksdb_flushoptions_t* rocksdb_flushoptions_create() {
4050 return new rocksdb_flushoptions_t;
4051}
4052
4053void rocksdb_flushoptions_destroy(rocksdb_flushoptions_t* opt) {
4054 delete opt;
4055}
4056
4057void rocksdb_flushoptions_set_wait(
4058 rocksdb_flushoptions_t* opt, unsigned char v) {
4059 opt->rep.wait = v;
4060}
4061
20effc67
TL
4062unsigned char rocksdb_flushoptions_get_wait(rocksdb_flushoptions_t* opt) {
4063 return opt->rep.wait;
4064}
4065
7c673cae
FG
4066rocksdb_cache_t* rocksdb_cache_create_lru(size_t capacity) {
4067 rocksdb_cache_t* c = new rocksdb_cache_t;
4068 c->rep = NewLRUCache(capacity);
4069 return c;
4070}
4071
4072void rocksdb_cache_destroy(rocksdb_cache_t* cache) {
4073 delete cache;
4074}
4075
4076void rocksdb_cache_set_capacity(rocksdb_cache_t* cache, size_t capacity) {
4077 cache->rep->SetCapacity(capacity);
4078}
4079
20effc67
TL
4080size_t rocksdb_cache_get_capacity(rocksdb_cache_t* cache) {
4081 return cache->rep->GetCapacity();
4082}
4083
7c673cae
FG
4084size_t rocksdb_cache_get_usage(rocksdb_cache_t* cache) {
4085 return cache->rep->GetUsage();
4086}
4087
4088size_t rocksdb_cache_get_pinned_usage(rocksdb_cache_t* cache) {
4089 return cache->rep->GetPinnedUsage();
4090}
4091
11fdf7f2
TL
4092rocksdb_dbpath_t* rocksdb_dbpath_create(const char* path, uint64_t target_size) {
4093 rocksdb_dbpath_t* result = new rocksdb_dbpath_t;
4094 result->rep.path = std::string(path);
4095 result->rep.target_size = target_size;
4096 return result;
4097}
4098
4099void rocksdb_dbpath_destroy(rocksdb_dbpath_t* dbpath) {
4100 delete dbpath;
4101}
4102
7c673cae
FG
4103rocksdb_env_t* rocksdb_create_default_env() {
4104 rocksdb_env_t* result = new rocksdb_env_t;
4105 result->rep = Env::Default();
4106 result->is_default = true;
4107 return result;
4108}
4109
4110rocksdb_env_t* rocksdb_create_mem_env() {
4111 rocksdb_env_t* result = new rocksdb_env_t;
f67539c2 4112 result->rep = ROCKSDB_NAMESPACE::NewMemEnv(Env::Default());
7c673cae
FG
4113 result->is_default = false;
4114 return result;
4115}
4116
4117void rocksdb_env_set_background_threads(rocksdb_env_t* env, int n) {
4118 env->rep->SetBackgroundThreads(n);
4119}
4120
20effc67
TL
4121int rocksdb_env_get_background_threads(rocksdb_env_t* env) {
4122 return env->rep->GetBackgroundThreads();
4123}
4124
4125void rocksdb_env_set_bottom_priority_background_threads(rocksdb_env_t* env,
4126 int n) {
4127 env->rep->SetBackgroundThreads(n, Env::BOTTOM);
4128}
4129
4130int rocksdb_env_get_bottom_priority_background_threads(rocksdb_env_t* env) {
4131 return env->rep->GetBackgroundThreads(Env::BOTTOM);
4132}
4133
7c673cae
FG
4134void rocksdb_env_set_high_priority_background_threads(rocksdb_env_t* env, int n) {
4135 env->rep->SetBackgroundThreads(n, Env::HIGH);
4136}
4137
20effc67
TL
4138int rocksdb_env_get_high_priority_background_threads(rocksdb_env_t* env) {
4139 return env->rep->GetBackgroundThreads(Env::HIGH);
4140}
4141
4142void rocksdb_env_set_low_priority_background_threads(rocksdb_env_t* env,
4143 int n) {
4144 env->rep->SetBackgroundThreads(n, Env::LOW);
4145}
4146
4147int rocksdb_env_get_low_priority_background_threads(rocksdb_env_t* env) {
4148 return env->rep->GetBackgroundThreads(Env::LOW);
4149}
4150
7c673cae
FG
4151void rocksdb_env_join_all_threads(rocksdb_env_t* env) {
4152 env->rep->WaitForJoin();
4153}
4154
f67539c2
TL
4155void rocksdb_env_lower_thread_pool_io_priority(rocksdb_env_t* env) {
4156 env->rep->LowerThreadPoolIOPriority();
4157}
4158
4159void rocksdb_env_lower_high_priority_thread_pool_io_priority(rocksdb_env_t* env) {
4160 env->rep->LowerThreadPoolIOPriority(Env::HIGH);
4161}
4162
4163void rocksdb_env_lower_thread_pool_cpu_priority(rocksdb_env_t* env) {
4164 env->rep->LowerThreadPoolCPUPriority();
4165}
4166
4167void rocksdb_env_lower_high_priority_thread_pool_cpu_priority(rocksdb_env_t* env) {
4168 env->rep->LowerThreadPoolCPUPriority(Env::HIGH);
4169}
4170
7c673cae
FG
4171void rocksdb_env_destroy(rocksdb_env_t* env) {
4172 if (!env->is_default) delete env->rep;
4173 delete env;
4174}
4175
4176rocksdb_envoptions_t* rocksdb_envoptions_create() {
4177 rocksdb_envoptions_t* opt = new rocksdb_envoptions_t;
4178 return opt;
4179}
4180
4181void rocksdb_envoptions_destroy(rocksdb_envoptions_t* opt) { delete opt; }
4182
4183rocksdb_sstfilewriter_t* rocksdb_sstfilewriter_create(
4184 const rocksdb_envoptions_t* env, const rocksdb_options_t* io_options) {
4185 rocksdb_sstfilewriter_t* writer = new rocksdb_sstfilewriter_t;
4186 writer->rep = new SstFileWriter(env->rep, io_options->rep);
4187 return writer;
4188}
4189
4190rocksdb_sstfilewriter_t* rocksdb_sstfilewriter_create_with_comparator(
4191 const rocksdb_envoptions_t* env, const rocksdb_options_t* io_options,
11fdf7f2 4192 const rocksdb_comparator_t* /*comparator*/) {
7c673cae
FG
4193 rocksdb_sstfilewriter_t* writer = new rocksdb_sstfilewriter_t;
4194 writer->rep = new SstFileWriter(env->rep, io_options->rep);
4195 return writer;
4196}
4197
4198void rocksdb_sstfilewriter_open(rocksdb_sstfilewriter_t* writer,
4199 const char* name, char** errptr) {
4200 SaveError(errptr, writer->rep->Open(std::string(name)));
4201}
4202
4203void rocksdb_sstfilewriter_add(rocksdb_sstfilewriter_t* writer, const char* key,
4204 size_t keylen, const char* val, size_t vallen,
4205 char** errptr) {
11fdf7f2
TL
4206 SaveError(errptr, writer->rep->Put(Slice(key, keylen), Slice(val, vallen)));
4207}
4208
4209void rocksdb_sstfilewriter_put(rocksdb_sstfilewriter_t* writer, const char* key,
4210 size_t keylen, const char* val, size_t vallen,
4211 char** errptr) {
4212 SaveError(errptr, writer->rep->Put(Slice(key, keylen), Slice(val, vallen)));
4213}
4214
4215void rocksdb_sstfilewriter_merge(rocksdb_sstfilewriter_t* writer,
4216 const char* key, size_t keylen,
4217 const char* val, size_t vallen,
4218 char** errptr) {
4219 SaveError(errptr, writer->rep->Merge(Slice(key, keylen), Slice(val, vallen)));
4220}
4221
4222void rocksdb_sstfilewriter_delete(rocksdb_sstfilewriter_t* writer,
4223 const char* key, size_t keylen,
4224 char** errptr) {
4225 SaveError(errptr, writer->rep->Delete(Slice(key, keylen)));
7c673cae
FG
4226}
4227
4228void rocksdb_sstfilewriter_finish(rocksdb_sstfilewriter_t* writer,
4229 char** errptr) {
11fdf7f2
TL
4230 SaveError(errptr, writer->rep->Finish(nullptr));
4231}
4232
4233void rocksdb_sstfilewriter_file_size(rocksdb_sstfilewriter_t* writer,
4234 uint64_t* file_size) {
4235 *file_size = writer->rep->FileSize();
7c673cae
FG
4236}
4237
4238void rocksdb_sstfilewriter_destroy(rocksdb_sstfilewriter_t* writer) {
4239 delete writer->rep;
4240 delete writer;
4241}
4242
4243rocksdb_ingestexternalfileoptions_t*
4244rocksdb_ingestexternalfileoptions_create() {
4245 rocksdb_ingestexternalfileoptions_t* opt =
4246 new rocksdb_ingestexternalfileoptions_t;
4247 return opt;
4248}
4249
4250void rocksdb_ingestexternalfileoptions_set_move_files(
4251 rocksdb_ingestexternalfileoptions_t* opt, unsigned char move_files) {
4252 opt->rep.move_files = move_files;
4253}
4254
4255void rocksdb_ingestexternalfileoptions_set_snapshot_consistency(
4256 rocksdb_ingestexternalfileoptions_t* opt,
4257 unsigned char snapshot_consistency) {
4258 opt->rep.snapshot_consistency = snapshot_consistency;
4259}
4260
4261void rocksdb_ingestexternalfileoptions_set_allow_global_seqno(
4262 rocksdb_ingestexternalfileoptions_t* opt,
4263 unsigned char allow_global_seqno) {
4264 opt->rep.allow_global_seqno = allow_global_seqno;
4265}
4266
4267void rocksdb_ingestexternalfileoptions_set_allow_blocking_flush(
4268 rocksdb_ingestexternalfileoptions_t* opt,
4269 unsigned char allow_blocking_flush) {
4270 opt->rep.allow_blocking_flush = allow_blocking_flush;
4271}
4272
11fdf7f2
TL
4273void rocksdb_ingestexternalfileoptions_set_ingest_behind(
4274 rocksdb_ingestexternalfileoptions_t* opt,
4275 unsigned char ingest_behind) {
4276 opt->rep.ingest_behind = ingest_behind;
4277}
4278
7c673cae
FG
4279void rocksdb_ingestexternalfileoptions_destroy(
4280 rocksdb_ingestexternalfileoptions_t* opt) {
4281 delete opt;
4282}
4283
4284void rocksdb_ingest_external_file(
4285 rocksdb_t* db, const char* const* file_list, const size_t list_len,
4286 const rocksdb_ingestexternalfileoptions_t* opt, char** errptr) {
4287 std::vector<std::string> files(list_len);
4288 for (size_t i = 0; i < list_len; ++i) {
4289 files[i] = std::string(file_list[i]);
4290 }
4291 SaveError(errptr, db->rep->IngestExternalFile(files, opt->rep));
4292}
4293
4294void rocksdb_ingest_external_file_cf(
4295 rocksdb_t* db, rocksdb_column_family_handle_t* handle,
4296 const char* const* file_list, const size_t list_len,
4297 const rocksdb_ingestexternalfileoptions_t* opt, char** errptr) {
4298 std::vector<std::string> files(list_len);
4299 for (size_t i = 0; i < list_len; ++i) {
4300 files[i] = std::string(file_list[i]);
4301 }
4302 SaveError(errptr, db->rep->IngestExternalFile(handle->rep, files, opt->rep));
4303}
4304
f67539c2
TL
4305void rocksdb_try_catch_up_with_primary(rocksdb_t* db, char** errptr) {
4306 SaveError(errptr, db->rep->TryCatchUpWithPrimary());
4307}
4308
7c673cae
FG
4309rocksdb_slicetransform_t* rocksdb_slicetransform_create(
4310 void* state,
4311 void (*destructor)(void*),
4312 char* (*transform)(
4313 void*,
4314 const char* key, size_t length,
4315 size_t* dst_length),
4316 unsigned char (*in_domain)(
4317 void*,
4318 const char* key, size_t length),
4319 unsigned char (*in_range)(
4320 void*,
4321 const char* key, size_t length),
4322 const char* (*name)(void*)) {
4323 rocksdb_slicetransform_t* result = new rocksdb_slicetransform_t;
4324 result->state_ = state;
4325 result->destructor_ = destructor;
4326 result->transform_ = transform;
4327 result->in_domain_ = in_domain;
4328 result->in_range_ = in_range;
4329 result->name_ = name;
4330 return result;
4331}
4332
4333void rocksdb_slicetransform_destroy(rocksdb_slicetransform_t* st) {
4334 delete st;
4335}
4336
11fdf7f2
TL
4337struct Wrapper : public rocksdb_slicetransform_t {
4338 const SliceTransform* rep_;
494da23a 4339 ~Wrapper() override { delete rep_; }
11fdf7f2
TL
4340 const char* Name() const override { return rep_->Name(); }
4341 Slice Transform(const Slice& src) const override {
4342 return rep_->Transform(src);
4343 }
4344 bool InDomain(const Slice& src) const override {
4345 return rep_->InDomain(src);
4346 }
4347 bool InRange(const Slice& src) const override { return rep_->InRange(src); }
4348 static void DoNothing(void*) { }
4349};
4350
7c673cae 4351rocksdb_slicetransform_t* rocksdb_slicetransform_create_fixed_prefix(size_t prefixLen) {
7c673cae 4352 Wrapper* wrapper = new Wrapper;
f67539c2 4353 wrapper->rep_ = ROCKSDB_NAMESPACE::NewFixedPrefixTransform(prefixLen);
7c673cae
FG
4354 wrapper->state_ = nullptr;
4355 wrapper->destructor_ = &Wrapper::DoNothing;
4356 return wrapper;
4357}
4358
4359rocksdb_slicetransform_t* rocksdb_slicetransform_create_noop() {
7c673cae 4360 Wrapper* wrapper = new Wrapper;
f67539c2 4361 wrapper->rep_ = ROCKSDB_NAMESPACE::NewNoopTransform();
7c673cae
FG
4362 wrapper->state_ = nullptr;
4363 wrapper->destructor_ = &Wrapper::DoNothing;
4364 return wrapper;
4365}
4366
4367rocksdb_universal_compaction_options_t* rocksdb_universal_compaction_options_create() {
4368 rocksdb_universal_compaction_options_t* result = new rocksdb_universal_compaction_options_t;
f67539c2 4369 result->rep = new ROCKSDB_NAMESPACE::CompactionOptionsUniversal;
7c673cae
FG
4370 return result;
4371}
4372
4373void rocksdb_universal_compaction_options_set_size_ratio(
4374 rocksdb_universal_compaction_options_t* uco, int ratio) {
4375 uco->rep->size_ratio = ratio;
4376}
4377
20effc67
TL
4378int rocksdb_universal_compaction_options_get_size_ratio(
4379 rocksdb_universal_compaction_options_t* uco) {
4380 return uco->rep->size_ratio;
4381}
4382
7c673cae
FG
4383void rocksdb_universal_compaction_options_set_min_merge_width(
4384 rocksdb_universal_compaction_options_t* uco, int w) {
4385 uco->rep->min_merge_width = w;
4386}
4387
20effc67
TL
4388int rocksdb_universal_compaction_options_get_min_merge_width(
4389 rocksdb_universal_compaction_options_t* uco) {
4390 return uco->rep->min_merge_width;
4391}
4392
7c673cae
FG
4393void rocksdb_universal_compaction_options_set_max_merge_width(
4394 rocksdb_universal_compaction_options_t* uco, int w) {
4395 uco->rep->max_merge_width = w;
4396}
4397
20effc67
TL
4398int rocksdb_universal_compaction_options_get_max_merge_width(
4399 rocksdb_universal_compaction_options_t* uco) {
4400 return uco->rep->max_merge_width;
4401}
4402
7c673cae
FG
4403void rocksdb_universal_compaction_options_set_max_size_amplification_percent(
4404 rocksdb_universal_compaction_options_t* uco, int p) {
4405 uco->rep->max_size_amplification_percent = p;
4406}
4407
20effc67
TL
4408int rocksdb_universal_compaction_options_get_max_size_amplification_percent(
4409 rocksdb_universal_compaction_options_t* uco) {
4410 return uco->rep->max_size_amplification_percent;
4411}
4412
7c673cae
FG
4413void rocksdb_universal_compaction_options_set_compression_size_percent(
4414 rocksdb_universal_compaction_options_t* uco, int p) {
4415 uco->rep->compression_size_percent = p;
4416}
4417
20effc67
TL
4418int rocksdb_universal_compaction_options_get_compression_size_percent(
4419 rocksdb_universal_compaction_options_t* uco) {
4420 return uco->rep->compression_size_percent;
4421}
4422
7c673cae
FG
4423void rocksdb_universal_compaction_options_set_stop_style(
4424 rocksdb_universal_compaction_options_t* uco, int style) {
f67539c2
TL
4425 uco->rep->stop_style =
4426 static_cast<ROCKSDB_NAMESPACE::CompactionStopStyle>(style);
7c673cae
FG
4427}
4428
20effc67
TL
4429int rocksdb_universal_compaction_options_get_stop_style(
4430 rocksdb_universal_compaction_options_t* uco) {
4431 return static_cast<int>(uco->rep->stop_style);
4432}
4433
7c673cae
FG
4434void rocksdb_universal_compaction_options_destroy(
4435 rocksdb_universal_compaction_options_t* uco) {
4436 delete uco->rep;
4437 delete uco;
4438}
4439
4440rocksdb_fifo_compaction_options_t* rocksdb_fifo_compaction_options_create() {
4441 rocksdb_fifo_compaction_options_t* result = new rocksdb_fifo_compaction_options_t;
4442 result->rep = CompactionOptionsFIFO();
4443 return result;
4444}
4445
4446void rocksdb_fifo_compaction_options_set_max_table_files_size(
4447 rocksdb_fifo_compaction_options_t* fifo_opts, uint64_t size) {
4448 fifo_opts->rep.max_table_files_size = size;
4449}
4450
20effc67
TL
4451uint64_t rocksdb_fifo_compaction_options_get_max_table_files_size(
4452 rocksdb_fifo_compaction_options_t* fifo_opts) {
4453 return fifo_opts->rep.max_table_files_size;
4454}
4455
7c673cae
FG
4456void rocksdb_fifo_compaction_options_destroy(
4457 rocksdb_fifo_compaction_options_t* fifo_opts) {
4458 delete fifo_opts;
4459}
4460
4461void rocksdb_options_set_min_level_to_compress(rocksdb_options_t* opt, int level) {
4462 if (level >= 0) {
4463 assert(level <= opt->rep.num_levels);
4464 opt->rep.compression_per_level.resize(opt->rep.num_levels);
4465 for (int i = 0; i < level; i++) {
f67539c2 4466 opt->rep.compression_per_level[i] = ROCKSDB_NAMESPACE::kNoCompression;
7c673cae
FG
4467 }
4468 for (int i = level; i < opt->rep.num_levels; i++) {
4469 opt->rep.compression_per_level[i] = opt->rep.compression;
4470 }
4471 }
4472}
4473
4474int rocksdb_livefiles_count(
4475 const rocksdb_livefiles_t* lf) {
4476 return static_cast<int>(lf->rep.size());
4477}
4478
4479const char* rocksdb_livefiles_name(
4480 const rocksdb_livefiles_t* lf,
4481 int index) {
4482 return lf->rep[index].name.c_str();
4483}
4484
4485int rocksdb_livefiles_level(
4486 const rocksdb_livefiles_t* lf,
4487 int index) {
4488 return lf->rep[index].level;
4489}
4490
4491size_t rocksdb_livefiles_size(
4492 const rocksdb_livefiles_t* lf,
4493 int index) {
4494 return lf->rep[index].size;
4495}
4496
4497const char* rocksdb_livefiles_smallestkey(
4498 const rocksdb_livefiles_t* lf,
4499 int index,
4500 size_t* size) {
4501 *size = lf->rep[index].smallestkey.size();
4502 return lf->rep[index].smallestkey.data();
4503}
4504
4505const char* rocksdb_livefiles_largestkey(
4506 const rocksdb_livefiles_t* lf,
4507 int index,
4508 size_t* size) {
4509 *size = lf->rep[index].largestkey.size();
4510 return lf->rep[index].largestkey.data();
4511}
4512
494da23a
TL
4513uint64_t rocksdb_livefiles_entries(
4514 const rocksdb_livefiles_t* lf,
4515 int index) {
4516 return lf->rep[index].num_entries;
4517}
4518
4519uint64_t rocksdb_livefiles_deletions(
4520 const rocksdb_livefiles_t* lf,
4521 int index) {
4522 return lf->rep[index].num_deletions;
4523}
4524
7c673cae
FG
4525extern void rocksdb_livefiles_destroy(
4526 const rocksdb_livefiles_t* lf) {
4527 delete lf;
4528}
4529
4530void rocksdb_get_options_from_string(const rocksdb_options_t* base_options,
4531 const char* opts_str,
4532 rocksdb_options_t* new_options,
4533 char** errptr) {
4534 SaveError(errptr,
4535 GetOptionsFromString(base_options->rep, std::string(opts_str),
4536 &new_options->rep));
4537}
4538
4539void rocksdb_delete_file_in_range(rocksdb_t* db, const char* start_key,
4540 size_t start_key_len, const char* limit_key,
4541 size_t limit_key_len, char** errptr) {
4542 Slice a, b;
4543 SaveError(
4544 errptr,
4545 DeleteFilesInRange(
4546 db->rep, db->rep->DefaultColumnFamily(),
4547 (start_key ? (a = Slice(start_key, start_key_len), &a) : nullptr),
4548 (limit_key ? (b = Slice(limit_key, limit_key_len), &b) : nullptr)));
4549}
4550
4551void rocksdb_delete_file_in_range_cf(
4552 rocksdb_t* db, rocksdb_column_family_handle_t* column_family,
4553 const char* start_key, size_t start_key_len, const char* limit_key,
4554 size_t limit_key_len, char** errptr) {
4555 Slice a, b;
4556 SaveError(
4557 errptr,
4558 DeleteFilesInRange(
4559 db->rep, column_family->rep,
4560 (start_key ? (a = Slice(start_key, start_key_len), &a) : nullptr),
4561 (limit_key ? (b = Slice(limit_key, limit_key_len), &b) : nullptr)));
4562}
4563
11fdf7f2
TL
4564rocksdb_transactiondb_options_t* rocksdb_transactiondb_options_create() {
4565 return new rocksdb_transactiondb_options_t;
4566}
4567
4568void rocksdb_transactiondb_options_destroy(rocksdb_transactiondb_options_t* opt){
4569 delete opt;
4570}
4571
4572void rocksdb_transactiondb_options_set_max_num_locks(
4573 rocksdb_transactiondb_options_t* opt, int64_t max_num_locks) {
4574 opt->rep.max_num_locks = max_num_locks;
4575}
4576
4577void rocksdb_transactiondb_options_set_num_stripes(
4578 rocksdb_transactiondb_options_t* opt, size_t num_stripes) {
4579 opt->rep.num_stripes = num_stripes;
4580}
4581
4582void rocksdb_transactiondb_options_set_transaction_lock_timeout(
4583 rocksdb_transactiondb_options_t* opt, int64_t txn_lock_timeout) {
4584 opt->rep.transaction_lock_timeout = txn_lock_timeout;
4585}
4586
4587void rocksdb_transactiondb_options_set_default_lock_timeout(
4588 rocksdb_transactiondb_options_t* opt, int64_t default_lock_timeout) {
4589 opt->rep.default_lock_timeout = default_lock_timeout;
4590}
4591
4592rocksdb_transaction_options_t* rocksdb_transaction_options_create() {
4593 return new rocksdb_transaction_options_t;
4594}
4595
4596void rocksdb_transaction_options_destroy(rocksdb_transaction_options_t* opt) {
4597 delete opt;
4598}
4599
4600void rocksdb_transaction_options_set_set_snapshot(
4601 rocksdb_transaction_options_t* opt, unsigned char v) {
4602 opt->rep.set_snapshot = v;
4603}
4604
4605void rocksdb_transaction_options_set_deadlock_detect(
4606 rocksdb_transaction_options_t* opt, unsigned char v) {
4607 opt->rep.deadlock_detect = v;
4608}
4609
4610void rocksdb_transaction_options_set_lock_timeout(
4611 rocksdb_transaction_options_t* opt, int64_t lock_timeout) {
4612 opt->rep.lock_timeout = lock_timeout;
4613}
4614
4615void rocksdb_transaction_options_set_expiration(
4616 rocksdb_transaction_options_t* opt, int64_t expiration) {
4617 opt->rep.expiration = expiration;
4618}
4619
4620void rocksdb_transaction_options_set_deadlock_detect_depth(
4621 rocksdb_transaction_options_t* opt, int64_t depth) {
4622 opt->rep.deadlock_detect_depth = depth;
4623}
4624
4625void rocksdb_transaction_options_set_max_write_batch_size(
4626 rocksdb_transaction_options_t* opt, size_t size) {
4627 opt->rep.max_write_batch_size = size;
4628}
4629
4630rocksdb_optimistictransaction_options_t*
4631rocksdb_optimistictransaction_options_create() {
4632 return new rocksdb_optimistictransaction_options_t;
4633}
4634
4635void rocksdb_optimistictransaction_options_destroy(
4636 rocksdb_optimistictransaction_options_t* opt) {
4637 delete opt;
4638}
4639
4640void rocksdb_optimistictransaction_options_set_set_snapshot(
4641 rocksdb_optimistictransaction_options_t* opt, unsigned char v) {
4642 opt->rep.set_snapshot = v;
4643}
4644
4645rocksdb_column_family_handle_t* rocksdb_transactiondb_create_column_family(
4646 rocksdb_transactiondb_t* txn_db,
4647 const rocksdb_options_t* column_family_options,
4648 const char* column_family_name, char** errptr) {
4649 rocksdb_column_family_handle_t* handle = new rocksdb_column_family_handle_t;
4650 SaveError(errptr, txn_db->rep->CreateColumnFamily(
4651 ColumnFamilyOptions(column_family_options->rep),
4652 std::string(column_family_name), &(handle->rep)));
4653 return handle;
4654}
4655
4656rocksdb_transactiondb_t* rocksdb_transactiondb_open(
4657 const rocksdb_options_t* options,
4658 const rocksdb_transactiondb_options_t* txn_db_options, const char* name,
4659 char** errptr) {
4660 TransactionDB* txn_db;
4661 if (SaveError(errptr, TransactionDB::Open(options->rep, txn_db_options->rep,
4662 std::string(name), &txn_db))) {
4663 return nullptr;
4664 }
4665 rocksdb_transactiondb_t* result = new rocksdb_transactiondb_t;
4666 result->rep = txn_db;
4667 return result;
4668}
4669
494da23a
TL
4670rocksdb_transactiondb_t* rocksdb_transactiondb_open_column_families(
4671 const rocksdb_options_t* options,
4672 const rocksdb_transactiondb_options_t* txn_db_options, const char* name,
f67539c2
TL
4673 int num_column_families, const char* const* column_family_names,
4674 const rocksdb_options_t* const* column_family_options,
494da23a
TL
4675 rocksdb_column_family_handle_t** column_family_handles, char** errptr) {
4676 std::vector<ColumnFamilyDescriptor> column_families;
4677 for (int i = 0; i < num_column_families; i++) {
4678 column_families.push_back(ColumnFamilyDescriptor(
4679 std::string(column_family_names[i]),
4680 ColumnFamilyOptions(column_family_options[i]->rep)));
4681 }
4682
4683 TransactionDB* txn_db;
4684 std::vector<ColumnFamilyHandle*> handles;
4685 if (SaveError(errptr, TransactionDB::Open(options->rep, txn_db_options->rep,
4686 std::string(name), column_families,
4687 &handles, &txn_db))) {
4688 return nullptr;
4689 }
4690
4691 for (size_t i = 0; i < handles.size(); i++) {
4692 rocksdb_column_family_handle_t* c_handle =
4693 new rocksdb_column_family_handle_t;
4694 c_handle->rep = handles[i];
4695 column_family_handles[i] = c_handle;
4696 }
4697 rocksdb_transactiondb_t* result = new rocksdb_transactiondb_t;
4698 result->rep = txn_db;
4699 return result;
4700}
4701
11fdf7f2
TL
4702const rocksdb_snapshot_t* rocksdb_transactiondb_create_snapshot(
4703 rocksdb_transactiondb_t* txn_db) {
4704 rocksdb_snapshot_t* result = new rocksdb_snapshot_t;
4705 result->rep = txn_db->rep->GetSnapshot();
4706 return result;
4707}
4708
4709void rocksdb_transactiondb_release_snapshot(
4710 rocksdb_transactiondb_t* txn_db, const rocksdb_snapshot_t* snapshot) {
4711 txn_db->rep->ReleaseSnapshot(snapshot->rep);
4712 delete snapshot;
4713}
4714
4715rocksdb_transaction_t* rocksdb_transaction_begin(
4716 rocksdb_transactiondb_t* txn_db,
4717 const rocksdb_writeoptions_t* write_options,
4718 const rocksdb_transaction_options_t* txn_options,
4719 rocksdb_transaction_t* old_txn) {
4720 if (old_txn == nullptr) {
4721 rocksdb_transaction_t* result = new rocksdb_transaction_t;
4722 result->rep = txn_db->rep->BeginTransaction(write_options->rep,
4723 txn_options->rep, nullptr);
4724 return result;
4725 }
4726 old_txn->rep = txn_db->rep->BeginTransaction(write_options->rep,
4727 txn_options->rep, old_txn->rep);
4728 return old_txn;
4729}
4730
4731void rocksdb_transaction_commit(rocksdb_transaction_t* txn, char** errptr) {
4732 SaveError(errptr, txn->rep->Commit());
4733}
4734
4735void rocksdb_transaction_rollback(rocksdb_transaction_t* txn, char** errptr) {
4736 SaveError(errptr, txn->rep->Rollback());
4737}
4738
4739void rocksdb_transaction_set_savepoint(rocksdb_transaction_t* txn) {
4740 txn->rep->SetSavePoint();
4741}
4742
4743void rocksdb_transaction_rollback_to_savepoint(rocksdb_transaction_t* txn, char** errptr) {
4744 SaveError(errptr, txn->rep->RollbackToSavePoint());
4745}
4746
4747void rocksdb_transaction_destroy(rocksdb_transaction_t* txn) {
4748 delete txn->rep;
4749 delete txn;
4750}
4751
4752const rocksdb_snapshot_t* rocksdb_transaction_get_snapshot(
4753 rocksdb_transaction_t* txn) {
4754 rocksdb_snapshot_t* result = new rocksdb_snapshot_t;
4755 result->rep = txn->rep->GetSnapshot();
4756 return result;
4757}
4758
4759// Read a key inside a transaction
4760char* rocksdb_transaction_get(rocksdb_transaction_t* txn,
4761 const rocksdb_readoptions_t* options,
4762 const char* key, size_t klen, size_t* vlen,
4763 char** errptr) {
4764 char* result = nullptr;
4765 std::string tmp;
4766 Status s = txn->rep->Get(options->rep, Slice(key, klen), &tmp);
4767 if (s.ok()) {
4768 *vlen = tmp.size();
4769 result = CopyString(tmp);
4770 } else {
4771 *vlen = 0;
4772 if (!s.IsNotFound()) {
4773 SaveError(errptr, s);
4774 }
4775 }
4776 return result;
4777}
4778
4779char* rocksdb_transaction_get_cf(rocksdb_transaction_t* txn,
4780 const rocksdb_readoptions_t* options,
4781 rocksdb_column_family_handle_t* column_family,
4782 const char* key, size_t klen, size_t* vlen,
4783 char** errptr) {
4784 char* result = nullptr;
4785 std::string tmp;
4786 Status s =
4787 txn->rep->Get(options->rep, column_family->rep, Slice(key, klen), &tmp);
4788 if (s.ok()) {
4789 *vlen = tmp.size();
4790 result = CopyString(tmp);
4791 } else {
4792 *vlen = 0;
4793 if (!s.IsNotFound()) {
4794 SaveError(errptr, s);
4795 }
4796 }
4797 return result;
4798}
4799
4800// Read a key inside a transaction
4801char* rocksdb_transaction_get_for_update(rocksdb_transaction_t* txn,
4802 const rocksdb_readoptions_t* options,
4803 const char* key, size_t klen,
4804 size_t* vlen, unsigned char exclusive,
4805 char** errptr) {
4806 char* result = nullptr;
4807 std::string tmp;
4808 Status s =
4809 txn->rep->GetForUpdate(options->rep, Slice(key, klen), &tmp, exclusive);
4810 if (s.ok()) {
4811 *vlen = tmp.size();
4812 result = CopyString(tmp);
4813 } else {
4814 *vlen = 0;
4815 if (!s.IsNotFound()) {
4816 SaveError(errptr, s);
4817 }
4818 }
4819 return result;
4820}
4821
494da23a
TL
4822char* rocksdb_transaction_get_for_update_cf(
4823 rocksdb_transaction_t* txn, const rocksdb_readoptions_t* options,
4824 rocksdb_column_family_handle_t* column_family, const char* key, size_t klen,
4825 size_t* vlen, unsigned char exclusive, char** errptr) {
4826 char* result = nullptr;
4827 std::string tmp;
4828 Status s = txn->rep->GetForUpdate(options->rep, column_family->rep,
4829 Slice(key, klen), &tmp, exclusive);
4830 if (s.ok()) {
4831 *vlen = tmp.size();
4832 result = CopyString(tmp);
4833 } else {
4834 *vlen = 0;
4835 if (!s.IsNotFound()) {
4836 SaveError(errptr, s);
4837 }
4838 }
4839 return result;
4840}
4841
11fdf7f2
TL
4842// Read a key outside a transaction
4843char* rocksdb_transactiondb_get(
4844 rocksdb_transactiondb_t* txn_db,
4845 const rocksdb_readoptions_t* options,
4846 const char* key, size_t klen,
4847 size_t* vlen,
4848 char** errptr){
4849 char* result = nullptr;
4850 std::string tmp;
4851 Status s = txn_db->rep->Get(options->rep, Slice(key, klen), &tmp);
4852 if (s.ok()) {
4853 *vlen = tmp.size();
4854 result = CopyString(tmp);
4855 } else {
4856 *vlen = 0;
4857 if (!s.IsNotFound()) {
4858 SaveError(errptr, s);
4859 }
4860 }
4861 return result;
4862}
4863
4864char* rocksdb_transactiondb_get_cf(
4865 rocksdb_transactiondb_t* txn_db, const rocksdb_readoptions_t* options,
4866 rocksdb_column_family_handle_t* column_family, const char* key,
4867 size_t keylen, size_t* vallen, char** errptr) {
4868 char* result = nullptr;
4869 std::string tmp;
4870 Status s = txn_db->rep->Get(options->rep, column_family->rep,
4871 Slice(key, keylen), &tmp);
4872 if (s.ok()) {
4873 *vallen = tmp.size();
4874 result = CopyString(tmp);
4875 } else {
4876 *vallen = 0;
4877 if (!s.IsNotFound()) {
4878 SaveError(errptr, s);
4879 }
4880 }
4881 return result;
4882}
4883
4884// Put a key inside a transaction
4885void rocksdb_transaction_put(rocksdb_transaction_t* txn, const char* key,
4886 size_t klen, const char* val, size_t vlen,
4887 char** errptr) {
4888 SaveError(errptr, txn->rep->Put(Slice(key, klen), Slice(val, vlen)));
4889}
4890
4891void rocksdb_transaction_put_cf(rocksdb_transaction_t* txn,
4892 rocksdb_column_family_handle_t* column_family,
4893 const char* key, size_t klen, const char* val,
4894 size_t vlen, char** errptr) {
4895 SaveError(errptr, txn->rep->Put(column_family->rep, Slice(key, klen),
4896 Slice(val, vlen)));
4897}
4898
4899// Put a key outside a transaction
4900void rocksdb_transactiondb_put(rocksdb_transactiondb_t* txn_db,
4901 const rocksdb_writeoptions_t* options,
4902 const char* key, size_t klen, const char* val,
4903 size_t vlen, char** errptr) {
4904 SaveError(errptr,
4905 txn_db->rep->Put(options->rep, Slice(key, klen), Slice(val, vlen)));
4906}
4907
4908void rocksdb_transactiondb_put_cf(rocksdb_transactiondb_t* txn_db,
4909 const rocksdb_writeoptions_t* options,
4910 rocksdb_column_family_handle_t* column_family,
4911 const char* key, size_t keylen,
4912 const char* val, size_t vallen,
4913 char** errptr) {
4914 SaveError(errptr, txn_db->rep->Put(options->rep, column_family->rep,
4915 Slice(key, keylen), Slice(val, vallen)));
4916}
4917
4918// Write batch into transaction db
4919void rocksdb_transactiondb_write(
4920 rocksdb_transactiondb_t* db,
4921 const rocksdb_writeoptions_t* options,
4922 rocksdb_writebatch_t* batch,
4923 char** errptr) {
4924 SaveError(errptr, db->rep->Write(options->rep, &batch->rep));
4925}
4926
4927// Merge a key inside a transaction
4928void rocksdb_transaction_merge(rocksdb_transaction_t* txn, const char* key,
4929 size_t klen, const char* val, size_t vlen,
4930 char** errptr) {
4931 SaveError(errptr, txn->rep->Merge(Slice(key, klen), Slice(val, vlen)));
4932}
4933
494da23a
TL
4934void rocksdb_transaction_merge_cf(rocksdb_transaction_t* txn,
4935 rocksdb_column_family_handle_t* column_family,
4936 const char* key, size_t klen, const char* val,
4937 size_t vlen, char** errptr) {
4938 SaveError(errptr, txn->rep->Merge(column_family->rep, Slice(key, klen),
4939 Slice(val, vlen)));
4940}
4941
11fdf7f2
TL
4942// Merge a key outside a transaction
4943void rocksdb_transactiondb_merge(rocksdb_transactiondb_t* txn_db,
4944 const rocksdb_writeoptions_t* options,
4945 const char* key, size_t klen, const char* val,
4946 size_t vlen, char** errptr) {
4947 SaveError(errptr, txn_db->rep->Merge(options->rep, Slice(key, klen),
4948 Slice(val, vlen)));
4949}
4950
494da23a
TL
4951void rocksdb_transactiondb_merge_cf(
4952 rocksdb_transactiondb_t* txn_db, const rocksdb_writeoptions_t* options,
4953 rocksdb_column_family_handle_t* column_family, const char* key, size_t klen,
4954 const char* val, size_t vlen, char** errptr) {
4955 SaveError(errptr, txn_db->rep->Merge(options->rep, column_family->rep,
4956 Slice(key, klen), Slice(val, vlen)));
4957}
4958
11fdf7f2
TL
4959// Delete a key inside a transaction
4960void rocksdb_transaction_delete(rocksdb_transaction_t* txn, const char* key,
4961 size_t klen, char** errptr) {
4962 SaveError(errptr, txn->rep->Delete(Slice(key, klen)));
4963}
4964
4965void rocksdb_transaction_delete_cf(
4966 rocksdb_transaction_t* txn, rocksdb_column_family_handle_t* column_family,
4967 const char* key, size_t klen, char** errptr) {
4968 SaveError(errptr, txn->rep->Delete(column_family->rep, Slice(key, klen)));
4969}
4970
4971// Delete a key outside a transaction
4972void rocksdb_transactiondb_delete(rocksdb_transactiondb_t* txn_db,
4973 const rocksdb_writeoptions_t* options,
4974 const char* key, size_t klen, char** errptr) {
4975 SaveError(errptr, txn_db->rep->Delete(options->rep, Slice(key, klen)));
4976}
4977
4978void rocksdb_transactiondb_delete_cf(
4979 rocksdb_transactiondb_t* txn_db, const rocksdb_writeoptions_t* options,
4980 rocksdb_column_family_handle_t* column_family, const char* key,
4981 size_t keylen, char** errptr) {
4982 SaveError(errptr, txn_db->rep->Delete(options->rep, column_family->rep,
4983 Slice(key, keylen)));
4984}
4985
4986// Create an iterator inside a transaction
4987rocksdb_iterator_t* rocksdb_transaction_create_iterator(
4988 rocksdb_transaction_t* txn, const rocksdb_readoptions_t* options) {
4989 rocksdb_iterator_t* result = new rocksdb_iterator_t;
4990 result->rep = txn->rep->GetIterator(options->rep);
4991 return result;
4992}
4993
4994// Create an iterator inside a transaction with column family
4995rocksdb_iterator_t* rocksdb_transaction_create_iterator_cf(
4996 rocksdb_transaction_t* txn, const rocksdb_readoptions_t* options,
4997 rocksdb_column_family_handle_t* column_family) {
4998 rocksdb_iterator_t* result = new rocksdb_iterator_t;
4999 result->rep = txn->rep->GetIterator(options->rep, column_family->rep);
5000 return result;
5001}
5002
5003// Create an iterator outside a transaction
5004rocksdb_iterator_t* rocksdb_transactiondb_create_iterator(
5005 rocksdb_transactiondb_t* txn_db, const rocksdb_readoptions_t* options) {
5006 rocksdb_iterator_t* result = new rocksdb_iterator_t;
5007 result->rep = txn_db->rep->NewIterator(options->rep);
5008 return result;
5009}
5010
494da23a
TL
5011rocksdb_iterator_t* rocksdb_transactiondb_create_iterator_cf(
5012 rocksdb_transactiondb_t* txn_db, const rocksdb_readoptions_t* options,
5013 rocksdb_column_family_handle_t* column_family) {
5014 rocksdb_iterator_t* result = new rocksdb_iterator_t;
5015 result->rep = txn_db->rep->NewIterator(options->rep, column_family->rep);
5016 return result;
5017}
5018
11fdf7f2
TL
5019void rocksdb_transactiondb_close(rocksdb_transactiondb_t* txn_db) {
5020 delete txn_db->rep;
5021 delete txn_db;
5022}
5023
5024rocksdb_checkpoint_t* rocksdb_transactiondb_checkpoint_object_create(
5025 rocksdb_transactiondb_t* txn_db, char** errptr) {
5026 Checkpoint* checkpoint;
5027 if (SaveError(errptr, Checkpoint::Create(txn_db->rep, &checkpoint))) {
5028 return nullptr;
5029 }
5030 rocksdb_checkpoint_t* result = new rocksdb_checkpoint_t;
5031 result->rep = checkpoint;
5032 return result;
5033}
5034
5035rocksdb_optimistictransactiondb_t* rocksdb_optimistictransactiondb_open(
5036 const rocksdb_options_t* options, const char* name, char** errptr) {
5037 OptimisticTransactionDB* otxn_db;
5038 if (SaveError(errptr, OptimisticTransactionDB::Open(
5039 options->rep, std::string(name), &otxn_db))) {
5040 return nullptr;
5041 }
5042 rocksdb_optimistictransactiondb_t* result =
5043 new rocksdb_optimistictransactiondb_t;
5044 result->rep = otxn_db;
5045 return result;
5046}
5047
5048rocksdb_optimistictransactiondb_t*
5049rocksdb_optimistictransactiondb_open_column_families(
5050 const rocksdb_options_t* db_options, const char* name,
f67539c2
TL
5051 int num_column_families, const char* const* column_family_names,
5052 const rocksdb_options_t* const* column_family_options,
11fdf7f2
TL
5053 rocksdb_column_family_handle_t** column_family_handles, char** errptr) {
5054 std::vector<ColumnFamilyDescriptor> column_families;
5055 for (int i = 0; i < num_column_families; i++) {
5056 column_families.push_back(ColumnFamilyDescriptor(
5057 std::string(column_family_names[i]),
5058 ColumnFamilyOptions(column_family_options[i]->rep)));
5059 }
5060
5061 OptimisticTransactionDB* otxn_db;
5062 std::vector<ColumnFamilyHandle*> handles;
5063 if (SaveError(errptr, OptimisticTransactionDB::Open(
5064 DBOptions(db_options->rep), std::string(name),
5065 column_families, &handles, &otxn_db))) {
5066 return nullptr;
5067 }
5068
5069 for (size_t i = 0; i < handles.size(); i++) {
5070 rocksdb_column_family_handle_t* c_handle =
5071 new rocksdb_column_family_handle_t;
5072 c_handle->rep = handles[i];
5073 column_family_handles[i] = c_handle;
5074 }
5075 rocksdb_optimistictransactiondb_t* result =
5076 new rocksdb_optimistictransactiondb_t;
5077 result->rep = otxn_db;
5078 return result;
5079}
5080
5081rocksdb_t* rocksdb_optimistictransactiondb_get_base_db(
5082 rocksdb_optimistictransactiondb_t* otxn_db) {
5083 DB* base_db = otxn_db->rep->GetBaseDB();
5084
5085 if (base_db != nullptr) {
5086 rocksdb_t* result = new rocksdb_t;
5087 result->rep = base_db;
5088 return result;
5089 }
5090
5091 return nullptr;
5092}
5093
5094void rocksdb_optimistictransactiondb_close_base_db(rocksdb_t* base_db) {
5095 delete base_db;
5096}
5097
5098rocksdb_transaction_t* rocksdb_optimistictransaction_begin(
5099 rocksdb_optimistictransactiondb_t* otxn_db,
5100 const rocksdb_writeoptions_t* write_options,
5101 const rocksdb_optimistictransaction_options_t* otxn_options,
5102 rocksdb_transaction_t* old_txn) {
5103 if (old_txn == nullptr) {
5104 rocksdb_transaction_t* result = new rocksdb_transaction_t;
5105 result->rep = otxn_db->rep->BeginTransaction(write_options->rep,
5106 otxn_options->rep, nullptr);
5107 return result;
5108 }
5109 old_txn->rep = otxn_db->rep->BeginTransaction(
5110 write_options->rep, otxn_options->rep, old_txn->rep);
5111 return old_txn;
5112}
5113
5114void rocksdb_optimistictransactiondb_close(
5115 rocksdb_optimistictransactiondb_t* otxn_db) {
5116 delete otxn_db->rep;
5117 delete otxn_db;
5118}
5119
7c673cae
FG
5120void rocksdb_free(void* ptr) { free(ptr); }
5121
11fdf7f2
TL
5122rocksdb_pinnableslice_t* rocksdb_get_pinned(
5123 rocksdb_t* db, const rocksdb_readoptions_t* options, const char* key,
5124 size_t keylen, char** errptr) {
5125 rocksdb_pinnableslice_t* v = new (rocksdb_pinnableslice_t);
5126 Status s = db->rep->Get(options->rep, db->rep->DefaultColumnFamily(),
5127 Slice(key, keylen), &v->rep);
5128 if (!s.ok()) {
5129 delete (v);
5130 if (!s.IsNotFound()) {
5131 SaveError(errptr, s);
5132 }
5133 return nullptr;
5134 }
5135 return v;
5136}
5137
5138rocksdb_pinnableslice_t* rocksdb_get_pinned_cf(
5139 rocksdb_t* db, const rocksdb_readoptions_t* options,
5140 rocksdb_column_family_handle_t* column_family, const char* key,
5141 size_t keylen, char** errptr) {
5142 rocksdb_pinnableslice_t* v = new (rocksdb_pinnableslice_t);
5143 Status s = db->rep->Get(options->rep, column_family->rep, Slice(key, keylen),
5144 &v->rep);
5145 if (!s.ok()) {
5146 delete v;
5147 if (!s.IsNotFound()) {
5148 SaveError(errptr, s);
5149 }
5150 return nullptr;
5151 }
5152 return v;
5153}
5154
5155void rocksdb_pinnableslice_destroy(rocksdb_pinnableslice_t* v) { delete v; }
5156
5157const char* rocksdb_pinnableslice_value(const rocksdb_pinnableslice_t* v,
5158 size_t* vlen) {
5159 if (!v) {
5160 *vlen = 0;
5161 return nullptr;
5162 }
5163
5164 *vlen = v->rep.size();
5165 return v->rep.data();
5166}
5167
f67539c2
TL
5168// container to keep databases and caches in order to use
5169// ROCKSDB_NAMESPACE::MemoryUtil
11fdf7f2
TL
5170struct rocksdb_memory_consumers_t {
5171 std::vector<rocksdb_t*> dbs;
5172 std::unordered_set<rocksdb_cache_t*> caches;
5173};
5174
5175// initializes new container of memory consumers
5176rocksdb_memory_consumers_t* rocksdb_memory_consumers_create() {
5177 return new rocksdb_memory_consumers_t;
5178}
5179
5180// adds datatabase to the container of memory consumers
5181void rocksdb_memory_consumers_add_db(rocksdb_memory_consumers_t* consumers,
5182 rocksdb_t* db) {
5183 consumers->dbs.push_back(db);
5184}
5185
5186// adds cache to the container of memory consumers
5187void rocksdb_memory_consumers_add_cache(rocksdb_memory_consumers_t* consumers,
5188 rocksdb_cache_t* cache) {
5189 consumers->caches.insert(cache);
5190}
5191
5192// deletes container with memory consumers
5193void rocksdb_memory_consumers_destroy(rocksdb_memory_consumers_t* consumers) {
5194 delete consumers;
5195}
5196
f67539c2 5197// contains memory usage statistics provided by ROCKSDB_NAMESPACE::MemoryUtil
11fdf7f2
TL
5198struct rocksdb_memory_usage_t {
5199 uint64_t mem_table_total;
5200 uint64_t mem_table_unflushed;
5201 uint64_t mem_table_readers_total;
5202 uint64_t cache_total;
5203};
5204
5205// estimates amount of memory occupied by consumers (dbs and caches)
5206rocksdb_memory_usage_t* rocksdb_approximate_memory_usage_create(
5207 rocksdb_memory_consumers_t* consumers, char** errptr) {
5208
5209 vector<DB*> dbs;
5210 for (auto db : consumers->dbs) {
5211 dbs.push_back(db->rep);
5212 }
5213
5214 unordered_set<const Cache*> cache_set;
5215 for (auto cache : consumers->caches) {
5216 cache_set.insert(const_cast<const Cache*>(cache->rep.get()));
5217 }
5218
f67539c2 5219 std::map<ROCKSDB_NAMESPACE::MemoryUtil::UsageType, uint64_t> usage_by_type;
11fdf7f2
TL
5220
5221 auto status = MemoryUtil::GetApproximateMemoryUsageByType(dbs, cache_set,
5222 &usage_by_type);
5223 if (SaveError(errptr, status)) {
5224 return nullptr;
5225 }
5226
5227 auto result = new rocksdb_memory_usage_t;
5228 result->mem_table_total = usage_by_type[MemoryUtil::kMemTableTotal];
5229 result->mem_table_unflushed = usage_by_type[MemoryUtil::kMemTableUnFlushed];
5230 result->mem_table_readers_total = usage_by_type[MemoryUtil::kTableReadersTotal];
5231 result->cache_total = usage_by_type[MemoryUtil::kCacheTotal];
5232 return result;
5233}
5234
5235uint64_t rocksdb_approximate_memory_usage_get_mem_table_total(
5236 rocksdb_memory_usage_t* memory_usage) {
5237 return memory_usage->mem_table_total;
5238}
5239
5240uint64_t rocksdb_approximate_memory_usage_get_mem_table_unflushed(
5241 rocksdb_memory_usage_t* memory_usage) {
5242 return memory_usage->mem_table_unflushed;
5243}
5244
5245uint64_t rocksdb_approximate_memory_usage_get_mem_table_readers_total(
5246 rocksdb_memory_usage_t* memory_usage) {
5247 return memory_usage->mem_table_readers_total;
5248}
5249
5250uint64_t rocksdb_approximate_memory_usage_get_cache_total(
5251 rocksdb_memory_usage_t* memory_usage) {
5252 return memory_usage->cache_total;
5253}
5254
20effc67
TL
5255void rocksdb_options_set_dump_malloc_stats(rocksdb_options_t* opt,
5256 unsigned char val) {
5257 opt->rep.dump_malloc_stats = val;
5258}
5259
5260void rocksdb_options_set_memtable_whole_key_filtering(rocksdb_options_t* opt,
5261 unsigned char val) {
5262 opt->rep.memtable_whole_key_filtering = val;
5263}
5264
11fdf7f2
TL
5265// deletes container with memory usage estimates
5266void rocksdb_approximate_memory_usage_destroy(rocksdb_memory_usage_t* usage) {
5267 delete usage;
5268}
5269
20effc67
TL
5270void rocksdb_cancel_all_background_work(rocksdb_t* db, unsigned char wait) {
5271 CancelAllBackgroundWork(db->rep, wait);
5272}
5273
7c673cae
FG
5274} // end extern "C"
5275
5276#endif // !ROCKSDB_LITE