Commit 1c921cc9 authored by zhangjinpeng1987's avatar zhangjinpeng1987 Committed by siddontang

add single delete (#76)

parent 3633152c
...@@ -683,6 +683,24 @@ void crocksdb_delete_cf( ...@@ -683,6 +683,24 @@ void crocksdb_delete_cf(
Slice(key, keylen))); Slice(key, keylen)));
} }
void crocksdb_single_delete(
crocksdb_t* db,
const crocksdb_writeoptions_t* options,
const char* key, size_t keylen,
char** errptr) {
SaveError(errptr, db->rep->SingleDelete(options->rep, Slice(key, keylen)));
}
void crocksdb_single_delete_cf(
crocksdb_t* db,
const crocksdb_writeoptions_t* options,
crocksdb_column_family_handle_t* column_family,
const char* key, size_t keylen,
char** errptr) {
SaveError(errptr, db->rep->SingleDelete(options->rep, column_family->rep,
Slice(key, keylen)));
}
void crocksdb_merge( void crocksdb_merge(
crocksdb_t* db, crocksdb_t* db,
const crocksdb_writeoptions_t* options, const crocksdb_writeoptions_t* options,
...@@ -1218,6 +1236,19 @@ void crocksdb_writebatch_delete_cf( ...@@ -1218,6 +1236,19 @@ void crocksdb_writebatch_delete_cf(
b->rep.Delete(column_family->rep, Slice(key, klen)); b->rep.Delete(column_family->rep, Slice(key, klen));
} }
void crocksdb_writebatch_single_delete(
crocksdb_writebatch_t* b,
const char* key, size_t klen) {
b->rep.SingleDelete(Slice(key, klen));
}
void crocksdb_writebatch_single_delete_cf(
crocksdb_writebatch_t* b,
crocksdb_column_family_handle_t* column_family,
const char* key, size_t klen) {
b->rep.SingleDelete(column_family->rep, Slice(key, klen));
}
void crocksdb_writebatch_deletev( void crocksdb_writebatch_deletev(
crocksdb_writebatch_t* b, crocksdb_writebatch_t* b,
int num_keys, const char* const* keys_list, int num_keys, const char* const* keys_list,
......
...@@ -220,6 +220,15 @@ extern C_ROCKSDB_LIBRARY_API void crocksdb_delete_cf( ...@@ -220,6 +220,15 @@ extern C_ROCKSDB_LIBRARY_API void crocksdb_delete_cf(
crocksdb_column_family_handle_t* column_family, const char* key, crocksdb_column_family_handle_t* column_family, const char* key,
size_t keylen, char** errptr); size_t keylen, char** errptr);
extern C_ROCKSDB_LIBRARY_API void crocksdb_single_delete(
crocksdb_t* db, const crocksdb_writeoptions_t* options, const char* key,
size_t keylen, char** errptr);
extern C_ROCKSDB_LIBRARY_API void crocksdb_single_delete_cf(
crocksdb_t* db, const crocksdb_writeoptions_t* options,
crocksdb_column_family_handle_t* column_family, const char* key,
size_t keylen, char** errptr);
extern C_ROCKSDB_LIBRARY_API void crocksdb_merge( extern C_ROCKSDB_LIBRARY_API void crocksdb_merge(
crocksdb_t* db, const crocksdb_writeoptions_t* options, const char* key, crocksdb_t* db, const crocksdb_writeoptions_t* options, const char* key,
size_t keylen, const char* val, size_t vallen, char** errptr); size_t keylen, const char* val, size_t vallen, char** errptr);
...@@ -418,6 +427,12 @@ extern C_ROCKSDB_LIBRARY_API void crocksdb_writebatch_delete(crocksdb_writebatch ...@@ -418,6 +427,12 @@ extern C_ROCKSDB_LIBRARY_API void crocksdb_writebatch_delete(crocksdb_writebatch
extern C_ROCKSDB_LIBRARY_API void crocksdb_writebatch_delete_cf( extern C_ROCKSDB_LIBRARY_API void crocksdb_writebatch_delete_cf(
crocksdb_writebatch_t*, crocksdb_column_family_handle_t* column_family, crocksdb_writebatch_t*, crocksdb_column_family_handle_t* column_family,
const char* key, size_t klen); const char* key, size_t klen);
extern C_ROCKSDB_LIBRARY_API void crocksdb_writebatch_single_delete(crocksdb_writebatch_t*,
const char* key,
size_t klen);
extern C_ROCKSDB_LIBRARY_API void crocksdb_writebatch_single_delete_cf(
crocksdb_writebatch_t*, crocksdb_column_family_handle_t* column_family,
const char* key, size_t klen);
extern C_ROCKSDB_LIBRARY_API void crocksdb_writebatch_deletev( extern C_ROCKSDB_LIBRARY_API void crocksdb_writebatch_deletev(
crocksdb_writebatch_t* b, int num_keys, const char* const* keys_list, crocksdb_writebatch_t* b, int num_keys, const char* const* keys_list,
const size_t* keys_list_sizes); const size_t* keys_list_sizes);
......
...@@ -269,6 +269,17 @@ extern "C" { ...@@ -269,6 +269,17 @@ extern "C" {
k: *const u8, k: *const u8,
kLen: size_t, kLen: size_t,
err: *mut *mut c_char); err: *mut *mut c_char);
pub fn crocksdb_single_delete(db: *mut DBInstance,
writeopts: *const DBWriteOptions,
k: *const u8,
kLen: size_t,
err: *mut *mut c_char);
pub fn crocksdb_single_delete_cf(db: *mut DBInstance,
writeopts: *const DBWriteOptions,
cf: *mut DBCFHandle,
k: *const u8,
kLen: size_t,
err: *mut *mut c_char);
pub fn crocksdb_close(db: *mut DBInstance); pub fn crocksdb_close(db: *mut DBInstance);
pub fn crocksdb_destroy_db(options: *const DBOptions, pub fn crocksdb_destroy_db(options: *const DBOptions,
path: *const c_char, path: *const c_char,
...@@ -368,6 +379,13 @@ extern "C" { ...@@ -368,6 +379,13 @@ extern "C" {
cf: *mut DBCFHandle, cf: *mut DBCFHandle,
key: *const u8, key: *const u8,
klen: size_t); klen: size_t);
pub fn crocksdb_writebatch_single_delete(batch: *mut DBWriteBatch,
key: *const u8,
klen: size_t);
pub fn crocksdb_writebatch_single_delete_cf(batch: *mut DBWriteBatch,
cf: *mut DBCFHandle,
key: *const u8,
klen: size_t);
pub fn crocksdb_writebatch_iterate(batch: *mut DBWriteBatch, pub fn crocksdb_writebatch_iterate(batch: *mut DBWriteBatch,
state: *mut c_void, state: *mut c_void,
put_fn: extern "C" fn(state: *mut c_void, put_fn: extern "C" fn(state: *mut c_void,
......
...@@ -257,6 +257,8 @@ pub trait Writable { ...@@ -257,6 +257,8 @@ pub trait Writable {
fn merge_cf(&self, cf: &CFHandle, key: &[u8], value: &[u8]) -> Result<(), String>; fn merge_cf(&self, cf: &CFHandle, key: &[u8], value: &[u8]) -> Result<(), String>;
fn delete(&self, key: &[u8]) -> Result<(), String>; fn delete(&self, key: &[u8]) -> Result<(), String>;
fn delete_cf(&self, cf: &CFHandle, key: &[u8]) -> Result<(), String>; fn delete_cf(&self, cf: &CFHandle, key: &[u8]) -> Result<(), String>;
fn single_delete(&self, key: &[u8]) -> Result<(), String>;
fn single_delete_cf(&self, cf: &CFHandle, key: &[u8]) -> Result<(), String>;
} }
/// A range of keys, `start_key` is included, but not `end_key`. /// A range of keys, `start_key` is included, but not `end_key`.
...@@ -650,6 +652,31 @@ impl DB { ...@@ -650,6 +652,31 @@ impl DB {
} }
} }
fn single_delete_opt(&self, key: &[u8], writeopts: &WriteOptions) -> Result<(), String> {
unsafe {
ffi_try!(crocksdb_single_delete(self.inner,
writeopts.inner,
key.as_ptr(),
key.len() as size_t));
Ok(())
}
}
fn single_delete_cf_opt(&self,
cf: &CFHandle,
key: &[u8],
writeopts: &WriteOptions)
-> Result<(), String> {
unsafe {
ffi_try!(crocksdb_single_delete_cf(self.inner,
writeopts.inner,
cf.inner,
key.as_ptr(),
key.len() as size_t));
Ok(())
}
}
/// Flush all memtable data. /// Flush all memtable data.
/// ///
/// Due to lack of abi, only default cf is supported. /// Due to lack of abi, only default cf is supported.
...@@ -892,6 +919,14 @@ impl Writable for DB { ...@@ -892,6 +919,14 @@ impl Writable for DB {
fn delete_cf(&self, cf: &CFHandle, key: &[u8]) -> Result<(), String> { fn delete_cf(&self, cf: &CFHandle, key: &[u8]) -> Result<(), String> {
self.delete_cf_opt(cf, key, &WriteOptions::new()) self.delete_cf_opt(cf, key, &WriteOptions::new())
} }
fn single_delete(&self, key: &[u8]) -> Result<(), String> {
self.single_delete_opt(key, &WriteOptions::new())
}
fn single_delete_cf(&self, cf: &CFHandle, key: &[u8]) -> Result<(), String> {
self.single_delete_cf_opt(cf, key, &WriteOptions::new())
}
} }
impl Default for WriteBatch { impl Default for WriteBatch {
...@@ -1006,6 +1041,25 @@ impl Writable for WriteBatch { ...@@ -1006,6 +1041,25 @@ impl Writable for WriteBatch {
Ok(()) Ok(())
} }
} }
fn single_delete(&self, key: &[u8]) -> Result<(), String> {
unsafe {
crocksdb_ffi::crocksdb_writebatch_single_delete(self.inner,
key.as_ptr(),
key.len() as size_t);
Ok(())
}
}
fn single_delete_cf(&self, cf: &CFHandle, key: &[u8]) -> Result<(), String> {
unsafe {
crocksdb_ffi::crocksdb_writebatch_single_delete_cf(self.inner,
cf.inner,
key.as_ptr(),
key.len() as size_t);
Ok(())
}
}
} }
pub struct DBVector { pub struct DBVector {
...@@ -1288,6 +1342,41 @@ mod test { ...@@ -1288,6 +1342,41 @@ mod test {
assert!(name.to_str().unwrap().find("LOG").is_none()); assert!(name.to_str().unwrap().find("LOG").is_none());
} }
} }
#[test]
fn single_delete_test() {
let path = TempDir::new("_rust_rocksdb_singledeletetest").expect("");
let db = DB::open_default(path.path().to_str().unwrap()).unwrap();
db.put(b"a", b"v1").unwrap();
let a = db.get(b"a");
assert_eq!(a.unwrap().unwrap().to_utf8().unwrap(), "v1");
db.single_delete(b"a").unwrap();
let a = db.get(b"a");
assert!(a.unwrap().is_none());
db.put(b"a", b"v2").unwrap();
let a = db.get(b"a");
assert_eq!(a.unwrap().unwrap().to_utf8().unwrap(), "v2");
db.single_delete(b"a").unwrap();
let a = db.get(b"a");
assert!(a.unwrap().is_none());
let cf_handle = db.cf_handle("default").unwrap();
db.put_cf(cf_handle, b"a", b"v3").unwrap();
let a = db.get_cf(cf_handle, b"a");
assert_eq!(a.unwrap().unwrap().to_utf8().unwrap(), "v3");
db.single_delete_cf(cf_handle, b"a").unwrap();
let a = db.get_cf(cf_handle, b"a");
assert!(a.unwrap().is_none());
db.put_cf(cf_handle, b"a", b"v4").unwrap();
let a = db.get_cf(cf_handle, b"a");
assert_eq!(a.unwrap().unwrap().to_utf8().unwrap(), "v4");
db.single_delete_cf(cf_handle, b"a").unwrap();
let a = db.get_cf(cf_handle, b"a");
assert!(a.unwrap().is_none());
}
} }
#[test] #[test]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment