Change connection type from Mutex to RwLock
This commit is contained in:
1 parent
4b17a5a4a7
commit
ea214d8ac0
1 file changed
+24
-29
+24
-29
@@ -43,6 +43,7 @@ where
|
|||||||
T: EntityData,
|
T: EntityData,
|
||||||
{
|
{
|
||||||
pub(crate) fn handle_save(&self, old: EntityHandle<T>, new: &mut EntityHandle<T>, data: &T) {
|
pub(crate) fn handle_save(&self, old: EntityHandle<T>, new: &mut EntityHandle<T>, data: &T) {
|
||||||
|
return;
|
||||||
if old.real() && new.real() {
|
if old.real() && new.real() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -57,6 +58,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub(crate) fn handle_delete(&self, handle: &EntityHandle<T>, data: &T) {
|
pub(crate) fn handle_delete(&self, handle: &EntityHandle<T>, data: &T) {
|
||||||
|
return;
|
||||||
let affected = self.get_affected_queries(data);
|
let affected = self.get_affected_queries(data);
|
||||||
for q in affected {
|
for q in affected {
|
||||||
let mut query = self.queries[q].lock();
|
let mut query = self.queries[q].lock();
|
||||||
@@ -189,10 +191,10 @@ pub struct DataRepositoryInner<T: std::clone::Clone + EntityData, D: DbLayer<T>>
|
|||||||
cache: Vec<T>,
|
cache: Vec<T>,
|
||||||
temporal: Vec<T>,
|
temporal: Vec<T>,
|
||||||
next_temporal: u32,
|
next_temporal: u32,
|
||||||
connection: Arc<Mutex<Connection>>,
|
connection: Arc<RwLock<Connection>>,
|
||||||
data_layer: D,
|
data_layer: D,
|
||||||
query_manger: QueryManger<T, Self, D>,
|
query_manger: QueryManger<T, Self, D>,
|
||||||
version: u16
|
version: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: std::clone::Clone + EntityData, D: DbLayer<T>> Deref for DataRepository<T, D> {
|
impl<T: std::clone::Clone + EntityData, D: DbLayer<T>> Deref for DataRepository<T, D> {
|
||||||
@@ -203,7 +205,7 @@ impl<T: std::clone::Clone + EntityData, D: DbLayer<T>> Deref for DataRepository<
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: EntityData + Clone, D: DbLayer<T>> DataRepository<T, D> {
|
impl<T: EntityData + Clone, D: DbLayer<T>> DataRepositoryInner<T, D> {
|
||||||
pub fn query_par(
|
pub fn query_par(
|
||||||
&self,
|
&self,
|
||||||
rule: Box<dyn Fn(&T) -> bool + Send + Sync>,
|
rule: Box<dyn Fn(&T) -> bool + Send + Sync>,
|
||||||
@@ -211,9 +213,7 @@ impl<T: EntityData + Clone, D: DbLayer<T>> DataRepository<T, D> {
|
|||||||
where
|
where
|
||||||
T: Send + Sync,
|
T: Send + Sync,
|
||||||
{
|
{
|
||||||
let inner = self.inner.read();
|
let mut cache: Vec<EntityHandle<T>> = self
|
||||||
|
|
||||||
let mut cache: Vec<EntityHandle<T>> = inner
|
|
||||||
.cache
|
.cache
|
||||||
.par_iter()
|
.par_iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
@@ -222,8 +222,7 @@ impl<T: EntityData + Clone, D: DbLayer<T>> DataRepository<T, D> {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
cache.extend(
|
cache.extend(
|
||||||
inner
|
self.temporal
|
||||||
.temporal
|
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.filter(|(_, entity)| rule(entity))
|
.filter(|(_, entity)| rule(entity))
|
||||||
@@ -246,9 +245,7 @@ impl<T: EntityData + Clone, D: DbLayer<T>> DataRepository<T, D> {
|
|||||||
where
|
where
|
||||||
T: Send + Sync,
|
T: Send + Sync,
|
||||||
{
|
{
|
||||||
let inner = self.inner.read();
|
let mut cache: Vec<EntityHandle<T>> = self
|
||||||
|
|
||||||
let mut cache: Vec<EntityHandle<T>> = inner
|
|
||||||
.cache
|
.cache
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
@@ -257,8 +254,7 @@ impl<T: EntityData + Clone, D: DbLayer<T>> DataRepository<T, D> {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
cache.extend(
|
cache.extend(
|
||||||
inner
|
self.temporal
|
||||||
.temporal
|
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.filter(|(_, entity)| rule(entity))
|
.filter(|(_, entity)| rule(entity))
|
||||||
@@ -324,12 +320,12 @@ impl<T: EntityData + Clone, D: DbLayer<T>> Repository<T, D> for DataRepositoryIn
|
|||||||
if entity.real() {
|
if entity.real() {
|
||||||
let data = self.get_ref(entity).unwrap();
|
let data = self.get_ref(entity).unwrap();
|
||||||
self.data_layer
|
self.data_layer
|
||||||
.write_entity(data, &self.connection.lock())?;
|
.write_entity(data, &self.connection.read())?;
|
||||||
} else {
|
} else {
|
||||||
let index = fast_position_of(self.temporal.as_slice(), entity).unwrap();
|
let index = fast_position_of(self.temporal.as_slice(), entity).unwrap();
|
||||||
let mut data = self.temporal.remove(index);
|
let mut data = self.temporal.remove(index);
|
||||||
self.data_layer
|
self.data_layer
|
||||||
.add_entity(&mut data, &self.connection.lock())?;
|
.add_entity(&mut data, &self.connection.read())?;
|
||||||
entity.set_real(true);
|
entity.set_real(true);
|
||||||
entity.id = data.id();
|
entity.id = data.id();
|
||||||
entity.set_index(self.cache.len());
|
entity.set_index(self.cache.len());
|
||||||
@@ -344,7 +340,7 @@ impl<T: EntityData + Clone, D: DbLayer<T>> Repository<T, D> for DataRepositoryIn
|
|||||||
fn delete(&mut self, mut handle: EntityHandle<T>) -> MaybeError {
|
fn delete(&mut self, mut handle: EntityHandle<T>) -> MaybeError {
|
||||||
let vec = if handle.real() {
|
let vec = if handle.real() {
|
||||||
self.data_layer
|
self.data_layer
|
||||||
.delete_entity(handle.id, &self.connection.lock())?;
|
.delete_entity(handle.id, &self.connection.read())?;
|
||||||
&mut self.cache
|
&mut self.cache
|
||||||
} else {
|
} else {
|
||||||
&mut self.temporal
|
&mut self.temporal
|
||||||
@@ -361,7 +357,7 @@ impl<T: EntityData + Clone, D: DbLayer<T>> Repository<T, D> for DataRepositoryIn
|
|||||||
|
|
||||||
fn init(&mut self) -> MaybeError {
|
fn init(&mut self) -> MaybeError {
|
||||||
self.data_layer
|
self.data_layer
|
||||||
.load_all(&mut self.cache, &self.connection.lock())?;
|
.load_all(&mut self.cache, &self.connection.read())?;
|
||||||
self.version += 1;
|
self.version += 1;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -388,7 +384,7 @@ impl<T: EntityData + Clone, D: BatchedDbLayer<T> + DbLayer<T>> BatchedRepository
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut values = Vec::with_capacity(temp.len());
|
let mut temp_values = Vec::with_capacity(temp.len());
|
||||||
let mut cell = 0;
|
let mut cell = 0;
|
||||||
let len = temp.len();
|
let len = temp.len();
|
||||||
self.temporal.retain(|x| {
|
self.temporal.retain(|x| {
|
||||||
@@ -399,32 +395,31 @@ impl<T: EntityData + Clone, D: BatchedDbLayer<T> + DbLayer<T>> BatchedRepository
|
|||||||
let remove = x.id() == find;
|
let remove = x.id() == find;
|
||||||
if remove {
|
if remove {
|
||||||
cell += 1;
|
cell += 1;
|
||||||
values.push(x.clone());
|
temp_values.push(x.clone());
|
||||||
}
|
}
|
||||||
!remove
|
!remove
|
||||||
});
|
});
|
||||||
|
|
||||||
self.data_layer
|
self.data_layer
|
||||||
.add_many_entity(&mut values, &self.connection.lock())?;
|
.add_many_entity(&mut temp_values, &self.connection.read())?;
|
||||||
|
|
||||||
let start = self.cache.len();
|
let start = self.cache.len();
|
||||||
|
|
||||||
for (i, (handle, data)) in temp.into_iter().zip(&values).enumerate() {
|
for (i, (handle, data)) in temp.into_iter().zip(&mut temp_values).enumerate() {
|
||||||
let old = handle.clone();
|
let old = handle.clone();
|
||||||
let h = handle;
|
handle.id = data.id();
|
||||||
h.id = self.cache[start + i].id();
|
handle.set_index(start + i);
|
||||||
h.set_index(start + i);
|
handle.set_real(true);
|
||||||
h.set_real(true);
|
self.query_manger.handle_save(old, handle, data);
|
||||||
self.query_manger.handle_save(old, h, data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.cache.extend(values);
|
self.cache.extend(temp_values);
|
||||||
|
|
||||||
for handle in cached.into_iter() {
|
for handle in cached.into_iter() {
|
||||||
let h = handle;
|
let h = handle;
|
||||||
let idx = fast_position_of(self.cache.as_slice(), h).unwrap();
|
let idx = fast_position_of(self.cache.as_slice(), h).unwrap();
|
||||||
self.data_layer
|
self.data_layer
|
||||||
.write_entity(&self.cache[idx], &self.connection.lock())?;
|
.write_entity(&self.cache[idx], &self.connection.read())?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -447,7 +442,7 @@ impl<T: EntityData + Clone, D: BatchedDbLayer<T> + DbLayer<T>> BatchedRepository
|
|||||||
!remove
|
!remove
|
||||||
});
|
});
|
||||||
self.data_layer
|
self.data_layer
|
||||||
.delete_many(cached.as_slice(), &self.connection.lock())?;
|
.delete_many(cached.as_slice(), &self.connection.read())?;
|
||||||
let len = cached.len();
|
let len = cached.len();
|
||||||
cell = 0;
|
cell = 0;
|
||||||
self.cache.retain(|x| {
|
self.cache.retain(|x| {
|
||||||
|
|||||||
Reference in new issue
Block a user