doc_op_sql.rs 3.1 KB

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