doc_op_sql.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. use crate::{
  2. entities::doc::Revision,
  3. errors::DocError,
  4. sql_tables::{doc::RevTable, RevChangeset, RevState, RevTableType},
  5. };
  6. use diesel::{insert_into, update};
  7. use flowy_database::{
  8. prelude::*,
  9. schema::rev_table::{columns::*, dsl, dsl::doc_id},
  10. SqliteConnection,
  11. };
  12. pub struct OpTableSql {}
  13. impl OpTableSql {
  14. pub(crate) fn create_rev_table(
  15. &self,
  16. revisions: Vec<(Revision, RevState)>,
  17. conn: &SqliteConnection,
  18. ) -> Result<(), DocError> {
  19. // Batch insert: https://diesel.rs/guides/all-about-inserts.html
  20. let records = revisions
  21. .into_iter()
  22. .map(|(revision, new_state)| {
  23. log::debug!("Set {} to {:?}", revision.rev_id, new_state);
  24. let rev_ty: RevTableType = revision.ty.into();
  25. (
  26. doc_id.eq(revision.doc_id),
  27. base_rev_id.eq(revision.base_rev_id),
  28. rev_id.eq(revision.rev_id),
  29. data.eq(revision.delta),
  30. state.eq(new_state),
  31. ty.eq(rev_ty),
  32. )
  33. })
  34. .collect::<Vec<_>>();
  35. let _ = insert_into(dsl::rev_table).values(&records).execute(conn)?;
  36. Ok(())
  37. }
  38. pub(crate) fn update_rev_table(&self, changeset: RevChangeset, conn: &SqliteConnection) -> Result<(), DocError> {
  39. let filter = dsl::rev_table
  40. .filter(rev_id.eq(changeset.rev_id))
  41. .filter(doc_id.eq(changeset.doc_id));
  42. let _ = update(filter).set(state.eq(changeset.state)).execute(conn)?;
  43. log::debug!("Set {} to {:?}", changeset.rev_id, changeset.state);
  44. Ok(())
  45. }
  46. pub(crate) fn read_rev_table(
  47. &self,
  48. doc_id_s: &str,
  49. rev_id_s: i64,
  50. conn: &SqliteConnection,
  51. ) -> Result<Vec<Revision>, DocError> {
  52. let rev_tables: Vec<RevTable> = dsl::rev_table
  53. .filter(rev_id.eq(rev_id_s))
  54. .filter(doc_id.eq(doc_id_s))
  55. .load::<RevTable>(conn)?;
  56. let revisions = rev_tables
  57. .into_iter()
  58. .map(|table| table.into())
  59. .collect::<Vec<Revision>>();
  60. Ok(revisions)
  61. }
  62. pub(crate) fn read_revs_table(
  63. &self,
  64. doc_id_s: &str,
  65. from_rev_id: i64,
  66. to_rev_id: i64,
  67. conn: &SqliteConnection,
  68. ) -> Result<Vec<Revision>, DocError> {
  69. let rev_tables = dsl::rev_table
  70. .filter(rev_id.ge(from_rev_id))
  71. .filter(rev_id.lt(to_rev_id))
  72. .filter(doc_id.eq(doc_id_s))
  73. .load::<RevTable>(conn)?;
  74. let revisions = rev_tables
  75. .into_iter()
  76. .map(|table| table.into())
  77. .collect::<Vec<Revision>>();
  78. Ok(revisions)
  79. }
  80. pub(crate) fn delete_rev_table(
  81. &self,
  82. doc_id_s: &str,
  83. rev_id_s: i64,
  84. conn: &SqliteConnection,
  85. ) -> Result<(), DocError> {
  86. let filter = dsl::rev_table.filter(rev_id.eq(rev_id_s)).filter(doc_id.eq(doc_id_s));
  87. let affected_row = diesel::delete(filter).execute(conn)?;
  88. debug_assert_eq!(affected_row, 1);
  89. Ok(())
  90. }
  91. }