mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
Feat/restore from snapshot (#1699)
* feat: snapshot for folder * feat: snapshot for document Co-authored-by: nathan <nathan@appflowy.io>
This commit is contained in:
@ -170,7 +170,7 @@ impl FolderManager {
|
||||
let pool = self.persistence.db_pool()?;
|
||||
let object_id = folder_id.as_ref();
|
||||
let disk_cache = SQLiteFolderRevisionPersistence::new(user_id, pool.clone());
|
||||
let configuration = RevisionPersistenceConfiguration::new(100, false);
|
||||
let configuration = RevisionPersistenceConfiguration::new(200, false);
|
||||
let rev_persistence = RevisionPersistence::new(user_id, object_id, disk_cache, configuration);
|
||||
let rev_compactor = FolderRevisionMergeable();
|
||||
|
||||
|
@ -9,7 +9,8 @@ use flowy_revision::{
|
||||
RevisionWebSocket,
|
||||
};
|
||||
use flowy_sync::client_folder::{FolderChangeset, FolderPad};
|
||||
use flowy_sync::util::make_operations_from_revisions;
|
||||
use flowy_sync::server_folder::FolderOperations;
|
||||
use flowy_sync::util::{make_operations_from_revisions, recover_operation_from_revisions};
|
||||
use lib_infra::future::FutureResult;
|
||||
use lib_ot::core::EmptyAttributes;
|
||||
use parking_lot::RwLock;
|
||||
@ -102,8 +103,19 @@ impl RevisionObjectDeserializer for FolderRevisionSerde {
|
||||
type Output = FolderPad;
|
||||
|
||||
fn deserialize_revisions(_object_id: &str, revisions: Vec<Revision>) -> FlowyResult<Self::Output> {
|
||||
let pad = FolderPad::from_revisions(revisions)?;
|
||||
Ok(pad)
|
||||
let operations: FolderOperations = make_operations_from_revisions(revisions)?;
|
||||
Ok(FolderPad::from_operations(operations)?)
|
||||
}
|
||||
|
||||
fn recover_operations_from_revisions(revisions: Vec<Revision>) -> Option<Self::Output> {
|
||||
if let Some(operations) = recover_operation_from_revisions(revisions, |operations| {
|
||||
FolderPad::from_operations(operations.clone()).is_ok()
|
||||
}) {
|
||||
if let Ok(pad) = FolderPad::from_operations(operations) {
|
||||
return Some(pad);
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -123,7 +123,7 @@ fn migration_flag_key(user_id: &str, version: &str) -> String {
|
||||
md5(format!("{}{}", user_id, version,))
|
||||
}
|
||||
|
||||
pub struct FolderRevisionResettable {
|
||||
struct FolderRevisionResettable {
|
||||
folder_id: String,
|
||||
}
|
||||
|
||||
|
@ -118,12 +118,12 @@ impl FolderPersistence {
|
||||
write_to_disk: true,
|
||||
};
|
||||
|
||||
let disk_cache = mk_text_block_revision_disk_cache(user_id, pool);
|
||||
let disk_cache = make_folder_revision_disk_cache(user_id, pool);
|
||||
disk_cache.delete_and_insert_records(folder_id.as_ref(), None, vec![record])
|
||||
}
|
||||
}
|
||||
|
||||
pub fn mk_text_block_revision_disk_cache(
|
||||
pub fn make_folder_revision_disk_cache(
|
||||
user_id: &str,
|
||||
pool: Arc<ConnectionPool>,
|
||||
) -> Arc<dyn RevisionDiskCache<Arc<ConnectionPool>, Error = FlowyError>> {
|
||||
|
@ -65,7 +65,7 @@ impl RevisionSnapshotDiskCache for SQLiteFolderRevisionSnapshotPersistence {
|
||||
let conn = self.pool.get().map_err(internal_error)?;
|
||||
let latest_record = dsl::folder_rev_snapshot
|
||||
.filter(dsl::object_id.eq(&self.object_id))
|
||||
.order(dsl::rev_id.desc())
|
||||
.order(dsl::timestamp.desc())
|
||||
// .select(max(dsl::rev_id))
|
||||
// .select((dsl::id, dsl::object_id, dsl::rev_id, dsl::data))
|
||||
.first::<FolderSnapshotRecord>(&*conn)?;
|
@ -1,5 +1,5 @@
|
||||
mod folder_rev_sqlite;
|
||||
mod folder_snapshot_sqlite_impl;
|
||||
mod folder_snapshot;
|
||||
|
||||
pub use folder_rev_sqlite::*;
|
||||
pub use folder_snapshot_sqlite_impl::*;
|
||||
pub use folder_snapshot::*;
|
||||
|
Reference in New Issue
Block a user