#![allow(clippy::missing_errors_doc)]
use std::cmp::min;
mod admin_policy;
mod batch_policy;
mod client_policy;
mod commit_level;
mod concurrency;
mod consistency_level;
mod expiration;
mod generation_policy;
mod query_duration;
mod query_policy;
mod read_policy;
mod read_touch_ttl_percent;
mod record_exists_action;
mod stream_policy;
mod write_policy;
pub use self::admin_policy::AdminPolicy;
pub use self::batch_policy::BatchPolicy;
pub use self::client_policy::AuthMode;
pub use self::client_policy::ClientPolicy;
pub use self::commit_level::CommitLevel;
pub use self::concurrency::Concurrency;
pub use self::consistency_level::ConsistencyLevel;
pub use self::expiration::Expiration;
pub use self::generation_policy::GenerationPolicy;
pub use self::query_duration::QueryDuration;
pub use self::query_policy::QueryPolicy;
pub use self::read_policy::ReadPolicy;
pub use self::read_touch_ttl_percent::ReadTouchTTL;
pub use self::record_exists_action::RecordExistsAction;
pub(crate) use self::stream_policy::StreamPolicy;
pub use self::write_policy::WritePolicy;
use crate::expressions::Expression;
use aerospike_rt::time::{Duration, Instant};
use std::option::Option;
pub trait Policy {
#[doc(hidden)]
fn deadline(&self) -> Option<Instant>;
fn server_timeout(&self) -> u32;
fn socket_timeout(&self) -> u32;
fn total_timeout(&self) -> u32;
fn timeout_delay(&self) -> u32;
fn max_retries(&self) -> usize;
fn sleep_between_retries(&self) -> Option<Duration>;
fn consistency_level(&self) -> &ConsistencyLevel;
}
pub(crate) trait PolicyLike {
fn base(&self) -> &BasePolicy;
}
impl<T> Policy for T
where
T: PolicyLike,
{
fn consistency_level(&self) -> &ConsistencyLevel {
self.base().consistency_level()
}
fn deadline(&self) -> Option<Instant> {
self.base().deadline()
}
fn server_timeout(&self) -> u32 {
self.base().server_timeout()
}
fn socket_timeout(&self) -> u32 {
self.base().socket_timeout()
}
fn total_timeout(&self) -> u32 {
self.base().total_timeout()
}
fn timeout_delay(&self) -> u32 {
self.base().timeout_delay()
}
fn max_retries(&self) -> usize {
self.base().max_retries()
}
fn sleep_between_retries(&self) -> Option<Duration> {
self.base().sleep_between_retries()
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
pub enum Replica {
Master,
#[default]
Sequence,
PreferRack,
}
#[derive(Debug, Clone)]
pub struct BasePolicy {
pub consistency_level: ConsistencyLevel,
pub socket_timeout: u32,
pub total_timeout: u32,
pub timeout_delay: u32,
pub max_retries: usize,
pub read_touch_ttl: ReadTouchTTL,
pub sleep_between_retries: u32,
pub filter_expression: Option<Expression>,
}
impl Policy for BasePolicy {
fn deadline(&self) -> Option<Instant> {
if self.total_timeout > 0 {
Some(Instant::now() + Duration::from_millis(u64::from(self.total_timeout)))
} else {
None
}
}
fn server_timeout(&self) -> u32 {
if self.total_timeout > 0 {
self.socket_timeout()
} else {
0
}
}
fn socket_timeout(&self) -> u32 {
match (self.socket_timeout, self.total_timeout) {
(0, 0) => 0,
(d, 0) | (0, d) => d,
(d1, d2) => min(d1, d2),
}
}
fn total_timeout(&self) -> u32 {
self.total_timeout
}
fn timeout_delay(&self) -> u32 {
self.timeout_delay
}
fn max_retries(&self) -> usize {
self.max_retries
}
fn sleep_between_retries(&self) -> Option<Duration> {
if self.sleep_between_retries > 0 {
Some(Duration::from_millis(u64::from(self.sleep_between_retries)))
} else {
None
}
}
fn consistency_level(&self) -> &ConsistencyLevel {
&self.consistency_level
}
}