mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
chore: add sqlite feature flag (#1683)
* chore: add sqlite feature flag * chore: fix clippy warings * ci: fix clippy * chore: add rev file persistence * ci: fix clippy Co-authored-by: nathan <nathan@appflowy.io>
This commit is contained in:
@ -14,11 +14,12 @@ lib-ot = { path = "../../../shared-lib/lib-ot" }
|
||||
lib-infra = { path = "../../../shared-lib/lib-infra" }
|
||||
|
||||
flowy-document = { path = "../flowy-document" }
|
||||
flowy-database = { path = "../flowy-database" }
|
||||
flowy-database = { path = "../flowy-database", optional = true }
|
||||
flowy-error = { path = "../flowy-error", features = ["db", "http_server"]}
|
||||
dart-notify = { path = "../dart-notify" }
|
||||
lib-dispatch = { path = "../lib-dispatch" }
|
||||
flowy-revision = { path = "../flowy-revision" }
|
||||
flowy-revision-persistence = { path = "../flowy-revision-persistence" }
|
||||
|
||||
parking_lot = "0.12.1"
|
||||
protobuf = {version = "2.18.0"}
|
||||
@ -49,5 +50,6 @@ flowy-codegen = { path = "../flowy-codegen"}
|
||||
default = []
|
||||
sync = []
|
||||
cloud_sync = ["sync"]
|
||||
rev-sqlite = ["flowy-database", "flowy-folder/rev-sqlite"]
|
||||
flowy_unit_test = ["lib-ot/flowy_unit_test", "flowy-revision/flowy_unit_test"]
|
||||
dart = ["flowy-codegen/dart", "dart-notify/dart"]
|
@ -105,7 +105,7 @@ impl std::default::Default for TrashType {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, ProtoBuf, Default, Debug, Clone)]
|
||||
#[derive(PartialEq, Eq, ProtoBuf, Default, Debug, Clone)]
|
||||
pub struct RepeatedTrashIdPB {
|
||||
#[pb(index = 1)]
|
||||
pub items: Vec<TrashIdPB>,
|
||||
|
@ -52,8 +52,8 @@ impl AppController {
|
||||
pub(crate) async fn create_app_on_local(&self, app: AppRevision) -> Result<AppPB, FlowyError> {
|
||||
self.persistence
|
||||
.begin_transaction(|transaction| {
|
||||
let _ = transaction.create_app(app.clone())?;
|
||||
let _ = notify_apps_changed(&app.workspace_id, self.trash_controller.clone(), &transaction)?;
|
||||
transaction.create_app(app.clone())?;
|
||||
notify_apps_changed(&app.workspace_id, self.trash_controller.clone(), &transaction)?;
|
||||
Ok(())
|
||||
})
|
||||
.await?;
|
||||
@ -101,9 +101,9 @@ impl AppController {
|
||||
pub(crate) async fn move_app(&self, app_id: &str, from: usize, to: usize) -> FlowyResult<()> {
|
||||
self.persistence
|
||||
.begin_transaction(|transaction| {
|
||||
let _ = transaction.move_app(app_id, from, to)?;
|
||||
transaction.move_app(app_id, from, to)?;
|
||||
let app = transaction.read_app(app_id)?;
|
||||
let _ = notify_apps_changed(&app.workspace_id, self.trash_controller.clone(), &transaction)?;
|
||||
notify_apps_changed(&app.workspace_id, self.trash_controller.clone(), &transaction)?;
|
||||
Ok(())
|
||||
})
|
||||
.await?;
|
||||
|
@ -3,6 +3,7 @@ pub mod rev_sqlite;
|
||||
pub mod version_1;
|
||||
mod version_2;
|
||||
|
||||
use crate::services::persistence::rev_sqlite::SQLiteFolderRevisionPersistence;
|
||||
use crate::{
|
||||
event_map::WorkspaceDatabase,
|
||||
manager::FolderId,
|
||||
@ -11,12 +12,10 @@ use crate::{
|
||||
use flowy_database::ConnectionPool;
|
||||
use flowy_error::{FlowyError, FlowyResult};
|
||||
use flowy_http_model::revision::Revision;
|
||||
use flowy_revision::disk::{RevisionDiskCache, RevisionState, SyncRecord};
|
||||
use flowy_revision_persistence::{RevisionDiskCache, RevisionState, SyncRecord};
|
||||
use flowy_sync::client_folder::FolderPad;
|
||||
use folder_rev_model::{AppRevision, TrashRevision, ViewRevision, WorkspaceRevision};
|
||||
|
||||
use crate::services::persistence::rev_sqlite::SQLiteFolderRevisionPersistence;
|
||||
use flowy_sync::server_folder::FolderOperationsBuilder;
|
||||
use folder_rev_model::{AppRevision, TrashRevision, ViewRevision, WorkspaceRevision};
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::RwLock;
|
||||
pub use version_1::{app_sql::*, trash_sql::*, v1_impl::V1Transaction, view_sql::*, workspace_sql::*};
|
||||
|
@ -9,7 +9,7 @@ use flowy_database::{
|
||||
use flowy_error::{internal_error, FlowyError, FlowyResult};
|
||||
use flowy_http_model::revision::{Revision, RevisionRange};
|
||||
use flowy_http_model::util::md5;
|
||||
use flowy_revision::disk::{RevisionChangeset, RevisionDiskCache, RevisionState, SyncRecord};
|
||||
use flowy_revision_persistence::{RevisionChangeset, RevisionDiskCache, RevisionState, SyncRecord};
|
||||
use std::sync::Arc;
|
||||
|
||||
pub struct SQLiteFolderRevisionPersistence {
|
||||
@ -22,7 +22,7 @@ impl RevisionDiskCache<Arc<ConnectionPool>> for SQLiteFolderRevisionPersistence
|
||||
|
||||
fn create_revision_records(&self, revision_records: Vec<SyncRecord>) -> Result<(), Self::Error> {
|
||||
let conn = self.pool.get().map_err(internal_error)?;
|
||||
FolderRevisionSql::create(revision_records, &*conn)?;
|
||||
FolderRevisionSql::create(revision_records, &conn)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -54,7 +54,7 @@ impl RevisionDiskCache<Arc<ConnectionPool>> for SQLiteFolderRevisionPersistence
|
||||
let conn = &*self.pool.get().map_err(internal_error)?;
|
||||
conn.immediate_transaction::<_, FlowyError, _>(|| {
|
||||
for changeset in changesets {
|
||||
let _ = FolderRevisionSql::update(changeset, conn)?;
|
||||
FolderRevisionSql::update(changeset, conn)?;
|
||||
}
|
||||
Ok(())
|
||||
})?;
|
||||
@ -75,8 +75,8 @@ impl RevisionDiskCache<Arc<ConnectionPool>> for SQLiteFolderRevisionPersistence
|
||||
) -> Result<(), Self::Error> {
|
||||
let conn = self.pool.get().map_err(internal_error)?;
|
||||
conn.immediate_transaction::<_, FlowyError, _>(|| {
|
||||
FolderRevisionSql::delete(object_id, deleted_rev_ids, &*conn)?;
|
||||
FolderRevisionSql::create(inserted_records, &*conn)?;
|
||||
FolderRevisionSql::delete(object_id, deleted_rev_ids, &conn)?;
|
||||
FolderRevisionSql::create(inserted_records, &conn)?;
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
#![allow(clippy::unused_unit)]
|
||||
use bytes::Bytes;
|
||||
use flowy_database::{
|
||||
prelude::*,
|
||||
|
@ -15,7 +15,7 @@ pub struct V1Transaction<'a>(pub &'a DBConnection);
|
||||
|
||||
impl<'a> FolderPersistenceTransaction for V1Transaction<'a> {
|
||||
fn create_workspace(&self, user_id: &str, workspace_rev: WorkspaceRevision) -> FlowyResult<()> {
|
||||
WorkspaceTableSql::create_workspace(user_id, workspace_rev, &*self.0)?;
|
||||
WorkspaceTableSql::create_workspace(user_id, workspace_rev, self.0)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -34,12 +34,12 @@ impl<'a> FolderPersistenceTransaction for V1Transaction<'a> {
|
||||
}
|
||||
|
||||
fn create_app(&self, app_rev: AppRevision) -> FlowyResult<()> {
|
||||
AppTableSql::create_app(app_rev, &*self.0)?;
|
||||
AppTableSql::create_app(app_rev, self.0)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn update_app(&self, changeset: AppChangeset) -> FlowyResult<()> {
|
||||
AppTableSql::update_app(changeset, &*self.0)?;
|
||||
AppTableSql::update_app(changeset, self.0)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -64,7 +64,7 @@ impl<'a> FolderPersistenceTransaction for V1Transaction<'a> {
|
||||
}
|
||||
|
||||
fn create_view(&self, view_rev: ViewRevision) -> FlowyResult<()> {
|
||||
ViewTableSql::create_view(view_rev, &*self.0)?;
|
||||
ViewTableSql::create_view(view_rev, self.0)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -80,13 +80,13 @@ impl<'a> FolderPersistenceTransaction for V1Transaction<'a> {
|
||||
}
|
||||
|
||||
fn update_view(&self, changeset: ViewChangeset) -> FlowyResult<()> {
|
||||
ViewTableSql::update_view(changeset, &*self.0)?;
|
||||
ViewTableSql::update_view(changeset, self.0)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn delete_view(&self, view_id: &str) -> FlowyResult<ViewRevision> {
|
||||
let view_revision: ViewRevision = ViewTableSql::read_view(view_id, self.0)?.into();
|
||||
ViewTableSql::delete_view(view_id, &*self.0)?;
|
||||
ViewTableSql::delete_view(view_id, self.0)?;
|
||||
Ok(view_revision)
|
||||
}
|
||||
|
||||
@ -95,7 +95,7 @@ impl<'a> FolderPersistenceTransaction for V1Transaction<'a> {
|
||||
}
|
||||
|
||||
fn create_trash(&self, trashes: Vec<TrashRevision>) -> FlowyResult<()> {
|
||||
TrashTableSql::create_trash(trashes, &*self.0)?;
|
||||
TrashTableSql::create_trash(trashes, self.0)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -114,7 +114,7 @@ impl<'a> FolderPersistenceTransaction for V1Transaction<'a> {
|
||||
None => TrashTableSql::delete_all(self.0),
|
||||
Some(trash_ids) => {
|
||||
for trash_id in &trash_ids {
|
||||
TrashTableSql::delete_trash(trash_id, &*self.0)?;
|
||||
TrashTableSql::delete_trash(trash_id, self.0)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -168,7 +168,7 @@ impl TrashController {
|
||||
|
||||
self.persistence
|
||||
.begin_transaction(|transaction| {
|
||||
let _ = transaction.create_trash(trash_revs.clone())?;
|
||||
transaction.create_trash(trash_revs.clone())?;
|
||||
let _ = self.create_trash_on_server(trash_revs);
|
||||
|
||||
notify_trash_changed(transaction.read_trash(None)?);
|
||||
|
@ -238,9 +238,9 @@ impl ViewController {
|
||||
pub(crate) async fn move_view(&self, view_id: &str, from: usize, to: usize) -> Result<(), FlowyError> {
|
||||
self.persistence
|
||||
.begin_transaction(|transaction| {
|
||||
let _ = transaction.move_view(view_id, from, to)?;
|
||||
transaction.move_view(view_id, from, to)?;
|
||||
let view = transaction.read_view(view_id)?;
|
||||
let _ = notify_views_changed(&view.app_id, self.trash_controller.clone(), &transaction)?;
|
||||
notify_views_changed(&view.app_id, self.trash_controller.clone(), &transaction)?;
|
||||
Ok(())
|
||||
})
|
||||
.await?;
|
||||
|
@ -122,7 +122,7 @@ fn read_workspaces_on_server(
|
||||
for workspace_rev in &workspace_revs {
|
||||
let m_workspace = workspace_rev.clone();
|
||||
let app_revs = m_workspace.apps.clone();
|
||||
let _ = transaction.create_workspace(&user_id, m_workspace)?;
|
||||
transaction.create_workspace(&user_id, m_workspace)?;
|
||||
tracing::trace!("Save {} apps", app_revs.len());
|
||||
for app_rev in app_revs {
|
||||
let view_revs = app_rev.belongings.clone();
|
||||
|
@ -1,7 +1,7 @@
|
||||
use crate::script::{invalid_workspace_name_test_case, FolderScript::*, FolderTest};
|
||||
use flowy_folder::entities::view::ViewDataFormatPB;
|
||||
use flowy_folder::entities::workspace::CreateWorkspacePayloadPB;
|
||||
use flowy_revision::disk::RevisionState;
|
||||
use flowy_revision_persistence::RevisionState;
|
||||
use flowy_test::{event_builder::*, FlowySDKTest};
|
||||
|
||||
#[tokio::test]
|
||||
|
@ -15,8 +15,8 @@ use flowy_folder::entities::{
|
||||
};
|
||||
use flowy_folder::event_map::FolderEvent::*;
|
||||
use flowy_folder::{errors::ErrorCode, services::folder_editor::FolderEditor};
|
||||
use flowy_revision::disk::RevisionState;
|
||||
use flowy_revision::REVISION_WRITE_INTERVAL_IN_MILLIS;
|
||||
use flowy_revision_persistence::RevisionState;
|
||||
use flowy_test::{event_builder::*, FlowySDKTest};
|
||||
use std::{sync::Arc, time::Duration};
|
||||
use tokio::time::sleep;
|
||||
@ -259,13 +259,12 @@ pub async fn create_workspace(sdk: &FlowySDKTest, name: &str, desc: &str) -> Wor
|
||||
desc: desc.to_owned(),
|
||||
};
|
||||
|
||||
let workspace = FolderEventBuilder::new(sdk.clone())
|
||||
FolderEventBuilder::new(sdk.clone())
|
||||
.event(CreateWorkspace)
|
||||
.payload(request)
|
||||
.async_send()
|
||||
.await
|
||||
.parse::<WorkspacePB>();
|
||||
workspace
|
||||
.parse::<WorkspacePB>()
|
||||
}
|
||||
|
||||
pub async fn read_workspace(sdk: &FlowySDKTest, workspace_id: Option<String>) -> Vec<WorkspacePB> {
|
||||
@ -300,13 +299,12 @@ pub async fn create_app(sdk: &FlowySDKTest, workspace_id: &str, name: &str, desc
|
||||
color_style: Default::default(),
|
||||
};
|
||||
|
||||
let app = FolderEventBuilder::new(sdk.clone())
|
||||
FolderEventBuilder::new(sdk.clone())
|
||||
.event(CreateApp)
|
||||
.payload(create_app_request)
|
||||
.async_send()
|
||||
.await
|
||||
.parse::<AppPB>();
|
||||
app
|
||||
.parse::<AppPB>()
|
||||
}
|
||||
|
||||
pub async fn read_app(sdk: &FlowySDKTest, app_id: &str) -> AppPB {
|
||||
@ -314,14 +312,12 @@ pub async fn read_app(sdk: &FlowySDKTest, app_id: &str) -> AppPB {
|
||||
value: app_id.to_owned(),
|
||||
};
|
||||
|
||||
let app = FolderEventBuilder::new(sdk.clone())
|
||||
FolderEventBuilder::new(sdk.clone())
|
||||
.event(ReadApp)
|
||||
.payload(request)
|
||||
.async_send()
|
||||
.await
|
||||
.parse::<AppPB>();
|
||||
|
||||
app
|
||||
.parse::<AppPB>()
|
||||
}
|
||||
|
||||
pub async fn update_app(sdk: &FlowySDKTest, app_id: &str, name: Option<String>, desc: Option<String>) {
|
||||
@ -369,13 +365,12 @@ pub async fn create_view(
|
||||
layout,
|
||||
view_content_data: vec![],
|
||||
};
|
||||
let view = FolderEventBuilder::new(sdk.clone())
|
||||
FolderEventBuilder::new(sdk.clone())
|
||||
.event(CreateView)
|
||||
.payload(request)
|
||||
.async_send()
|
||||
.await
|
||||
.parse::<ViewPB>();
|
||||
view
|
||||
.parse::<ViewPB>()
|
||||
}
|
||||
|
||||
pub async fn read_view(sdk: &FlowySDKTest, view_id: &str) -> ViewPB {
|
||||
|
Reference in New Issue
Block a user