Make writing to a DB a trait

master
David Greenberg 10 years ago
parent 57f490d8c6
commit f2c6fc5a27
  1. 1
      src/lib.rs
  2. 4
      src/main.rs
  3. 2
      src/merge_operator.rs
  4. 83
      src/rocksdb.rs

@ -34,6 +34,7 @@ pub use rocksdb::{
RocksDB, RocksDB,
RocksDBResult, RocksDBResult,
RocksDBVector, RocksDBVector,
Writable,
}; };
pub use rocksdb_options::{ pub use rocksdb_options::{
RocksDBOptions, RocksDBOptions,

@ -18,7 +18,7 @@
extern crate rocksdb; extern crate rocksdb;
extern crate test; extern crate test;
use rocksdb::{RocksDBOptions, RocksDB, MergeOperands, new_bloom_filter}; use rocksdb::{RocksDBOptions, RocksDB, MergeOperands, new_bloom_filter, Writable};
use rocksdb::RocksDBCompactionStyle::RocksDBUniversalCompaction; use rocksdb::RocksDBCompactionStyle::RocksDBUniversalCompaction;
fn main() { fn main() {
@ -88,7 +88,7 @@ mod tests {
use test::Bencher; use test::Bencher;
use std::thread::sleep_ms; use std::thread::sleep_ms;
use rocksdb::{RocksDBOptions, RocksDB, MergeOperands, new_bloom_filter}; use rocksdb::{RocksDBOptions, RocksDB, MergeOperands, new_bloom_filter, Writable};
use rocksdb::RocksDBCompactionStyle::RocksDBUniversalCompaction; use rocksdb::RocksDBCompactionStyle::RocksDBUniversalCompaction;
fn tuned_for_somebody_elses_disk() -> RocksDB { fn tuned_for_somebody_elses_disk() -> RocksDB {

@ -21,7 +21,7 @@ use std::ptr;
use std::slice; use std::slice;
use rocksdb_options::{RocksDBOptions}; use rocksdb_options::{RocksDBOptions};
use rocksdb::{RocksDB, RocksDBResult, RocksDBVector}; use rocksdb::{RocksDB, RocksDBResult, RocksDBVector, Writable};
pub struct MergeOperatorCallback { pub struct MergeOperatorCallback {
pub name: CString, pub name: CString,

@ -32,6 +32,17 @@ pub struct RocksDB {
inner: rocksdb_ffi::RocksDBInstance, inner: rocksdb_ffi::RocksDBInstance,
} }
pub struct WriteBatch {
inner: rocksdb_ffi::RocksDBWriteBatch
}
// This is for the RocksDB and write batches to share the same API
pub trait Writable {
fn put(&self, key: &[u8], value: &[u8]) -> Result<(), &str>;
fn merge(&self, key: &[u8], value: &[u8]) -> Result<(), &str>;
fn delete(&self, key: &[u8]) -> Result<(),&str>;
}
fn error_message<'a>(ptr: *const i8) -> &'a str { fn error_message<'a>(ptr: *const i8) -> &'a str {
unsafe { unsafe {
return from_utf8(CStr::from_ptr(ptr).to_bytes()).unwrap(); return from_utf8(CStr::from_ptr(ptr).to_bytes()).unwrap();
@ -117,33 +128,11 @@ impl RocksDB {
} }
} }
pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), &str> { ////pub fn create_writebatch(self) -> WriteBatch {
unsafe { //// WriteBatch(unsafe {
let writeopts = rocksdb_ffi::rocksdb_writeoptions_create(); //// rocksdb_ffi::rocksdb_writebatch_create()
let err = 0 as *mut i8; //// })
rocksdb_ffi::rocksdb_put(self.inner, writeopts, key.as_ptr(), ////}
key.len() as size_t, value.as_ptr(),
value.len() as size_t, err);
if !err.is_null() {
return Err(error_message(err));
}
return Ok(())
}
}
pub fn merge(&self, key: &[u8], value: &[u8]) -> Result<(), &str> {
unsafe {
let writeopts = rocksdb_ffi::rocksdb_writeoptions_create();
let err = 0 as *mut i8;
rocksdb_ffi::rocksdb_merge(self.inner, writeopts, key.as_ptr(),
key.len() as size_t, value.as_ptr(),
value.len() as size_t, err);
if !err.is_null() {
return Err(error_message(err));
}
return Ok(())
}
}
pub fn get(&self, key: &[u8]) -> RocksDBResult<RocksDBVector, &str> { pub fn get(&self, key: &[u8]) -> RocksDBResult<RocksDBVector, &str> {
unsafe { unsafe {
@ -172,12 +161,33 @@ impl RocksDB {
} }
} }
pub fn delete(&self, key: &[u8]) -> Result<(),&str> { pub fn close(&self) {
unsafe { rocksdb_ffi::rocksdb_close(self.inner); }
}
}
impl Writable for RocksDB {
fn put(&self, key: &[u8], value: &[u8]) -> Result<(), &str> {
unsafe {
let writeopts = rocksdb_ffi::rocksdb_writeoptions_create();
let err = 0 as *mut i8;
rocksdb_ffi::rocksdb_put(self.inner, writeopts, key.as_ptr(),
key.len() as size_t, value.as_ptr(),
value.len() as size_t, err);
if !err.is_null() {
return Err(error_message(err));
}
return Ok(())
}
}
fn merge(&self, key: &[u8], value: &[u8]) -> Result<(), &str> {
unsafe { unsafe {
let writeopts = rocksdb_ffi::rocksdb_writeoptions_create(); let writeopts = rocksdb_ffi::rocksdb_writeoptions_create();
let err = 0 as *mut i8; let err = 0 as *mut i8;
rocksdb_ffi::rocksdb_delete(self.inner, writeopts, key.as_ptr(), rocksdb_ffi::rocksdb_merge(self.inner, writeopts, key.as_ptr(),
key.len() as size_t, err); key.len() as size_t, value.as_ptr(),
value.len() as size_t, err);
if !err.is_null() { if !err.is_null() {
return Err(error_message(err)); return Err(error_message(err));
} }
@ -185,8 +195,17 @@ impl RocksDB {
} }
} }
pub fn close(&self) { fn delete(&self, key: &[u8]) -> Result<(),&str> {
unsafe { rocksdb_ffi::rocksdb_close(self.inner); } unsafe {
let writeopts = rocksdb_ffi::rocksdb_writeoptions_create();
let err = 0 as *mut i8;
rocksdb_ffi::rocksdb_delete(self.inner, writeopts, key.as_ptr(),
key.len() as size_t, err);
if !err.is_null() {
return Err(error_message(err));
}
return Ok(())
}
} }
} }

Loading…
Cancel
Save