From cc6e1433186b9de0f499e7d39726b6b6d3ff4224 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 25 Feb 2016 20:13:51 +0100 Subject: [PATCH 1/2] Changed ffi types to pointer for i686 compatibility --- src/ffi.rs | 83 ++++++++++++++++++++++-------------------- src/rocksdb.rs | 12 +++--- src/rocksdb_options.rs | 6 +-- 3 files changed, 52 insertions(+), 49 deletions(-) diff --git a/src/ffi.rs b/src/ffi.rs index c83302f..5f36276 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -17,45 +17,50 @@ use self::libc::{c_char, c_int, c_void, size_t}; use std::ffi::CStr; use std::str::from_utf8; -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBOptions(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBInstance(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBWriteOptions(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBReadOptions(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBMergeOperator(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBBlockBasedTableOptions(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBCache(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBFilterPolicy(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBSnapshot(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBIterator(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBCFHandle(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBWriteBatch(pub *const c_void); -#[derive(Copy, Clone)] -#[repr(C)] -pub struct DBComparator(pub *const c_void); +pub enum DBOptionsOpaque {} +pub type DBOptions = *const DBOptionsOpaque; + +pub enum DBInstanceOpaque {} +pub type DBInstance = *const DBInstanceOpaque; + +pub enum DBWriteOptionsOpaque {} +pub type DBWriteOptions = *const DBWriteOptionsOpaque; + +pub enum DBReadOptionsOpaque {} +pub type DBReadOptions = *const DBReadOptionsOpaque; + +pub enum DBMergeOperatorOpaque {} +pub type DBMergeOperator = *const DBMergeOperatorOpaque; + +pub enum DBBlockBasedTableOptionsOpaque {} +pub type DBBlockBasedTableOptions = *const DBBlockBasedTableOptionsOpaque; + +pub enum DBCacheOpaque {} +pub type DBCache = *const DBCacheOpaque; + +pub enum DBFilterPolicyOpaque {} +pub type DBFilterPolicy = *const DBFilterPolicyOpaque; + +pub enum DBSnapshotOpaque {} +pub type DBSnapshot = *const DBSnapshotOpaque; + +pub enum DBIteratorOpaque {} +pub type DBIterator = *const DBIteratorOpaque; + +pub enum DBCFHandleOpaque {} +pub type DBCFHandle = *const DBCFHandleOpaque; + +pub enum DBWriteBatchOpaque {} +pub type DBWriteBatch = *const DBWriteBatchOpaque; + +pub enum DBComparatorOpaque {} +pub type DBComparator = *const DBComparatorOpaque; + +pub enum DBSliceTransformOpaque {} +pub type DBSliceTransform = *const DBSliceTransformOpaque; + +pub const BLOCK_BASED_INDEX_TYPE_BINARY_SEARCH: c_int = 0; +pub const BLOCK_BASED_INDEX_TYPE_HASH_SEARCH: c_int = 1; pub fn new_bloom_filter(bits: c_int) -> DBFilterPolicy { unsafe { rocksdb_filterpolicy_create_bloom(bits) } diff --git a/src/rocksdb.rs b/src/rocksdb.rs index 70167a3..ffd513c 100644 --- a/src/rocksdb.rs +++ b/src/rocksdb.rs @@ -23,7 +23,7 @@ use std::path::Path; use std::slice; use std::str::from_utf8; -use self::libc::{c_void, size_t}; +use self::libc::size_t; use rocksdb_ffi::{self, DBCFHandle, error_message}; use rocksdb_options::{Options, WriteOptions}; @@ -317,7 +317,7 @@ impl DB { // These handles will be populated by DB. let cfhandles: Vec = cfs_v.iter() - .map(|_| rocksdb_ffi::DBCFHandle(0 as *mut c_void)) + .map(|_| 0 as rocksdb_ffi::DBCFHandle) .collect(); // TODO(tyler) allow options to be passed in. @@ -338,7 +338,7 @@ impl DB { } for handle in cfhandles.iter() { - if handle.0.is_null() { + if handle.is_null() { return Err("Received null column family handle from DB." .to_string()); } @@ -352,7 +352,7 @@ impl DB { if !err.is_null() { return Err(error_message(err)); } - if db.0.is_null() { + if db.is_null() { return Err("Could not initialize database.".to_string()); } @@ -422,7 +422,7 @@ impl DB { key: &[u8], readopts: &ReadOptions) -> Result, String> { - if readopts.inner.0.is_null() { + if readopts.inner.is_null() { return Err("Unable to create rocksdb read options. This is a \ fairly trivial call, and its failure may be \ indicative of a mis-compiled or mis-loaded rocksdb \ @@ -461,7 +461,7 @@ impl DB { key: &[u8], readopts: &ReadOptions) -> Result, String> { - if readopts.inner.0.is_null() { + if readopts.inner.is_null() { return Err("Unable to create rocksdb read options. This is a \ fairly trivial call, and its failure may be \ indicative of a mis-compiled or mis-loaded rocksdb \ diff --git a/src/rocksdb_options.rs b/src/rocksdb_options.rs index 35d9f6d..176afda 100644 --- a/src/rocksdb_options.rs +++ b/src/rocksdb_options.rs @@ -63,8 +63,7 @@ impl BlockBasedOptions { let block_opts = unsafe { rocksdb_ffi::rocksdb_block_based_options_create() }; - let rocksdb_ffi::DBBlockBasedTableOptions(opt_ptr) = block_opts; - if opt_ptr.is_null() { + if block_opts.is_null() { panic!("Could not create rocksdb block based options".to_string()); } BlockBasedOptions { inner: block_opts } @@ -106,8 +105,7 @@ impl Options { pub fn new() -> Options { unsafe { let opts = rocksdb_ffi::rocksdb_options_create(); - let rocksdb_ffi::DBOptions(opt_ptr) = opts; - if opt_ptr.is_null() { + if opts.is_null() { panic!("Could not create rocksdb options".to_string()); } Options { inner: opts } From 740f3735d04d179b29f47c4f7169f9a004dd67a3 Mon Sep 17 00:00:00 2001 From: Tyler Neely Date: Sun, 1 May 2016 16:42:36 -0700 Subject: [PATCH 2/2] touchups to make arkpar's backport work --- src/ffi.rs | 6 +++--- src/rocksdb_options.rs | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/ffi.rs b/src/ffi.rs index 5f36276..c8f5777 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -422,7 +422,7 @@ fn internal() { unsafe { use std::ffi::CString; let opts = rocksdb_options_create(); - assert!(!opts.0.is_null()); + assert!(!opts.is_null()); rocksdb_options_increase_parallelism(opts, 0); rocksdb_options_optimize_level_style_compaction(opts, 0); @@ -441,7 +441,7 @@ fn internal() { assert!(err.is_null()); let writeopts = rocksdb_writeoptions_create(); - assert!(!writeopts.0.is_null()); + assert!(!writeopts.is_null()); let key = b"name\x00"; let val = b"spacejam\x00"; @@ -456,7 +456,7 @@ fn internal() { assert!(err.is_null()); let readopts = rocksdb_readoptions_create(); - assert!(!readopts.0.is_null()); + assert!(!readopts.is_null()); let val_len: size_t = 0; let val_len_ptr = &val_len as *const size_t; diff --git a/src/rocksdb_options.rs b/src/rocksdb_options.rs index 176afda..6a801d3 100644 --- a/src/rocksdb_options.rs +++ b/src/rocksdb_options.rs @@ -329,8 +329,7 @@ impl Options { impl WriteOptions { pub fn new() -> WriteOptions { let write_opts = unsafe { rocksdb_ffi::rocksdb_writeoptions_create() }; - let rocksdb_ffi::DBWriteOptions(opt_ptr) = write_opts; - if opt_ptr.is_null() { + if write_opts.is_null() { panic!("Could not create rocksdb write options".to_string()); } WriteOptions { inner: write_opts }