use std::rc::Rc;
use crate::error::Error;
use crate::index::IteratorType;
use crate::tuple::{Encode, ToTupleBuffer, Tuple};
use super::index::{RemoteIndex, RemoteIndexIterator};
use super::inner::ConnInner;
use super::options::Options;
use super::protocol;
pub struct RemoteSpace {
conn_inner: Rc<ConnInner>,
space_id: u32,
}
impl RemoteSpace {
#[inline(always)]
pub(crate) fn new(conn_inner: Rc<ConnInner>, space_id: u32) -> Self {
RemoteSpace {
conn_inner,
space_id,
}
}
pub fn index(&self, name: &str) -> Result<Option<RemoteIndex>, Error> {
Ok(self
.conn_inner
.lookup_index(name, self.space_id)?
.map(|index_id| RemoteIndex::new(self.conn_inner.clone(), self.space_id, index_id)))
}
#[inline(always)]
pub fn primary_key(&self) -> RemoteIndex {
RemoteIndex::new(self.conn_inner.clone(), self.space_id, 0)
}
#[inline(always)]
pub fn get<K>(&self, key: &K, options: &Options) -> Result<Option<Tuple>, Error>
where
K: ToTupleBuffer + ?Sized,
{
self.primary_key().get(key, options)
}
#[inline(always)]
pub fn select<K>(
&self,
iterator_type: IteratorType,
key: &K,
options: &Options,
) -> Result<RemoteIndexIterator, Error>
where
K: ToTupleBuffer + ?Sized,
{
self.primary_key().select(iterator_type, key, options)
}
#[inline(always)]
pub fn insert<T>(&self, value: &T, options: &Options) -> Result<Option<Tuple>, Error>
where
T: ToTupleBuffer + ?Sized,
{
self.conn_inner.request(
&protocol::Insert {
space_id: self.space_id,
value,
},
options,
)
}
#[inline(always)]
pub fn replace<T>(&self, value: &T, options: &Options) -> Result<Option<Tuple>, Error>
where
T: ToTupleBuffer + ?Sized,
{
self.conn_inner.request(
&protocol::Replace {
space_id: self.space_id,
value,
},
options,
)
}
#[inline(always)]
pub fn update<K, Op>(
&self,
key: &K,
ops: &[Op],
options: &Options,
) -> Result<Option<Tuple>, Error>
where
K: ToTupleBuffer + ?Sized,
Op: Encode,
{
self.primary_key().update(key, ops, options)
}
#[inline(always)]
pub fn upsert<T, Op>(
&self,
value: &T,
ops: &[Op],
options: &Options,
) -> Result<Option<Tuple>, Error>
where
T: ToTupleBuffer + ?Sized,
Op: Encode,
{
self.primary_key().upsert(value, ops, options)
}
#[inline(always)]
pub fn delete<K>(&self, key: &K, options: &Options) -> Result<Option<Tuple>, Error>
where
K: ToTupleBuffer + ?Sized,
{
self.primary_key().delete(key, options)
}
}