database_ref.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. use crate::services::persistence::DatabaseDBConnection;
  2. use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl};
  3. use flowy_error::FlowyResult;
  4. use flowy_sqlite::{
  5. prelude::*,
  6. schema::{database_refs, database_refs::dsl},
  7. };
  8. use std::sync::Arc;
  9. pub struct DatabaseRefIndexer {
  10. database: Arc<dyn DatabaseDBConnection>,
  11. }
  12. impl DatabaseRefIndexer {
  13. pub fn new(database: Arc<dyn DatabaseDBConnection>) -> Self {
  14. Self { database }
  15. }
  16. pub fn bind(
  17. &self,
  18. database_id: &str,
  19. view_id: &str,
  20. is_base: bool,
  21. name: &str,
  22. ) -> FlowyResult<()> {
  23. let conn = self.database.get_db_connection()?;
  24. let ref_id = make_ref_id(database_id, view_id);
  25. let record = DatabaseRefRecord {
  26. ref_id,
  27. name: name.to_string(),
  28. is_base,
  29. view_id: view_id.to_string(),
  30. database_id: database_id.to_string(),
  31. };
  32. let _ = diesel::replace_into(database_refs::table)
  33. .values(record)
  34. .execute(&*conn)?;
  35. Ok(())
  36. }
  37. pub fn unbind(&self, view_id: &str) -> FlowyResult<()> {
  38. let conn = self.database.get_db_connection()?;
  39. diesel::delete(dsl::database_refs.filter(database_refs::view_id.eq(view_id)))
  40. .execute(&*conn)?;
  41. Ok(())
  42. }
  43. pub fn get_ref_views_with_database(
  44. &self,
  45. database_id: &str,
  46. ) -> FlowyResult<Vec<DatabaseViewRef>> {
  47. let conn = self.database.get_db_connection()?;
  48. let views = dsl::database_refs
  49. .filter(database_refs::database_id.like(database_id))
  50. .load::<DatabaseRefRecord>(&*conn)?
  51. .into_iter()
  52. .map(|record| record.into())
  53. .collect::<Vec<_>>();
  54. tracing::trace!("database:{} has {} ref views", database_id, views.len());
  55. Ok(views)
  56. }
  57. pub fn get_database_with_view(&self, view_id: &str) -> FlowyResult<DatabaseInfo> {
  58. let conn = self.database.get_db_connection()?;
  59. let record = dsl::database_refs
  60. .filter(database_refs::view_id.eq(view_id))
  61. .first::<DatabaseRefRecord>(&*conn)?;
  62. Ok(record.into())
  63. }
  64. pub fn get_all_databases(&self) -> FlowyResult<Vec<DatabaseInfo>> {
  65. let conn = self.database.get_db_connection()?;
  66. let database_infos = dsl::database_refs
  67. .filter(database_refs::is_base.eq(true))
  68. .load::<DatabaseRefRecord>(&*conn)?
  69. .into_iter()
  70. .map(|record| record.into())
  71. .collect::<Vec<DatabaseInfo>>();
  72. Ok(database_infos)
  73. }
  74. }
  75. fn make_ref_id(database_id: &str, view_id: &str) -> String {
  76. format!("{}:{}", database_id, view_id)
  77. }
  78. #[derive(PartialEq, Clone, Debug, Queryable, Identifiable, Insertable, Associations)]
  79. #[table_name = "database_refs"]
  80. #[primary_key(ref_id)]
  81. struct DatabaseRefRecord {
  82. ref_id: String,
  83. name: String,
  84. is_base: bool,
  85. view_id: String,
  86. database_id: String,
  87. }
  88. pub struct DatabaseViewRef {
  89. pub view_id: String,
  90. pub name: String,
  91. pub database_id: String,
  92. }
  93. impl std::convert::From<DatabaseRefRecord> for DatabaseViewRef {
  94. fn from(record: DatabaseRefRecord) -> Self {
  95. Self {
  96. view_id: record.view_id,
  97. name: record.name,
  98. database_id: record.database_id,
  99. }
  100. }
  101. }
  102. pub struct DatabaseInfo {
  103. pub name: String,
  104. pub database_id: String,
  105. }
  106. impl std::convert::From<DatabaseRefRecord> for DatabaseInfo {
  107. fn from(record: DatabaseRefRecord) -> Self {
  108. Self {
  109. name: record.name,
  110. database_id: record.database_id,
  111. }
  112. }
  113. }