persistence.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. use crate::history::RevisionHistoryDiskCache;
  2. use flowy_database::{
  3. prelude::*,
  4. schema::{rev_history, rev_history::dsl},
  5. ConnectionPool,
  6. };
  7. use flowy_error::{internal_error, FlowyResult};
  8. use flowy_sync::entities::revision::Revision;
  9. use std::sync::Arc;
  10. pub struct SQLiteRevisionHistoryPersistence {
  11. object_id: String,
  12. pool: Arc<ConnectionPool>,
  13. }
  14. impl SQLiteRevisionHistoryPersistence {
  15. pub fn new(object_id: &str, pool: Arc<ConnectionPool>) -> Self {
  16. let object_id = object_id.to_owned();
  17. Self { object_id, pool }
  18. }
  19. }
  20. impl RevisionHistoryDiskCache for SQLiteRevisionHistoryPersistence {
  21. fn write_history(&self, revision: Revision) -> FlowyResult<()> {
  22. let record = (
  23. dsl::object_id.eq(revision.object_id),
  24. dsl::start_rev_id.eq(revision.base_rev_id),
  25. dsl::end_rev_id.eq(revision.rev_id),
  26. dsl::data.eq(revision.delta_data),
  27. );
  28. let conn = self.pool.get().map_err(internal_error)?;
  29. let _ = insert_or_ignore_into(dsl::rev_history)
  30. .values(vec![record])
  31. .execute(&*conn)?;
  32. Ok(())
  33. }
  34. fn read_histories(&self) -> FlowyResult<Vec<RevisionHistory>> {
  35. let conn = self.pool.get().map_err(internal_error)?;
  36. let records: Vec<RevisionRecord> = dsl::rev_history
  37. .filter(dsl::object_id.eq(&self.object_id))
  38. .load::<RevisionRecord>(&*conn)?;
  39. Ok(records
  40. .into_iter()
  41. .map(|record| record.into())
  42. .collect::<Vec<RevisionHistory>>())
  43. }
  44. }
  45. #[derive(PartialEq, Clone, Debug, Queryable, Identifiable, Insertable, Associations)]
  46. #[table_name = "rev_history"]
  47. struct RevisionRecord {
  48. id: i32,
  49. object_id: String,
  50. start_rev_id: i64,
  51. end_rev_id: i64,
  52. data: Vec<u8>,
  53. }
  54. pub struct RevisionHistory {
  55. pub object_id: String,
  56. pub start_rev_id: i64,
  57. pub end_rev_id: i64,
  58. pub data: Vec<u8>,
  59. }
  60. impl std::convert::From<RevisionRecord> for RevisionHistory {
  61. fn from(record: RevisionRecord) -> Self {
  62. RevisionHistory {
  63. object_id: record.object_id,
  64. start_rev_id: record.start_rev_id,
  65. end_rev_id: record.end_rev_id,
  66. data: record.data,
  67. }
  68. }
  69. }