use std::ptr::NonNull;
use std::sync::Arc;
use libc::c_int;
use crate::ffi;
pub struct TransactionOptions {
pub(crate) inner: *mut ffi::rocksdb_transaction_options_t,
}
unsafe impl Send for TransactionOptions {}
unsafe impl Sync for TransactionOptions {}
impl Default for TransactionOptions {
fn default() -> Self {
let txn_opts = unsafe { ffi::rocksdb_transaction_options_create() };
assert!(
!txn_opts.is_null(),
"Could not create RocksDB transaction options"
);
Self { inner: txn_opts }
}
}
impl TransactionOptions {
pub fn new() -> TransactionOptions {
TransactionOptions::default()
}
pub fn set_skip_prepare(&mut self, skip_prepare: bool) {
unsafe {
ffi::rocksdb_transaction_options_set_skip_prepare(self.inner, u8::from(skip_prepare));
}
}
pub fn set_snapshot(&mut self, snapshot: bool) {
unsafe {
ffi::rocksdb_transaction_options_set_set_snapshot(self.inner, u8::from(snapshot));
}
}
pub fn set_deadlock_detect(&mut self, deadlock_detect: bool) {
unsafe {
ffi::rocksdb_transaction_options_set_deadlock_detect(
self.inner,
u8::from(deadlock_detect),
);
}
}
pub fn set_lock_timeout(&mut self, lock_timeout: i64) {
unsafe {
ffi::rocksdb_transaction_options_set_lock_timeout(self.inner, lock_timeout);
}
}
pub fn set_expiration(&mut self, expiration: i64) {
unsafe {
ffi::rocksdb_transaction_options_set_expiration(self.inner, expiration);
}
}
pub fn set_deadlock_detect_depth(&mut self, depth: i64) {
unsafe {
ffi::rocksdb_transaction_options_set_deadlock_detect_depth(self.inner, depth);
}
}
pub fn set_max_write_batch_size(&mut self, size: usize) {
unsafe {
ffi::rocksdb_transaction_options_set_max_write_batch_size(self.inner, size);
}
}
pub fn set_commit_bypass_memtable(&mut self, val: bool) {
unsafe {
ffi::rocksdb_transaction_options_set_commit_bypass_memtable(self.inner, u8::from(val));
}
}
pub fn get_commit_bypass_memtable(&self) -> bool {
unsafe { ffi::rocksdb_transaction_options_get_commit_bypass_memtable(self.inner) != 0 }
}
pub fn get_deadlock_detect(&self) -> bool {
unsafe { ffi::rocksdb_transaction_options_get_deadlock_detect(self.inner) != 0 }
}
pub fn set_large_txn_commit_optimize_byte_threshold(&mut self, val: u64) {
unsafe {
ffi::rocksdb_transaction_options_set_large_txn_commit_optimize_byte_threshold(
self.inner, val,
);
}
}
pub fn get_large_txn_commit_optimize_byte_threshold(&self) -> u64 {
unsafe {
ffi::rocksdb_transaction_options_get_large_txn_commit_optimize_byte_threshold(
self.inner,
)
}
}
pub fn set_large_txn_commit_optimize_threshold(&mut self, val: u32) {
unsafe {
ffi::rocksdb_transaction_options_set_large_txn_commit_optimize_threshold(
self.inner, val,
);
}
}
pub fn get_large_txn_commit_optimize_threshold(&self) -> u32 {
unsafe {
ffi::rocksdb_transaction_options_get_large_txn_commit_optimize_threshold(self.inner)
}
}
pub fn get_max_write_batch_size(&self) -> usize {
unsafe { ffi::rocksdb_transaction_options_get_max_write_batch_size(self.inner) }
}
pub fn get_set_snapshot(&self) -> bool {
unsafe { ffi::rocksdb_transaction_options_get_set_snapshot(self.inner) != 0 }
}
pub fn set_skip_concurrency_control(&mut self, val: bool) {
unsafe {
ffi::rocksdb_transaction_options_set_skip_concurrency_control(
self.inner,
u8::from(val),
);
}
}
pub fn get_skip_concurrency_control(&self) -> bool {
unsafe { ffi::rocksdb_transaction_options_get_skip_concurrency_control(self.inner) != 0 }
}
pub fn get_skip_prepare(&self) -> bool {
unsafe { ffi::rocksdb_transaction_options_get_skip_prepare(self.inner) != 0 }
}
pub fn set_use_only_the_last_commit_time_batch_for_recovery(&mut self, val: bool) {
unsafe {
ffi::rocksdb_transaction_options_set_use_only_the_last_commit_time_batch_for_recovery(
self.inner,
u8::from(val),
);
}
}
pub fn get_use_only_the_last_commit_time_batch_for_recovery(&self) -> bool {
unsafe {
ffi::rocksdb_transaction_options_get_use_only_the_last_commit_time_batch_for_recovery(
self.inner,
) != 0
}
}
pub fn set_write_batch_track_timestamp_size(&mut self, val: bool) {
unsafe {
ffi::rocksdb_transaction_options_set_write_batch_track_timestamp_size(
self.inner,
u8::from(val),
);
}
}
pub fn get_write_batch_track_timestamp_size(&self) -> bool {
unsafe {
ffi::rocksdb_transaction_options_get_write_batch_track_timestamp_size(self.inner) != 0
}
}
pub fn get_deadlock_detect_depth(&self) -> i64 {
unsafe { ffi::rocksdb_transaction_options_get_deadlock_detect_depth(self.inner) }
}
pub fn get_deadlock_timeout_us(&self) -> i64 {
unsafe { ffi::rocksdb_transaction_options_get_deadlock_timeout_us(self.inner) }
}
pub fn get_expiration(&self) -> i64 {
unsafe { ffi::rocksdb_transaction_options_get_expiration(self.inner) }
}
pub fn get_lock_timeout(&self) -> i64 {
unsafe { ffi::rocksdb_transaction_options_get_lock_timeout(self.inner) }
}
pub fn get_write_batch_flush_threshold(&self) -> i64 {
unsafe { ffi::rocksdb_transaction_options_get_write_batch_flush_threshold(self.inner) }
}
pub fn set_deadlock_timeout_us(&mut self, val: i64) {
unsafe {
ffi::rocksdb_transaction_options_set_deadlock_timeout_us(self.inner, val);
}
}
pub fn set_write_batch_flush_threshold(&mut self, val: i64) {
unsafe {
ffi::rocksdb_transaction_options_set_write_batch_flush_threshold(self.inner, val);
}
}
}
impl Drop for TransactionOptions {
fn drop(&mut self) {
unsafe {
ffi::rocksdb_transaction_options_destroy(self.inner);
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]
pub enum TxnDBWritePolicy {
WriteCommitted = ffi::rocksdb_txndb_write_policy_write_committed as isize,
WritePrepared = ffi::rocksdb_txndb_write_policy_write_prepared as isize,
WriteUnprepared = ffi::rocksdb_txndb_write_policy_write_unprepared as isize,
}
impl TxnDBWritePolicy {
pub(crate) fn try_from_raw(raw: c_int) -> Option<Self> {
match raw {
n if n == TxnDBWritePolicy::WriteCommitted as c_int => {
Some(TxnDBWritePolicy::WriteCommitted)
}
n if n == TxnDBWritePolicy::WritePrepared as c_int => {
Some(TxnDBWritePolicy::WritePrepared)
}
n if n == TxnDBWritePolicy::WriteUnprepared as c_int => {
Some(TxnDBWritePolicy::WriteUnprepared)
}
_ => None,
}
}
}
pub struct TransactionDBOptions {
pub(crate) inner: *mut ffi::rocksdb_transactiondb_options_t,
}
unsafe impl Send for TransactionDBOptions {}
unsafe impl Sync for TransactionDBOptions {}
impl Default for TransactionDBOptions {
fn default() -> Self {
let txn_db_opts = unsafe { ffi::rocksdb_transactiondb_options_create() };
assert!(
!txn_db_opts.is_null(),
"Could not create RocksDB transaction_db options"
);
Self { inner: txn_db_opts }
}
}
impl TransactionDBOptions {
pub fn new() -> TransactionDBOptions {
TransactionDBOptions::default()
}
pub fn set_default_lock_timeout(&mut self, default_lock_timeout: i64) {
unsafe {
ffi::rocksdb_transactiondb_options_set_default_lock_timeout(
self.inner,
default_lock_timeout,
);
}
}
pub fn set_txn_lock_timeout(&mut self, txn_lock_timeout: i64) {
unsafe {
ffi::rocksdb_transactiondb_options_set_transaction_lock_timeout(
self.inner,
txn_lock_timeout,
);
}
}
pub fn set_max_num_locks(&mut self, max_num_locks: i64) {
unsafe {
ffi::rocksdb_transactiondb_options_set_max_num_locks(self.inner, max_num_locks);
}
}
pub fn set_num_stripes(&mut self, num_stripes: usize) {
unsafe {
ffi::rocksdb_transactiondb_options_set_num_stripes(self.inner, num_stripes);
}
}
pub fn set_enable_udt_validation(&mut self, val: bool) {
unsafe {
ffi::rocksdb_transactiondb_options_set_enable_udt_validation(self.inner, u8::from(val));
}
}
pub fn get_enable_udt_validation(&self) -> bool {
unsafe { ffi::rocksdb_transactiondb_options_get_enable_udt_validation(self.inner) != 0 }
}
pub fn set_max_num_deadlocks(&mut self, val: u32) {
unsafe {
ffi::rocksdb_transactiondb_options_set_max_num_deadlocks(self.inner, val);
}
}
pub fn get_max_num_deadlocks(&self) -> u32 {
unsafe { ffi::rocksdb_transactiondb_options_get_max_num_deadlocks(self.inner) }
}
pub fn get_num_stripes(&self) -> usize {
unsafe { ffi::rocksdb_transactiondb_options_get_num_stripes(self.inner) }
}
pub fn set_rollback_merge_operands(&mut self, val: bool) {
unsafe {
ffi::rocksdb_transactiondb_options_set_rollback_merge_operands(
self.inner,
u8::from(val),
);
}
}
pub fn get_rollback_merge_operands(&self) -> bool {
unsafe { ffi::rocksdb_transactiondb_options_get_rollback_merge_operands(self.inner) != 0 }
}
pub fn set_skip_concurrency_control(&mut self, val: bool) {
unsafe {
ffi::rocksdb_transactiondb_options_set_skip_concurrency_control(
self.inner,
u8::from(val),
);
}
}
pub fn get_skip_concurrency_control(&self) -> bool {
unsafe { ffi::rocksdb_transactiondb_options_get_skip_concurrency_control(self.inner) != 0 }
}
pub fn set_txn_commit_bypass_memtable_threshold(&mut self, val: u32) {
unsafe {
ffi::rocksdb_transactiondb_options_set_txn_commit_bypass_memtable_threshold(
self.inner, val,
);
}
}
pub fn get_txn_commit_bypass_memtable_threshold(&self) -> u32 {
unsafe {
ffi::rocksdb_transactiondb_options_get_txn_commit_bypass_memtable_threshold(self.inner)
}
}
pub fn set_use_per_key_point_lock_mgr(&mut self, val: bool) {
unsafe {
ffi::rocksdb_transactiondb_options_set_use_per_key_point_lock_mgr(
self.inner,
u8::from(val),
);
}
}
pub fn get_use_per_key_point_lock_mgr(&self) -> bool {
unsafe {
ffi::rocksdb_transactiondb_options_get_use_per_key_point_lock_mgr(self.inner) != 0
}
}
pub fn get_default_lock_timeout(&self) -> i64 {
unsafe { ffi::rocksdb_transactiondb_options_get_default_lock_timeout(self.inner) }
}
pub fn get_default_write_batch_flush_threshold(&self) -> i64 {
unsafe {
ffi::rocksdb_transactiondb_options_get_default_write_batch_flush_threshold(self.inner)
}
}
pub fn get_max_num_locks(&self) -> i64 {
unsafe { ffi::rocksdb_transactiondb_options_get_max_num_locks(self.inner) }
}
pub fn get_transaction_lock_timeout(&self) -> i64 {
unsafe { ffi::rocksdb_transactiondb_options_get_transaction_lock_timeout(self.inner) }
}
pub fn set_default_write_batch_flush_threshold(&mut self, val: i64) {
unsafe {
ffi::rocksdb_transactiondb_options_set_default_write_batch_flush_threshold(
self.inner, val,
);
}
}
pub fn set_write_policy(&mut self, policy: TxnDBWritePolicy) {
unsafe {
ffi::rocksdb_transactiondb_options_set_write_policy(self.inner, policy as c_int);
}
}
pub fn get_write_policy(&self) -> Option<TxnDBWritePolicy> {
let raw = unsafe { ffi::rocksdb_transactiondb_options_get_write_policy(self.inner) };
TxnDBWritePolicy::try_from_raw(raw)
}
}
impl Drop for TransactionDBOptions {
fn drop(&mut self) {
unsafe {
ffi::rocksdb_transactiondb_options_destroy(self.inner);
}
}
}
pub struct OptimisticTransactionOptions {
pub(crate) inner: *mut ffi::rocksdb_optimistictransaction_options_t,
}
unsafe impl Send for OptimisticTransactionOptions {}
unsafe impl Sync for OptimisticTransactionOptions {}
impl Default for OptimisticTransactionOptions {
fn default() -> Self {
let txn_opts = unsafe { ffi::rocksdb_optimistictransaction_options_create() };
assert!(
!txn_opts.is_null(),
"Could not create RocksDB optimistic transaction options"
);
Self { inner: txn_opts }
}
}
impl OptimisticTransactionOptions {
pub fn new() -> OptimisticTransactionOptions {
OptimisticTransactionOptions::default()
}
pub fn set_snapshot(&mut self, snapshot: bool) {
unsafe {
ffi::rocksdb_optimistictransaction_options_set_set_snapshot(
self.inner,
u8::from(snapshot),
);
}
}
pub fn get_set_snapshot(&self) -> bool {
unsafe { ffi::rocksdb_optimistictransaction_options_get_set_snapshot(self.inner) != 0 }
}
}
impl Drop for OptimisticTransactionOptions {
fn drop(&mut self) {
unsafe {
ffi::rocksdb_optimistictransaction_options_destroy(self.inner);
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]
pub enum OccValidationPolicy {
ValidateSerial = 0,
ValidateParallel = 1,
}
impl OccValidationPolicy {
pub(crate) fn try_from_raw(raw: c_int) -> Option<Self> {
match raw {
n if n == OccValidationPolicy::ValidateSerial as c_int => {
Some(OccValidationPolicy::ValidateSerial)
}
n if n == OccValidationPolicy::ValidateParallel as c_int => {
Some(OccValidationPolicy::ValidateParallel)
}
_ => None,
}
}
}
struct OccLockBucketsWrapper {
inner: NonNull<ffi::rocksdb_optimistictransactiondb_lock_buckets_t>,
}
unsafe impl Send for OccLockBucketsWrapper {}
unsafe impl Sync for OccLockBucketsWrapper {}
impl Drop for OccLockBucketsWrapper {
fn drop(&mut self) {
unsafe {
ffi::rocksdb_optimistictransactiondb_lock_buckets_destroy(self.inner.as_ptr());
}
}
}
#[derive(Clone)]
pub struct OccLockBuckets(Arc<OccLockBucketsWrapper>);
impl OccLockBuckets {
pub fn new(bucket_count: usize, cache_aligned: bool) -> Self {
let inner = NonNull::new(unsafe {
ffi::rocksdb_optimistictransactiondb_lock_buckets_create(
bucket_count,
u8::from(cache_aligned),
)
})
.expect("Could not create RocksDB OCC lock buckets");
Self(Arc::new(OccLockBucketsWrapper { inner }))
}
pub fn approximate_memory_usage(&self) -> usize {
unsafe {
ffi::rocksdb_optimistictransactiondb_lock_buckets_approximate_memory_usage(
self.0.inner.as_ptr(),
)
}
}
}
pub struct OptimisticTransactionDBOptions {
pub(crate) inner: *mut ffi::rocksdb_optimistictransactiondb_options_t,
}
unsafe impl Send for OptimisticTransactionDBOptions {}
unsafe impl Sync for OptimisticTransactionDBOptions {}
impl Default for OptimisticTransactionDBOptions {
fn default() -> Self {
let otxn_db_opts = unsafe { ffi::rocksdb_optimistictransactiondb_options_create() };
assert!(
!otxn_db_opts.is_null(),
"Could not create RocksDB optimistic transaction_db options"
);
Self {
inner: otxn_db_opts,
}
}
}
impl OptimisticTransactionDBOptions {
pub fn new() -> OptimisticTransactionDBOptions {
OptimisticTransactionDBOptions::default()
}
pub fn set_validate_policy(&mut self, policy: OccValidationPolicy) {
unsafe {
ffi::rocksdb_optimistictransactiondb_options_set_validate_policy(
self.inner,
policy as c_int,
);
}
}
pub fn get_validate_policy(&self) -> Option<OccValidationPolicy> {
let raw =
unsafe { ffi::rocksdb_optimistictransactiondb_options_get_validate_policy(self.inner) };
OccValidationPolicy::try_from_raw(raw)
}
pub fn set_occ_lock_buckets(&mut self, num_buckets: u32) {
unsafe {
ffi::rocksdb_optimistictransactiondb_options_set_occ_lock_buckets(
self.inner,
num_buckets,
);
}
}
pub fn get_occ_lock_buckets(&self) -> u32 {
unsafe { ffi::rocksdb_optimistictransactiondb_options_get_occ_lock_buckets(self.inner) }
}
pub fn set_shared_lock_buckets(&mut self, buckets: &OccLockBuckets) {
unsafe {
ffi::rocksdb_optimistictransactiondb_options_set_shared_lock_buckets(
self.inner,
buckets.0.inner.as_ptr(),
);
}
}
}
impl Drop for OptimisticTransactionDBOptions {
fn drop(&mut self) {
unsafe {
ffi::rocksdb_optimistictransactiondb_options_destroy(self.inner);
}
}
}