Add C API functions (and tests) for WriteBatchWithIndex
Summary: I've added functions to the C API to support WriteBatchWithIndex as requested in #1833. I've also added unit tests to c_test I've implemented the WriteBatchWithIndex variation of every function available for regular WriteBatch. And added additional functions unique to WriteBatchWithIndex. For now, the following is omitted: 1. The ability to create WriteBatchWithIndex's custom batch-only iterator as I'm not sure what its purpose is. It should be possible to add later if anyone wants it. 2. The ability to create the batch with a fallback comparator, since it appears to be unnecessary. I believe the column family comparator will be used for this, meaning those using a custom comparator can just use the column family variations. Closes https://github.com/facebook/rocksdb/pull/1985 Differential Revision: D4760039 Pulled By: siying fbshipit-source-id: 393227e
This commit is contained in:
parent
88bb6f6bfa
commit
41ccae6d26
375
db/c.cc
375
db/c.cc
@ -32,8 +32,10 @@
|
|||||||
#include "rocksdb/table.h"
|
#include "rocksdb/table.h"
|
||||||
#include "rocksdb/rate_limiter.h"
|
#include "rocksdb/rate_limiter.h"
|
||||||
#include "rocksdb/utilities/backupable_db.h"
|
#include "rocksdb/utilities/backupable_db.h"
|
||||||
|
#include "rocksdb/utilities/write_batch_with_index.h"
|
||||||
#include "utilities/merge_operators.h"
|
#include "utilities/merge_operators.h"
|
||||||
|
|
||||||
|
using rocksdb::BytewiseComparator;
|
||||||
using rocksdb::Cache;
|
using rocksdb::Cache;
|
||||||
using rocksdb::ColumnFamilyDescriptor;
|
using rocksdb::ColumnFamilyDescriptor;
|
||||||
using rocksdb::ColumnFamilyHandle;
|
using rocksdb::ColumnFamilyHandle;
|
||||||
@ -75,6 +77,7 @@ using rocksdb::SstFileWriter;
|
|||||||
using rocksdb::Status;
|
using rocksdb::Status;
|
||||||
using rocksdb::WritableFile;
|
using rocksdb::WritableFile;
|
||||||
using rocksdb::WriteBatch;
|
using rocksdb::WriteBatch;
|
||||||
|
using rocksdb::WriteBatchWithIndex;
|
||||||
using rocksdb::WriteOptions;
|
using rocksdb::WriteOptions;
|
||||||
using rocksdb::LiveFileMetaData;
|
using rocksdb::LiveFileMetaData;
|
||||||
using rocksdb::BackupEngine;
|
using rocksdb::BackupEngine;
|
||||||
@ -95,6 +98,7 @@ struct rocksdb_backup_engine_info_t { std::vector<BackupInfo> rep; };
|
|||||||
struct rocksdb_restore_options_t { RestoreOptions rep; };
|
struct rocksdb_restore_options_t { RestoreOptions rep; };
|
||||||
struct rocksdb_iterator_t { Iterator* rep; };
|
struct rocksdb_iterator_t { Iterator* rep; };
|
||||||
struct rocksdb_writebatch_t { WriteBatch rep; };
|
struct rocksdb_writebatch_t { WriteBatch rep; };
|
||||||
|
struct rocksdb_writebatch_wi_t { WriteBatchWithIndex* rep; };
|
||||||
struct rocksdb_snapshot_t { const Snapshot* rep; };
|
struct rocksdb_snapshot_t { const Snapshot* rep; };
|
||||||
struct rocksdb_flushoptions_t { FlushOptions rep; };
|
struct rocksdb_flushoptions_t { FlushOptions rep; };
|
||||||
struct rocksdb_fifo_compaction_options_t { CompactionOptionsFIFO rep; };
|
struct rocksdb_fifo_compaction_options_t { CompactionOptionsFIFO rep; };
|
||||||
@ -1356,6 +1360,377 @@ void rocksdb_writebatch_rollback_to_save_point(rocksdb_writebatch_t* b,
|
|||||||
SaveError(errptr, b->rep.RollbackToSavePoint());
|
SaveError(errptr, b->rep.RollbackToSavePoint());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rocksdb_writebatch_wi_t* rocksdb_writebatch_wi_create(size_t reserved_bytes, unsigned char overwrite_key) {
|
||||||
|
rocksdb_writebatch_wi_t* b = new rocksdb_writebatch_wi_t;
|
||||||
|
b->rep = new WriteBatchWithIndex(BytewiseComparator(), reserved_bytes, overwrite_key);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_destroy(rocksdb_writebatch_wi_t* b) {
|
||||||
|
if (b->rep) {
|
||||||
|
delete b->rep;
|
||||||
|
}
|
||||||
|
delete b;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_clear(rocksdb_writebatch_wi_t* b) {
|
||||||
|
b->rep->Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
int rocksdb_writebatch_wi_count(rocksdb_writebatch_wi_t* b) {
|
||||||
|
return b->rep->GetWriteBatch()->Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_put(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
const char* key, size_t klen,
|
||||||
|
const char* val, size_t vlen) {
|
||||||
|
b->rep->Put(Slice(key, klen), Slice(val, vlen));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_put_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* key, size_t klen,
|
||||||
|
const char* val, size_t vlen) {
|
||||||
|
b->rep->Put(column_family->rep, Slice(key, klen), Slice(val, vlen));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_putv(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
int num_keys, const char* const* keys_list,
|
||||||
|
const size_t* keys_list_sizes,
|
||||||
|
int num_values, const char* const* values_list,
|
||||||
|
const size_t* values_list_sizes) {
|
||||||
|
std::vector<Slice> key_slices(num_keys);
|
||||||
|
for (int i = 0; i < num_keys; i++) {
|
||||||
|
key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
|
||||||
|
}
|
||||||
|
std::vector<Slice> value_slices(num_values);
|
||||||
|
for (int i = 0; i < num_values; i++) {
|
||||||
|
value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
|
||||||
|
}
|
||||||
|
b->rep->Put(SliceParts(key_slices.data(), num_keys),
|
||||||
|
SliceParts(value_slices.data(), num_values));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_putv_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
rocksdb_column_family_handle_t* column_family,
|
||||||
|
int num_keys, const char* const* keys_list,
|
||||||
|
const size_t* keys_list_sizes,
|
||||||
|
int num_values, const char* const* values_list,
|
||||||
|
const size_t* values_list_sizes) {
|
||||||
|
std::vector<Slice> key_slices(num_keys);
|
||||||
|
for (int i = 0; i < num_keys; i++) {
|
||||||
|
key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
|
||||||
|
}
|
||||||
|
std::vector<Slice> value_slices(num_values);
|
||||||
|
for (int i = 0; i < num_values; i++) {
|
||||||
|
value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
|
||||||
|
}
|
||||||
|
b->rep->Put(column_family->rep, SliceParts(key_slices.data(), num_keys),
|
||||||
|
SliceParts(value_slices.data(), num_values));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_merge(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
const char* key, size_t klen,
|
||||||
|
const char* val, size_t vlen) {
|
||||||
|
b->rep->Merge(Slice(key, klen), Slice(val, vlen));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_merge_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* key, size_t klen,
|
||||||
|
const char* val, size_t vlen) {
|
||||||
|
b->rep->Merge(column_family->rep, Slice(key, klen), Slice(val, vlen));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_mergev(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
int num_keys, const char* const* keys_list,
|
||||||
|
const size_t* keys_list_sizes,
|
||||||
|
int num_values, const char* const* values_list,
|
||||||
|
const size_t* values_list_sizes) {
|
||||||
|
std::vector<Slice> key_slices(num_keys);
|
||||||
|
for (int i = 0; i < num_keys; i++) {
|
||||||
|
key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
|
||||||
|
}
|
||||||
|
std::vector<Slice> value_slices(num_values);
|
||||||
|
for (int i = 0; i < num_values; i++) {
|
||||||
|
value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
|
||||||
|
}
|
||||||
|
b->rep->Merge(SliceParts(key_slices.data(), num_keys),
|
||||||
|
SliceParts(value_slices.data(), num_values));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_mergev_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
rocksdb_column_family_handle_t* column_family,
|
||||||
|
int num_keys, const char* const* keys_list,
|
||||||
|
const size_t* keys_list_sizes,
|
||||||
|
int num_values, const char* const* values_list,
|
||||||
|
const size_t* values_list_sizes) {
|
||||||
|
std::vector<Slice> key_slices(num_keys);
|
||||||
|
for (int i = 0; i < num_keys; i++) {
|
||||||
|
key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
|
||||||
|
}
|
||||||
|
std::vector<Slice> value_slices(num_values);
|
||||||
|
for (int i = 0; i < num_values; i++) {
|
||||||
|
value_slices[i] = Slice(values_list[i], values_list_sizes[i]);
|
||||||
|
}
|
||||||
|
b->rep->Merge(column_family->rep, SliceParts(key_slices.data(), num_keys),
|
||||||
|
SliceParts(value_slices.data(), num_values));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_delete(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
const char* key, size_t klen) {
|
||||||
|
b->rep->Delete(Slice(key, klen));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_delete_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* key, size_t klen) {
|
||||||
|
b->rep->Delete(column_family->rep, Slice(key, klen));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_deletev(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
int num_keys, const char* const* keys_list,
|
||||||
|
const size_t* keys_list_sizes) {
|
||||||
|
std::vector<Slice> key_slices(num_keys);
|
||||||
|
for (int i = 0; i < num_keys; i++) {
|
||||||
|
key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
|
||||||
|
}
|
||||||
|
b->rep->Delete(SliceParts(key_slices.data(), num_keys));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_deletev_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
rocksdb_column_family_handle_t* column_family,
|
||||||
|
int num_keys, const char* const* keys_list,
|
||||||
|
const size_t* keys_list_sizes) {
|
||||||
|
std::vector<Slice> key_slices(num_keys);
|
||||||
|
for (int i = 0; i < num_keys; i++) {
|
||||||
|
key_slices[i] = Slice(keys_list[i], keys_list_sizes[i]);
|
||||||
|
}
|
||||||
|
b->rep->Delete(column_family->rep, SliceParts(key_slices.data(), num_keys));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_delete_range(rocksdb_writebatch_wi_t* b,
|
||||||
|
const char* start_key,
|
||||||
|
size_t start_key_len, const char* end_key,
|
||||||
|
size_t end_key_len) {
|
||||||
|
b->rep->DeleteRange(Slice(start_key, start_key_len),
|
||||||
|
Slice(end_key, end_key_len));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_delete_range_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* start_key, size_t start_key_len, const char* end_key,
|
||||||
|
size_t end_key_len) {
|
||||||
|
b->rep->DeleteRange(column_family->rep, Slice(start_key, start_key_len),
|
||||||
|
Slice(end_key, end_key_len));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_delete_rangev(rocksdb_writebatch_wi_t* b, int num_keys,
|
||||||
|
const char* const* start_keys_list,
|
||||||
|
const size_t* start_keys_list_sizes,
|
||||||
|
const char* const* end_keys_list,
|
||||||
|
const size_t* end_keys_list_sizes) {
|
||||||
|
std::vector<Slice> start_key_slices(num_keys);
|
||||||
|
std::vector<Slice> end_key_slices(num_keys);
|
||||||
|
for (int i = 0; i < num_keys; i++) {
|
||||||
|
start_key_slices[i] = Slice(start_keys_list[i], start_keys_list_sizes[i]);
|
||||||
|
end_key_slices[i] = Slice(end_keys_list[i], end_keys_list_sizes[i]);
|
||||||
|
}
|
||||||
|
b->rep->DeleteRange(SliceParts(start_key_slices.data(), num_keys),
|
||||||
|
SliceParts(end_key_slices.data(), num_keys));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_delete_rangev_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
|
||||||
|
int num_keys, const char* const* start_keys_list,
|
||||||
|
const size_t* start_keys_list_sizes, const char* const* end_keys_list,
|
||||||
|
const size_t* end_keys_list_sizes) {
|
||||||
|
std::vector<Slice> start_key_slices(num_keys);
|
||||||
|
std::vector<Slice> end_key_slices(num_keys);
|
||||||
|
for (int i = 0; i < num_keys; i++) {
|
||||||
|
start_key_slices[i] = Slice(start_keys_list[i], start_keys_list_sizes[i]);
|
||||||
|
end_key_slices[i] = Slice(end_keys_list[i], end_keys_list_sizes[i]);
|
||||||
|
}
|
||||||
|
b->rep->DeleteRange(column_family->rep,
|
||||||
|
SliceParts(start_key_slices.data(), num_keys),
|
||||||
|
SliceParts(end_key_slices.data(), num_keys));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_put_log_data(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
const char* blob, size_t len) {
|
||||||
|
b->rep->PutLogData(Slice(blob, len));
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_iterate(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
void* state,
|
||||||
|
void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen),
|
||||||
|
void (*deleted)(void*, const char* k, size_t klen)) {
|
||||||
|
class H : public WriteBatch::Handler {
|
||||||
|
public:
|
||||||
|
void* state_;
|
||||||
|
void (*put_)(void*, const char* k, size_t klen, const char* v, size_t vlen);
|
||||||
|
void (*deleted_)(void*, const char* k, size_t klen);
|
||||||
|
virtual void Put(const Slice& key, const Slice& value) override {
|
||||||
|
(*put_)(state_, key.data(), key.size(), value.data(), value.size());
|
||||||
|
}
|
||||||
|
virtual void Delete(const Slice& key) override {
|
||||||
|
(*deleted_)(state_, key.data(), key.size());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
H handler;
|
||||||
|
handler.state_ = state;
|
||||||
|
handler.put_ = put;
|
||||||
|
handler.deleted_ = deleted;
|
||||||
|
b->rep->GetWriteBatch()->Iterate(&handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* rocksdb_writebatch_wi_data(rocksdb_writebatch_wi_t* b, size_t* size) {
|
||||||
|
WriteBatch* wb = b->rep->GetWriteBatch();
|
||||||
|
*size = wb->GetDataSize();
|
||||||
|
return wb->Data().c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_set_save_point(rocksdb_writebatch_wi_t* b) {
|
||||||
|
b->rep->SetSavePoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_writebatch_wi_rollback_to_save_point(rocksdb_writebatch_wi_t* b,
|
||||||
|
char** errptr) {
|
||||||
|
SaveError(errptr, b->rep->RollbackToSavePoint());
|
||||||
|
}
|
||||||
|
|
||||||
|
rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
rocksdb_iterator_t* base_iterator) {
|
||||||
|
rocksdb_iterator_t* result = new rocksdb_iterator_t;
|
||||||
|
result->rep = wbwi->rep->NewIteratorWithBase(base_iterator->rep);
|
||||||
|
delete base_iterator;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base_cf(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
rocksdb_iterator_t* base_iterator,
|
||||||
|
rocksdb_column_family_handle_t* column_family) {
|
||||||
|
rocksdb_iterator_t* result = new rocksdb_iterator_t;
|
||||||
|
result->rep = wbwi->rep->NewIteratorWithBase(column_family->rep, base_iterator->rep);
|
||||||
|
delete base_iterator;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* rocksdb_writebatch_wi_get_from_batch(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
const rocksdb_options_t* options,
|
||||||
|
const char* key, size_t keylen,
|
||||||
|
size_t* vallen,
|
||||||
|
char** errptr) {
|
||||||
|
char* result = nullptr;
|
||||||
|
std::string tmp;
|
||||||
|
Status s = wbwi->rep->GetFromBatch(options->rep, Slice(key, keylen), &tmp);
|
||||||
|
if (s.ok()) {
|
||||||
|
*vallen = tmp.size();
|
||||||
|
result = CopyString(tmp);
|
||||||
|
} else {
|
||||||
|
*vallen = 0;
|
||||||
|
if (!s.IsNotFound()) {
|
||||||
|
SaveError(errptr, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* rocksdb_writebatch_wi_get_from_batch_cf(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
const rocksdb_options_t* options,
|
||||||
|
rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* key, size_t keylen,
|
||||||
|
size_t* vallen,
|
||||||
|
char** errptr) {
|
||||||
|
char* result = nullptr;
|
||||||
|
std::string tmp;
|
||||||
|
Status s = wbwi->rep->GetFromBatch(column_family->rep, options->rep,
|
||||||
|
Slice(key, keylen), &tmp);
|
||||||
|
if (s.ok()) {
|
||||||
|
*vallen = tmp.size();
|
||||||
|
result = CopyString(tmp);
|
||||||
|
} else {
|
||||||
|
*vallen = 0;
|
||||||
|
if (!s.IsNotFound()) {
|
||||||
|
SaveError(errptr, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* rocksdb_writebatch_wi_get_from_batch_and_db(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
rocksdb_t* db,
|
||||||
|
const rocksdb_readoptions_t* options,
|
||||||
|
const char* key, size_t keylen,
|
||||||
|
size_t* vallen,
|
||||||
|
char** errptr) {
|
||||||
|
char* result = nullptr;
|
||||||
|
std::string tmp;
|
||||||
|
Status s = wbwi->rep->GetFromBatchAndDB(db->rep, options->rep, Slice(key, keylen), &tmp);
|
||||||
|
if (s.ok()) {
|
||||||
|
*vallen = tmp.size();
|
||||||
|
result = CopyString(tmp);
|
||||||
|
} else {
|
||||||
|
*vallen = 0;
|
||||||
|
if (!s.IsNotFound()) {
|
||||||
|
SaveError(errptr, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* rocksdb_writebatch_wi_get_from_batch_and_db_cf(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
rocksdb_t* db,
|
||||||
|
const rocksdb_readoptions_t* options,
|
||||||
|
rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* key, size_t keylen,
|
||||||
|
size_t* vallen,
|
||||||
|
char** errptr) {
|
||||||
|
char* result = nullptr;
|
||||||
|
std::string tmp;
|
||||||
|
Status s = wbwi->rep->GetFromBatchAndDB(db->rep, options->rep, column_family->rep,
|
||||||
|
Slice(key, keylen), &tmp);
|
||||||
|
if (s.ok()) {
|
||||||
|
*vallen = tmp.size();
|
||||||
|
result = CopyString(tmp);
|
||||||
|
} else {
|
||||||
|
*vallen = 0;
|
||||||
|
if (!s.IsNotFound()) {
|
||||||
|
SaveError(errptr, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rocksdb_write_writebatch_wi(
|
||||||
|
rocksdb_t* db,
|
||||||
|
const rocksdb_writeoptions_t* options,
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
char** errptr) {
|
||||||
|
WriteBatch* wb = wbwi->rep->GetWriteBatch();
|
||||||
|
SaveError(errptr, db->rep->Write(options->rep, wb));
|
||||||
|
}
|
||||||
|
|
||||||
rocksdb_block_based_table_options_t*
|
rocksdb_block_based_table_options_t*
|
||||||
rocksdb_block_based_options_create() {
|
rocksdb_block_based_options_create() {
|
||||||
return new rocksdb_block_based_table_options_t;
|
return new rocksdb_block_based_table_options_t;
|
||||||
|
125
db/c_test.c
125
db/c_test.c
@ -87,6 +87,16 @@ static void Free(char** ptr) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void CheckValue(
|
||||||
|
char* err,
|
||||||
|
const char* expected,
|
||||||
|
char** actual,
|
||||||
|
size_t actual_length) {
|
||||||
|
CheckNoError(err);
|
||||||
|
CheckEqual(expected, *actual, actual_length);
|
||||||
|
Free(actual);
|
||||||
|
}
|
||||||
|
|
||||||
static void CheckGet(
|
static void CheckGet(
|
||||||
rocksdb_t* db,
|
rocksdb_t* db,
|
||||||
const rocksdb_readoptions_t* options,
|
const rocksdb_readoptions_t* options,
|
||||||
@ -608,6 +618,90 @@ int main(int argc, char** argv) {
|
|||||||
rocksdb_writebatch_destroy(wb2);
|
rocksdb_writebatch_destroy(wb2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StartPhase("writebatch_wi");
|
||||||
|
{
|
||||||
|
rocksdb_writebatch_wi_t* wbi = rocksdb_writebatch_wi_create(0, 1);
|
||||||
|
rocksdb_writebatch_wi_put(wbi, "foo", 3, "a", 1);
|
||||||
|
rocksdb_writebatch_wi_clear(wbi);
|
||||||
|
rocksdb_writebatch_wi_put(wbi, "bar", 3, "b", 1);
|
||||||
|
rocksdb_writebatch_wi_put(wbi, "box", 3, "c", 1);
|
||||||
|
rocksdb_writebatch_wi_delete(wbi, "bar", 3);
|
||||||
|
int count = rocksdb_writebatch_wi_count(wbi);
|
||||||
|
CheckCondition(count == 3);
|
||||||
|
size_t size;
|
||||||
|
char* value;
|
||||||
|
value = rocksdb_writebatch_wi_get_from_batch(wbi, options, "box", 3, &size, &err);
|
||||||
|
CheckValue(err, "c", &value, size);
|
||||||
|
value = rocksdb_writebatch_wi_get_from_batch(wbi, options, "bar", 3, &size, &err);
|
||||||
|
CheckValue(err, NULL, &value, size);
|
||||||
|
value = rocksdb_writebatch_wi_get_from_batch_and_db(wbi, db, roptions, "foo", 3, &size, &err);
|
||||||
|
CheckValue(err, "hello", &value, size);
|
||||||
|
value = rocksdb_writebatch_wi_get_from_batch_and_db(wbi, db, roptions, "box", 3, &size, &err);
|
||||||
|
CheckValue(err, "c", &value, size);
|
||||||
|
rocksdb_write_writebatch_wi(db, woptions, wbi, &err);
|
||||||
|
CheckNoError(err);
|
||||||
|
CheckGet(db, roptions, "foo", "hello");
|
||||||
|
CheckGet(db, roptions, "bar", NULL);
|
||||||
|
CheckGet(db, roptions, "box", "c");
|
||||||
|
int pos = 0;
|
||||||
|
rocksdb_writebatch_wi_iterate(wbi, &pos, CheckPut, CheckDel);
|
||||||
|
CheckCondition(pos == 3);
|
||||||
|
rocksdb_writebatch_wi_clear(wbi);
|
||||||
|
rocksdb_writebatch_wi_put(wbi, "bar", 3, "b", 1);
|
||||||
|
rocksdb_writebatch_wi_put(wbi, "bay", 3, "d", 1);
|
||||||
|
rocksdb_writebatch_wi_delete_range(wbi, "bar", 3, "bay", 3);
|
||||||
|
rocksdb_write_writebatch_wi(db, woptions, wbi, &err);
|
||||||
|
CheckNoError(err);
|
||||||
|
CheckGet(db, roptions, "bar", NULL);
|
||||||
|
CheckGet(db, roptions, "bay", "d");
|
||||||
|
rocksdb_writebatch_wi_clear(wbi);
|
||||||
|
const char* start_list[1] = {"bay"};
|
||||||
|
const size_t start_sizes[1] = {3};
|
||||||
|
const char* end_list[1] = {"baz"};
|
||||||
|
const size_t end_sizes[1] = {3};
|
||||||
|
rocksdb_writebatch_wi_delete_rangev(wbi, 1, start_list, start_sizes, end_list,
|
||||||
|
end_sizes);
|
||||||
|
rocksdb_write_writebatch_wi(db, woptions, wbi, &err);
|
||||||
|
CheckNoError(err);
|
||||||
|
CheckGet(db, roptions, "bay", NULL);
|
||||||
|
rocksdb_writebatch_wi_destroy(wbi);
|
||||||
|
}
|
||||||
|
|
||||||
|
StartPhase("writebatch_wi_vectors");
|
||||||
|
{
|
||||||
|
rocksdb_writebatch_wi_t* wb = rocksdb_writebatch_wi_create(0, 1);
|
||||||
|
const char* k_list[2] = { "z", "ap" };
|
||||||
|
const size_t k_sizes[2] = { 1, 2 };
|
||||||
|
const char* v_list[3] = { "x", "y", "z" };
|
||||||
|
const size_t v_sizes[3] = { 1, 1, 1 };
|
||||||
|
rocksdb_writebatch_wi_putv(wb, 2, k_list, k_sizes, 3, v_list, v_sizes);
|
||||||
|
rocksdb_write_writebatch_wi(db, woptions, wb, &err);
|
||||||
|
CheckNoError(err);
|
||||||
|
CheckGet(db, roptions, "zap", "xyz");
|
||||||
|
rocksdb_writebatch_wi_delete(wb, "zap", 3);
|
||||||
|
rocksdb_write_writebatch_wi(db, woptions, wb, &err);
|
||||||
|
CheckNoError(err);
|
||||||
|
CheckGet(db, roptions, "zap", NULL);
|
||||||
|
rocksdb_writebatch_wi_destroy(wb);
|
||||||
|
}
|
||||||
|
|
||||||
|
StartPhase("writebatch_wi_savepoint");
|
||||||
|
{
|
||||||
|
rocksdb_writebatch_wi_t* wb = rocksdb_writebatch_wi_create(0, 1);
|
||||||
|
rocksdb_writebatch_wi_set_save_point(wb);
|
||||||
|
const char* k_list[2] = {"z", "ap"};
|
||||||
|
const size_t k_sizes[2] = {1, 2};
|
||||||
|
const char* v_list[3] = {"x", "y", "z"};
|
||||||
|
const size_t v_sizes[3] = {1, 1, 1};
|
||||||
|
rocksdb_writebatch_wi_putv(wb, 2, k_list, k_sizes, 3, v_list, v_sizes);
|
||||||
|
rocksdb_writebatch_wi_rollback_to_save_point(wb, &err);
|
||||||
|
CheckNoError(err);
|
||||||
|
rocksdb_write_writebatch_wi(db, woptions, wb, &err);
|
||||||
|
CheckNoError(err);
|
||||||
|
CheckGet(db, roptions, "zap", NULL);
|
||||||
|
rocksdb_writebatch_wi_destroy(wb);
|
||||||
|
}
|
||||||
|
|
||||||
StartPhase("iter");
|
StartPhase("iter");
|
||||||
{
|
{
|
||||||
rocksdb_iterator_t* iter = rocksdb_create_iterator(db, roptions);
|
rocksdb_iterator_t* iter = rocksdb_create_iterator(db, roptions);
|
||||||
@ -634,6 +728,37 @@ int main(int argc, char** argv) {
|
|||||||
rocksdb_iter_destroy(iter);
|
rocksdb_iter_destroy(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StartPhase("wbwi_iter");
|
||||||
|
{
|
||||||
|
rocksdb_iterator_t* base_iter = rocksdb_create_iterator(db, roptions);
|
||||||
|
rocksdb_writebatch_wi_t* wbi = rocksdb_writebatch_wi_create(0, 1);
|
||||||
|
rocksdb_writebatch_wi_put(wbi, "bar", 3, "b", 1);
|
||||||
|
rocksdb_writebatch_wi_delete(wbi, "foo", 3);
|
||||||
|
rocksdb_iterator_t* iter = rocksdb_writebatch_wi_create_iterator_with_base(wbi, base_iter);
|
||||||
|
CheckCondition(!rocksdb_iter_valid(iter));
|
||||||
|
rocksdb_iter_seek_to_first(iter);
|
||||||
|
CheckCondition(rocksdb_iter_valid(iter));
|
||||||
|
CheckIter(iter, "bar", "b");
|
||||||
|
rocksdb_iter_next(iter);
|
||||||
|
CheckIter(iter, "box", "c");
|
||||||
|
rocksdb_iter_prev(iter);
|
||||||
|
CheckIter(iter, "bar", "b");
|
||||||
|
rocksdb_iter_prev(iter);
|
||||||
|
CheckCondition(!rocksdb_iter_valid(iter));
|
||||||
|
rocksdb_iter_seek_to_last(iter);
|
||||||
|
CheckIter(iter, "box", "c");
|
||||||
|
rocksdb_iter_seek(iter, "b", 1);
|
||||||
|
CheckIter(iter, "bar", "b");
|
||||||
|
rocksdb_iter_seek_for_prev(iter, "c", 1);
|
||||||
|
CheckIter(iter, "box", "c");
|
||||||
|
rocksdb_iter_seek_for_prev(iter, "box", 3);
|
||||||
|
CheckIter(iter, "box", "c");
|
||||||
|
rocksdb_iter_get_error(iter, &err);
|
||||||
|
CheckNoError(err);
|
||||||
|
rocksdb_iter_destroy(iter);
|
||||||
|
rocksdb_writebatch_wi_destroy(wbi);
|
||||||
|
}
|
||||||
|
|
||||||
StartPhase("multiget");
|
StartPhase("multiget");
|
||||||
{
|
{
|
||||||
const char* keys[3] = { "box", "foo", "notfound" };
|
const char* keys[3] = { "box", "foo", "notfound" };
|
||||||
|
@ -102,6 +102,7 @@ typedef struct rocksdb_slicetransform_t rocksdb_slicetransform_t;
|
|||||||
typedef struct rocksdb_snapshot_t rocksdb_snapshot_t;
|
typedef struct rocksdb_snapshot_t rocksdb_snapshot_t;
|
||||||
typedef struct rocksdb_writablefile_t rocksdb_writablefile_t;
|
typedef struct rocksdb_writablefile_t rocksdb_writablefile_t;
|
||||||
typedef struct rocksdb_writebatch_t rocksdb_writebatch_t;
|
typedef struct rocksdb_writebatch_t rocksdb_writebatch_t;
|
||||||
|
typedef struct rocksdb_writebatch_wi_t rocksdb_writebatch_wi_t;
|
||||||
typedef struct rocksdb_writeoptions_t rocksdb_writeoptions_t;
|
typedef struct rocksdb_writeoptions_t rocksdb_writeoptions_t;
|
||||||
typedef struct rocksdb_universal_compaction_options_t rocksdb_universal_compaction_options_t;
|
typedef struct rocksdb_universal_compaction_options_t rocksdb_universal_compaction_options_t;
|
||||||
typedef struct rocksdb_livefiles_t rocksdb_livefiles_t;
|
typedef struct rocksdb_livefiles_t rocksdb_livefiles_t;
|
||||||
@ -457,6 +458,135 @@ extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_set_save_point(
|
|||||||
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_rollback_to_save_point(
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_rollback_to_save_point(
|
||||||
rocksdb_writebatch_t*, char** errptr);
|
rocksdb_writebatch_t*, char** errptr);
|
||||||
|
|
||||||
|
/* Write batch with index */
|
||||||
|
|
||||||
|
extern ROCKSDB_LIBRARY_API rocksdb_writebatch_wi_t* rocksdb_writebatch_wi_create(
|
||||||
|
size_t reserved_bytes,
|
||||||
|
unsigned char overwrite_keys);
|
||||||
|
extern ROCKSDB_LIBRARY_API rocksdb_writebatch_wi_t* rocksdb_writebatch_wi_create_from(
|
||||||
|
const char* rep, size_t size);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_destroy(
|
||||||
|
rocksdb_writebatch_wi_t*);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_clear(rocksdb_writebatch_wi_t*);
|
||||||
|
extern ROCKSDB_LIBRARY_API int rocksdb_writebatch_wi_count(rocksdb_writebatch_wi_t* b);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_put(rocksdb_writebatch_wi_t*,
|
||||||
|
const char* key,
|
||||||
|
size_t klen,
|
||||||
|
const char* val,
|
||||||
|
size_t vlen);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_put_cf(
|
||||||
|
rocksdb_writebatch_wi_t*, rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* key, size_t klen, const char* val, size_t vlen);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_putv(
|
||||||
|
rocksdb_writebatch_wi_t* b, int num_keys, const char* const* keys_list,
|
||||||
|
const size_t* keys_list_sizes, int num_values,
|
||||||
|
const char* const* values_list, const size_t* values_list_sizes);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_putv_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
|
||||||
|
int num_keys, const char* const* keys_list, const size_t* keys_list_sizes,
|
||||||
|
int num_values, const char* const* values_list,
|
||||||
|
const size_t* values_list_sizes);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_merge(rocksdb_writebatch_wi_t*,
|
||||||
|
const char* key,
|
||||||
|
size_t klen,
|
||||||
|
const char* val,
|
||||||
|
size_t vlen);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_merge_cf(
|
||||||
|
rocksdb_writebatch_wi_t*, rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* key, size_t klen, const char* val, size_t vlen);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_mergev(
|
||||||
|
rocksdb_writebatch_wi_t* b, int num_keys, const char* const* keys_list,
|
||||||
|
const size_t* keys_list_sizes, int num_values,
|
||||||
|
const char* const* values_list, const size_t* values_list_sizes);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_mergev_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
|
||||||
|
int num_keys, const char* const* keys_list, const size_t* keys_list_sizes,
|
||||||
|
int num_values, const char* const* values_list,
|
||||||
|
const size_t* values_list_sizes);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_delete(rocksdb_writebatch_wi_t*,
|
||||||
|
const char* key,
|
||||||
|
size_t klen);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_delete_cf(
|
||||||
|
rocksdb_writebatch_wi_t*, rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* key, size_t klen);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_deletev(
|
||||||
|
rocksdb_writebatch_wi_t* b, int num_keys, const char* const* keys_list,
|
||||||
|
const size_t* keys_list_sizes);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_deletev_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
|
||||||
|
int num_keys, const char* const* keys_list, const size_t* keys_list_sizes);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_delete_range(
|
||||||
|
rocksdb_writebatch_wi_t* b, const char* start_key, size_t start_key_len,
|
||||||
|
const char* end_key, size_t end_key_len);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_delete_range_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* start_key, size_t start_key_len, const char* end_key,
|
||||||
|
size_t end_key_len);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_delete_rangev(
|
||||||
|
rocksdb_writebatch_wi_t* b, int num_keys, const char* const* start_keys_list,
|
||||||
|
const size_t* start_keys_list_sizes, const char* const* end_keys_list,
|
||||||
|
const size_t* end_keys_list_sizes);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_delete_rangev_cf(
|
||||||
|
rocksdb_writebatch_wi_t* b, rocksdb_column_family_handle_t* column_family,
|
||||||
|
int num_keys, const char* const* start_keys_list,
|
||||||
|
const size_t* start_keys_list_sizes, const char* const* end_keys_list,
|
||||||
|
const size_t* end_keys_list_sizes);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_put_log_data(
|
||||||
|
rocksdb_writebatch_wi_t*, const char* blob, size_t len);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_iterate(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
void* state,
|
||||||
|
void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen),
|
||||||
|
void (*deleted)(void*, const char* k, size_t klen));
|
||||||
|
extern ROCKSDB_LIBRARY_API const char* rocksdb_writebatch_wi_data(
|
||||||
|
rocksdb_writebatch_wi_t* b,
|
||||||
|
size_t* size);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_set_save_point(
|
||||||
|
rocksdb_writebatch_wi_t*);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_rollback_to_save_point(
|
||||||
|
rocksdb_writebatch_wi_t*, char** errptr);
|
||||||
|
extern ROCKSDB_LIBRARY_API char* rocksdb_writebatch_wi_get_from_batch(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
const rocksdb_options_t* options,
|
||||||
|
const char* key, size_t keylen,
|
||||||
|
size_t* vallen,
|
||||||
|
char** errptr);
|
||||||
|
extern ROCKSDB_LIBRARY_API char* rocksdb_writebatch_wi_get_from_batch_cf(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
const rocksdb_options_t* options,
|
||||||
|
rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* key, size_t keylen,
|
||||||
|
size_t* vallen,
|
||||||
|
char** errptr);
|
||||||
|
extern ROCKSDB_LIBRARY_API char* rocksdb_writebatch_wi_get_from_batch_and_db(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
rocksdb_t* db,
|
||||||
|
const rocksdb_readoptions_t* options,
|
||||||
|
const char* key, size_t keylen,
|
||||||
|
size_t* vallen,
|
||||||
|
char** errptr);
|
||||||
|
extern ROCKSDB_LIBRARY_API char* rocksdb_writebatch_wi_get_from_batch_and_db_cf(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
rocksdb_t* db,
|
||||||
|
const rocksdb_readoptions_t* options,
|
||||||
|
rocksdb_column_family_handle_t* column_family,
|
||||||
|
const char* key, size_t keylen,
|
||||||
|
size_t* vallen,
|
||||||
|
char** errptr);
|
||||||
|
extern ROCKSDB_LIBRARY_API void rocksdb_write_writebatch_wi(
|
||||||
|
rocksdb_t* db,
|
||||||
|
const rocksdb_writeoptions_t* options,
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
char** errptr);
|
||||||
|
extern ROCKSDB_LIBRARY_API rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
rocksdb_iterator_t* base_iterator);
|
||||||
|
extern ROCKSDB_LIBRARY_API rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base_cf(
|
||||||
|
rocksdb_writebatch_wi_t* wbwi,
|
||||||
|
rocksdb_iterator_t* base_iterator,
|
||||||
|
rocksdb_column_family_handle_t* cf);
|
||||||
|
|
||||||
|
|
||||||
/* Block based table options */
|
/* Block based table options */
|
||||||
|
|
||||||
extern ROCKSDB_LIBRARY_API rocksdb_block_based_table_options_t*
|
extern ROCKSDB_LIBRARY_API rocksdb_block_based_table_options_t*
|
||||||
|
Loading…
Reference in New Issue
Block a user