add some simple replica functions

This commit is contained in:
Dustin J. Mitchell 2022-02-10 01:18:50 +00:00
parent 1c734851ae
commit b01285d780
4 changed files with 70 additions and 4 deletions

View file

@ -31,6 +31,24 @@ static void test_replica_undo_empty(void) {
tc_replica_free(rep); tc_replica_free(rep);
} }
// adding an undo point succeeds
static void test_replica_add_undo_point(void) {
TCReplica *rep = tc_replica_new_in_memory();
TEST_ASSERT_NULL(tc_replica_error(rep));
TEST_ASSERT_EQUAL(TC_RESULT_OK, tc_replica_add_undo_point(rep, true));
TEST_ASSERT_NULL(tc_replica_error(rep));
tc_replica_free(rep);
}
// rebuilding working set succeeds
static void test_replica_rebuild_working_set(void) {
TCReplica *rep = tc_replica_new_in_memory();
TEST_ASSERT_NULL(tc_replica_error(rep));
TEST_ASSERT_EQUAL(TC_RESULT_OK, tc_replica_rebuild_working_set(rep, true));
TEST_ASSERT_NULL(tc_replica_error(rep));
tc_replica_free(rep);
}
// When tc_replica_undo is passed NULL for undone_out, it still succeeds // When tc_replica_undo is passed NULL for undone_out, it still succeeds
static void test_replica_undo_empty_null_undone_out(void) { static void test_replica_undo_empty_null_undone_out(void) {
TCReplica *rep = tc_replica_new_in_memory(); TCReplica *rep = tc_replica_new_in_memory();
@ -190,6 +208,8 @@ int replica_tests(void) {
RUN_TEST(test_replica_creation); RUN_TEST(test_replica_creation);
RUN_TEST(test_replica_creation_disk); RUN_TEST(test_replica_creation_disk);
RUN_TEST(test_replica_undo_empty); RUN_TEST(test_replica_undo_empty);
RUN_TEST(test_replica_add_undo_point);
RUN_TEST(test_replica_rebuild_working_set);
RUN_TEST(test_replica_undo_empty_null_undone_out); RUN_TEST(test_replica_undo_empty_null_undone_out);
RUN_TEST(test_replica_task_creation); RUN_TEST(test_replica_task_creation);
RUN_TEST(test_replica_all_tasks); RUN_TEST(test_replica_all_tasks);

View file

@ -271,6 +271,40 @@ pub unsafe extern "C" fn tc_replica_undo<'a>(
) )
} }
/// Add an UndoPoint, if one has not already been added by this Replica. This occurs automatically
/// when a change is made. The `force` flag allows forcing a new UndoPoint even if one has already
/// been created by this Replica, and may be useful when a Replica instance is held for a long time
/// and used to apply more than one user-visible change.
#[no_mangle]
pub unsafe extern "C" fn tc_replica_add_undo_point(rep: *mut TCReplica, force: bool) -> TCResult {
wrap(
rep,
|rep| {
rep.add_undo_point(force)?;
Ok(TCResult::Ok)
},
TCResult::Error,
)
}
/// Rebuild this replica's working set, based on whether tasks are pending or not. If `renumber`
/// is true, then existing tasks may be moved to new working-set indices; in any case, on
/// completion all pending tasks are in the working set and all non- pending tasks are not.
#[no_mangle]
pub unsafe extern "C" fn tc_replica_rebuild_working_set(
rep: *mut TCReplica,
renumber: bool,
) -> TCResult {
wrap(
rep,
|rep| {
rep.rebuild_working_set(renumber)?;
Ok(TCResult::Ok)
},
TCResult::Error,
)
}
/// Get the latest error for a replica, or NULL if the last operation succeeded. Subsequent calls /// Get the latest error for a replica, or NULL if the last operation succeeded. Subsequent calls
/// to this function will return NULL. The rep pointer must not be NULL. The caller must free the /// to this function will return NULL. The rep pointer must not be NULL. The caller must free the
/// returned string. /// returned string.
@ -297,6 +331,3 @@ pub unsafe extern "C" fn tc_replica_free(rep: *mut TCReplica) {
} }
drop(replica); drop(replica);
} }
// TODO: tc_replica_rebuild_working_set
// TODO: tc_replica_add_undo_point

View file

@ -253,6 +253,21 @@ struct TCTask *tc_replica_import_task_with_uuid(struct TCReplica *rep, struct TC
*/ */
TCResult tc_replica_undo(struct TCReplica *rep, int32_t *undone_out); TCResult tc_replica_undo(struct TCReplica *rep, int32_t *undone_out);
/**
* Add an UndoPoint, if one has not already been added by this Replica. This occurs automatically
* when a change is made. The `force` flag allows forcing a new UndoPoint even if one has already
* been created by this Replica, and may be useful when a Replica instance is held for a long time
* and used to apply more than one user-visible change.
*/
TCResult tc_replica_add_undo_point(struct TCReplica *rep, bool force);
/**
* Rebuild this replica's working set, based on whether tasks are pending or not. If `renumber`
* is true, then existing tasks may be moved to new working-set indices; in any case, on
* completion all pending tasks are in the working set and all non- pending tasks are not.
*/
TCResult tc_replica_rebuild_working_set(struct TCReplica *rep, bool renumber);
/** /**
* Get the latest error for a replica, or NULL if the last operation succeeded. Subsequent calls * Get the latest error for a replica, or NULL if the last operation succeeded. Subsequent calls
* to this function will return NULL. The rep pointer must not be NULL. The caller must free the * to this function will return NULL. The rep pointer must not be NULL. The caller must free the

View file

@ -177,7 +177,7 @@ impl Replica {
/// Add an UndoPoint, if one has not already been added by this Replica. This occurs /// Add an UndoPoint, if one has not already been added by this Replica. This occurs
/// automatically when a change is made. The `force` flag allows forcing a new UndoPoint /// automatically when a change is made. The `force` flag allows forcing a new UndoPoint
/// even if one has laready been created by this Replica, and may be useful when a Replica /// even if one has already been created by this Replica, and may be useful when a Replica
/// instance is held for a long time and used to apply more than one user-visible change. /// instance is held for a long time and used to apply more than one user-visible change.
pub fn add_undo_point(&mut self, force: bool) -> anyhow::Result<()> { pub fn add_undo_point(&mut self, force: bool) -> anyhow::Result<()> {
if force || !self.added_undo_point { if force || !self.added_undo_point {