disk.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. use crate::services::doc::revision::RevisionRecord;
  2. use crate::sql_tables::{RevisionChangeset, RevisionTableSql};
  3. use diesel::SqliteConnection;
  4. use flowy_collaboration::entities::revision::RevisionRange;
  5. use flowy_database::ConnectionPool;
  6. use flowy_error::{internal_error, FlowyError, FlowyResult};
  7. use std::{fmt::Debug, sync::Arc};
  8. pub trait RevisionDiskCache: Sync + Send {
  9. type Error: Debug;
  10. fn write_revision_records(
  11. &self,
  12. revisions: Vec<RevisionRecord>,
  13. conn: &SqliteConnection,
  14. ) -> Result<(), Self::Error>;
  15. // Read all the records if the rev_ids is None
  16. fn read_revision_records(
  17. &self,
  18. doc_id: &str,
  19. rev_ids: Option<Vec<i64>>,
  20. ) -> Result<Vec<RevisionRecord>, Self::Error>;
  21. fn read_revision_records_with_range(
  22. &self,
  23. doc_id: &str,
  24. range: &RevisionRange,
  25. ) -> Result<Vec<RevisionRecord>, Self::Error>;
  26. fn update_revision_record(&self, changesets: Vec<RevisionChangeset>) -> FlowyResult<()>;
  27. // Delete all the records if the rev_ids is None
  28. fn delete_revision_records(
  29. &self,
  30. doc_id: &str,
  31. rev_ids: Option<Vec<i64>>,
  32. conn: &SqliteConnection,
  33. ) -> Result<(), Self::Error>;
  34. fn db_pool(&self) -> Arc<ConnectionPool>;
  35. }
  36. pub(crate) struct Persistence {
  37. user_id: String,
  38. pub(crate) pool: Arc<ConnectionPool>,
  39. }
  40. impl RevisionDiskCache for Persistence {
  41. type Error = FlowyError;
  42. fn write_revision_records(
  43. &self,
  44. revisions: Vec<RevisionRecord>,
  45. conn: &SqliteConnection,
  46. ) -> Result<(), Self::Error> {
  47. let _ = RevisionTableSql::create(revisions, conn)?;
  48. Ok(())
  49. }
  50. fn read_revision_records(
  51. &self,
  52. doc_id: &str,
  53. rev_ids: Option<Vec<i64>>,
  54. ) -> Result<Vec<RevisionRecord>, Self::Error> {
  55. let conn = self.pool.get().map_err(internal_error)?;
  56. let records = RevisionTableSql::read(&self.user_id, doc_id, rev_ids, &*conn)?;
  57. Ok(records)
  58. }
  59. fn read_revision_records_with_range(
  60. &self,
  61. doc_id: &str,
  62. range: &RevisionRange,
  63. ) -> Result<Vec<RevisionRecord>, Self::Error> {
  64. let conn = &*self.pool.get().map_err(internal_error)?;
  65. let revisions = RevisionTableSql::read_with_range(&self.user_id, doc_id, range.clone(), conn)?;
  66. Ok(revisions)
  67. }
  68. fn update_revision_record(&self, changesets: Vec<RevisionChangeset>) -> FlowyResult<()> {
  69. let conn = &*self.pool.get().map_err(internal_error)?;
  70. let _ = conn.immediate_transaction::<_, FlowyError, _>(|| {
  71. for changeset in changesets {
  72. let _ = RevisionTableSql::update(changeset, conn)?;
  73. }
  74. Ok(())
  75. })?;
  76. Ok(())
  77. }
  78. fn delete_revision_records(
  79. &self,
  80. doc_id: &str,
  81. rev_ids: Option<Vec<i64>>,
  82. conn: &SqliteConnection,
  83. ) -> Result<(), Self::Error> {
  84. let _ = RevisionTableSql::delete(doc_id, rev_ids, conn)?;
  85. Ok(())
  86. }
  87. fn db_pool(&self) -> Arc<ConnectionPool> { self.pool.clone() }
  88. }
  89. impl Persistence {
  90. pub(crate) fn new(user_id: &str, pool: Arc<ConnectionPool>) -> Self {
  91. Self {
  92. user_id: user_id.to_owned(),
  93. pool,
  94. }
  95. }
  96. }