diff --git a/db/c.cc b/db/c.cc index 219f65094..78b8bcd54 100644 --- a/db/c.cc +++ b/db/c.cc @@ -607,6 +607,13 @@ rocksdb_writebatch_t* rocksdb_writebatch_create() { return new rocksdb_writebatch_t; } +rocksdb_writebatch_t* rocksdb_writebatch_create_from(const char* rep, + size_t size) { + rocksdb_writebatch_t* b = new rocksdb_writebatch_t; + b->rep = WriteBatch(std::string(rep, size)); + return b; +} + void rocksdb_writebatch_destroy(rocksdb_writebatch_t* b) { delete b; } diff --git a/db/c_test.c b/db/c_test.c index 5220cd8a3..3ab47541a 100644 --- a/db/c_test.c +++ b/db/c_test.c @@ -299,6 +299,24 @@ int main(int argc, char** argv) { rocksdb_writebatch_destroy(wb); } + StartPhase("writebatch_rep"); + { + rocksdb_writebatch_t* wb1 = rocksdb_writebatch_create(); + rocksdb_writebatch_put(wb1, "baz", 3, "d", 1); + rocksdb_writebatch_put(wb1, "quux", 4, "e", 1); + rocksdb_writebatch_delete(wb1, "quux", 4); + size_t repsize1 = 0; + const char* rep = rocksdb_writebatch_data(wb1, &repsize1); + rocksdb_writebatch_t* wb2 = rocksdb_writebatch_create_from(rep, repsize1); + CheckCondition(rocksdb_writebatch_count(wb1) == + rocksdb_writebatch_count(wb2)); + size_t repsize2 = 0; + CheckCondition( + memcmp(rep, rocksdb_writebatch_data(wb2, &repsize2), repsize1) == 0); + rocksdb_writebatch_destroy(wb1); + rocksdb_writebatch_destroy(wb2); + } + StartPhase("iter"); { rocksdb_iterator_t* iter = rocksdb_create_iterator(db, roptions); diff --git a/include/rocksdb/c.h b/include/rocksdb/c.h index c7d9f7782..6420c0eab 100644 --- a/include/rocksdb/c.h +++ b/include/rocksdb/c.h @@ -205,6 +205,8 @@ extern void rocksdb_iter_get_error(const rocksdb_iterator_t*, char** errptr); /* Write batch */ extern rocksdb_writebatch_t* rocksdb_writebatch_create(); +extern rocksdb_writebatch_t* rocksdb_writebatch_create_from(const char* rep, + size_t size); extern void rocksdb_writebatch_destroy(rocksdb_writebatch_t*); extern void rocksdb_writebatch_clear(rocksdb_writebatch_t*); extern int rocksdb_writebatch_count(rocksdb_writebatch_t*);