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:
Nathan.fooo
2023-01-12 13:09:08 +08:00
committed by GitHub
parent 860c5d100b
commit 6a36bcd31d
74 changed files with 281 additions and 226 deletions

View File

@ -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"]

View File

@ -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>,

View File

@ -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?;

View File

@ -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::*};

View File

@ -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(())
})
}

View File

@ -1,3 +1,4 @@
#![allow(clippy::unused_unit)]
use bytes::Bytes;
use flowy_database::{
prelude::*,

View File

@ -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(())
}

View File

@ -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)?);

View File

@ -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?;

View File

@ -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();

View File

@ -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]

View File

@ -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 {