model.rs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. use crate::{
  2. errors::{internal_error, DocError, DocResult},
  3. sql_tables::{RevTableSql, SqlRevState},
  4. };
  5. use flowy_database::ConnectionPool;
  6. use lib_infra::future::ResultFuture;
  7. use lib_ot::revision::{Revision, RevisionRange};
  8. use std::sync::Arc;
  9. use tokio::sync::broadcast;
  10. pub(crate) struct Persistence {
  11. pub(crate) rev_sql: Arc<RevTableSql>,
  12. pub(crate) pool: Arc<ConnectionPool>,
  13. }
  14. impl Persistence {
  15. pub(crate) fn new(pool: Arc<ConnectionPool>) -> Self {
  16. let rev_sql = Arc::new(RevTableSql {});
  17. Self { rev_sql, pool }
  18. }
  19. pub(crate) fn create_revs(&self, revisions: Vec<(Revision, SqlRevState)>) -> DocResult<()> {
  20. let conn = &*self.pool.get().map_err(internal_error)?;
  21. conn.immediate_transaction::<_, DocError, _>(|| {
  22. let _ = self.rev_sql.create_rev_table(revisions, conn)?;
  23. Ok(())
  24. })
  25. }
  26. pub(crate) fn read_rev_with_range(&self, doc_id: &str, range: RevisionRange) -> DocResult<Vec<Revision>> {
  27. let conn = &*self.pool.get().map_err(internal_error).unwrap();
  28. let revisions = self.rev_sql.read_rev_tables_with_range(doc_id, range, conn)?;
  29. Ok(revisions)
  30. }
  31. pub(crate) fn read_rev(&self, doc_id: &str, rev_id: &i64) -> DocResult<Option<Revision>> {
  32. let conn = self.pool.get().map_err(internal_error)?;
  33. let some = self.rev_sql.read_rev_table(&doc_id, rev_id, &*conn)?;
  34. Ok(some)
  35. }
  36. }
  37. pub trait RevisionIterator: Send + Sync {
  38. fn next(&self) -> ResultFuture<Option<Revision>, DocError>;
  39. }