diff --git a/heed/src/cursor.rs b/heed/src/cursor.rs index b5d81e6d..c06986bf 100644 --- a/heed/src/cursor.rs +++ b/heed/src/cursor.rs @@ -1,4 +1,5 @@ use std::ops::{Deref, DerefMut}; +use std::ptr::NonNull; use std::{marker, mem, ptr}; use crate::mdb::error::mdb_result; @@ -6,7 +7,7 @@ use crate::mdb::ffi; use crate::*; pub struct RoCursor<'txn> { - cursor: *mut ffi::MDB_cursor, + cursor: NonNull, _marker: marker::PhantomData<&'txn ()>, } @@ -15,7 +16,7 @@ impl<'txn> RoCursor<'txn> { let mut cursor: *mut ffi::MDB_cursor = ptr::null_mut(); let mut txn = txn.txn_ptr(); unsafe { mdb_result(ffi::mdb_cursor_open(txn.as_mut(), dbi, &mut cursor))? } - Ok(RoCursor { cursor, _marker: marker::PhantomData }) + Ok(RoCursor { cursor: NonNull::new(cursor).unwrap(), _marker: marker::PhantomData }) } pub fn current(&mut self) -> Result> { @@ -25,7 +26,7 @@ impl<'txn> RoCursor<'txn> { // Move the cursor on the first database key let result = unsafe { mdb_result(ffi::mdb_cursor_get( - self.cursor, + self.cursor.as_mut(), key_val.as_mut_ptr(), data_val.as_mut_ptr(), ffi::cursor_op::MDB_GET_CURRENT, @@ -52,7 +53,7 @@ impl<'txn> RoCursor<'txn> { MoveOperation::Dup => { unsafe { mdb_result(ffi::mdb_cursor_get( - self.cursor, + self.cursor.as_mut(), ptr::null_mut(), &mut ffi::MDB_val { mv_size: 0, mv_data: ptr::null_mut() }, ffi::cursor_op::MDB_FIRST_DUP, @@ -66,7 +67,7 @@ impl<'txn> RoCursor<'txn> { // Move the cursor on the first database key let result = unsafe { mdb_result(ffi::mdb_cursor_get( - self.cursor, + self.cursor.as_mut(), key_val.as_mut_ptr(), data_val.as_mut_ptr(), flag, @@ -93,7 +94,7 @@ impl<'txn> RoCursor<'txn> { MoveOperation::Dup => { unsafe { mdb_result(ffi::mdb_cursor_get( - self.cursor, + self.cursor.as_mut(), ptr::null_mut(), &mut ffi::MDB_val { mv_size: 0, mv_data: ptr::null_mut() }, ffi::cursor_op::MDB_LAST_DUP, @@ -107,7 +108,7 @@ impl<'txn> RoCursor<'txn> { // Move the cursor on the first database key let result = unsafe { mdb_result(ffi::mdb_cursor_get( - self.cursor, + self.cursor.as_mut(), key_val.as_mut_ptr(), data_val.as_mut_ptr(), flag, @@ -131,7 +132,7 @@ impl<'txn> RoCursor<'txn> { // Move the cursor to the specified key let result = unsafe { mdb_result(ffi::mdb_cursor_get( - self.cursor, + self.cursor.as_mut(), &mut key_val, &mut ffi::MDB_val { mv_size: 0, mv_data: ptr::null_mut() }, ffi::cursor_op::MDB_SET, @@ -155,7 +156,7 @@ impl<'txn> RoCursor<'txn> { // Move the cursor to the specified key let result = unsafe { mdb_result(ffi::mdb_cursor_get( - self.cursor, + self.cursor.as_mut(), &mut key_val, data_val.as_mut_ptr(), ffi::cursor_op::MDB_SET_RANGE, @@ -186,7 +187,7 @@ impl<'txn> RoCursor<'txn> { // Move the cursor to the previous non-dup key let result = unsafe { mdb_result(ffi::mdb_cursor_get( - self.cursor, + self.cursor.as_mut(), key_val.as_mut_ptr(), data_val.as_mut_ptr(), flag, @@ -217,7 +218,7 @@ impl<'txn> RoCursor<'txn> { // Move the cursor to the next non-dup key let result = unsafe { mdb_result(ffi::mdb_cursor_get( - self.cursor, + self.cursor.as_mut(), key_val.as_mut_ptr(), data_val.as_mut_ptr(), flag, @@ -238,10 +239,12 @@ impl<'txn> RoCursor<'txn> { impl Drop for RoCursor<'_> { fn drop(&mut self) { - unsafe { ffi::mdb_cursor_close(self.cursor) } + unsafe { ffi::mdb_cursor_close(self.cursor.as_mut()) } } } +unsafe impl Send for RoCursor<'_> {} + pub struct RwCursor<'txn> { cursor: RoCursor<'txn>, } @@ -266,7 +269,7 @@ impl<'txn> RwCursor<'txn> { /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html pub unsafe fn del_current(&mut self) -> Result { // Delete the current entry - let result = mdb_result(ffi::mdb_cursor_del(self.cursor.cursor, 0)); + let result = mdb_result(ffi::mdb_cursor_del(self.cursor.cursor.as_mut(), 0)); match result { Ok(()) => Ok(true), @@ -304,7 +307,7 @@ impl<'txn> RwCursor<'txn> { // Modify the pointed data let result = mdb_result(ffi::mdb_cursor_put( - self.cursor.cursor, + self.cursor.cursor.as_mut(), &mut key_val, &mut data_val, ffi::MDB_CURRENT, @@ -344,8 +347,12 @@ impl<'txn> RwCursor<'txn> { let mut reserved = ffi::reserve_size_val(data_size); let flags = ffi::MDB_RESERVE | flags.bits(); - let result = - mdb_result(ffi::mdb_cursor_put(self.cursor.cursor, &mut key_val, &mut reserved, flags)); + let result = mdb_result(ffi::mdb_cursor_put( + self.cursor.cursor.as_mut(), + &mut key_val, + &mut reserved, + flags, + )); let found = match result { Ok(()) => true, @@ -392,7 +399,7 @@ impl<'txn> RwCursor<'txn> { // Modify the pointed data let result = mdb_result(ffi::mdb_cursor_put( - self.cursor.cursor, + self.cursor.cursor.as_mut(), &mut key_val, &mut data_val, flags.bits(),