diff --git a/c/terminus_store.c b/c/terminus_store.c index 29daacf..2bb3e1d 100644 --- a/c/terminus_store.c +++ b/c/terminus_store.c @@ -496,9 +496,15 @@ static foreign_t pl_layer_parent(term_t layer_term, term_t parent_term) { PL_fail; } - void* parent = layer_parent(layer); + char* err; + void* parent = layer_parent(layer, &err); if (parent == NULL) { - PL_fail; + if (err) { + return throw_rust_err(err); + } + else { + PL_fail; + } } PL_unify_blob(parent_term, parent, 0, &layer_blob_type); diff --git a/c/terminus_store.h b/c/terminus_store.h index 53ba7bf..3666394 100644 --- a/c/terminus_store.h +++ b/c/terminus_store.h @@ -46,10 +46,10 @@ void builder_add_string_value_triple(void *builder, char *object_ptr, char **err); -void *builder_commit(void *builder, char **err); - void builder_apply_delta(void *builder, void *layer, char **err); +void *builder_commit(void *builder, char **err); + bool builder_committed(void *builder); bool builder_remove_id_triple(void *builder, @@ -204,9 +204,7 @@ void *layer_objects_iter(void *layer); void *layer_open_write(void *layer, char **err); -void *layer_parent(void *layer); - -void *layer_squash(void *layer, char **err); +void *layer_parent(void *layer, char **err); void *layer_predicate_additions_iter(void *layer); @@ -218,6 +216,8 @@ void *layer_predicate_removals_iter(void *layer); void *layer_predicates_iter(void *layer); +void *layer_squash(void *layer, char **err); + bool layer_string_to_id(const char *name_ptr, uint32_t (*result)[5], char **err); void *layer_subject_additions_iter(void *layer); @@ -238,6 +238,8 @@ uintptr_t layer_triple_addition_count(void *layer); uintptr_t layer_triple_removal_count(void *layer); +bool named_graph_force_set_head(void *named_graph, void *layer_ptr, char **err); + void *named_graph_get_head(void *named_graph, char **err); char *named_graph_get_name(void *named_graph); @@ -246,8 +248,6 @@ void *named_graph_open_write(void *named_graph, char **err); bool named_graph_set_head(void *named_graph, void *layer_ptr, char **err); -bool named_graph_force_set_head(void *named_graph, void *layer_ptr, char **err); - bool object_lookup_lookup_subject_predicate_pair(void *object_lookup, uint64_t subject, uint64_t predicate); diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 460c46d..7a6420b 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -9,4 +9,4 @@ name = "terminus_store_prolog" crate-type = ["cdylib"] [dependencies] -terminus-store = "0.11.5" \ No newline at end of file +terminus-store = "0.11.6" \ No newline at end of file diff --git a/rust/src/lib.rs b/rust/src/lib.rs index a18f829..8c9a931 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -388,10 +388,15 @@ pub unsafe extern "C" fn builder_apply_delta( } #[no_mangle] -pub unsafe extern "C" fn layer_parent(layer: *mut SyncStoreLayer) -> *mut SyncStoreLayer { +pub unsafe extern "C" fn layer_parent(layer: *mut SyncStoreLayer, err: *mut *mut c_char) -> *mut SyncStoreLayer { + *err = std::ptr::null_mut(); match (*layer).parent() { - Some(parent) => Box::into_raw(Box::new(parent)), - None => std::ptr::null_mut(), + Ok(Some(parent)) => Box::into_raw(Box::new(parent)), + Ok(None) => std::ptr::null_mut(), + Err(e) => { + *err = error_to_cstring(e).into_raw(); + std::ptr::null_mut() + } } }