From d70e76f060802a8e65188c54156a3551b6a78b54 Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Tue, 7 Sep 2021 14:49:15 +0200 Subject: [PATCH] WIP: release result set --- src/Transaction.jl | 95 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 84 insertions(+), 11 deletions(-) diff --git a/src/Transaction.jl b/src/Transaction.jl index d688914..fb8a311 100644 --- a/src/Transaction.jl +++ b/src/Transaction.jl @@ -433,6 +433,46 @@ function get_result_at(results::Ref{_ResultSet}, index::Cint) return entity end +""" + function _release_result_at(results::Ref{_ResultSet}, index::Cint) + +Return the entity at position `index` of the given `results`. + +This function releases the entity from the result set and leaves the result set +in a corrupted state. It should only be used to release the entity from a +result set which is about to be destroyed anyway. +""" +function _release_result_at(results::Ref{_ResultSet}, index::Cint) + + size = release_result_size(results) + + if index > size + throw( + DomainError( + index, + "You tried to access the result at position $index but the result set only has $size results.", + ), + ) + end + + entity = Ref{CaosDB.Entity._Entity}(CaosDB.Entity._Entity()) + + err_code = ccall( + # TODO (fspreck) this is the only difference to get_result_at(...). Is + # there a smart way to reduce the code duplication here? + (:caosdb_transaction_result_set_release_at, CaosDB.library_name), + Cint, + (Ref{_ResultSet}, Ref{CaosDB.Entity._Entity}, Cint), + results, + entity, + index - Cint(1), + ) + + CaosDB.Exceptions.evaluate_return_code(err_code) + + return entity +end + """ function get_result_at(results::Ref{_ResultSet}, index::Integer) @@ -448,7 +488,7 @@ end """ function get_results(result_set::Ref{_ResultSet}) -Return al results of the given `result_set`. +Return all entities of the given `result_set`. """ function get_results(result_set::Ref{_ResultSet}) @@ -469,6 +509,39 @@ function get_results(transaction::Ref{_Transaction}) return get_results(result_set) end +""" + function _release_results(transaction::Ref{_Transaction}) + +Return all results fo the given `transaction`. + +This function also leaves the transaction object in a corrupted state and +should only be used to release the results from a transaction which is about to +be destroyed anyway. +""" +function _release_results(transaction::Ref{_Transaction}) + + result_set = get_result_set(transaction) + + return _release_results(result_set) +end + +""" + function _release_results(transaction::Ref{_ResultSet}) + +Return all entities of the given `result_set`. + +This function also leaves the result_set object in a corrupted state and +should only be used to release the entities from a result_set which is about to +be destroyed anyway. +""" +function _release_results(transaction::Ref{_ResultSet}) + + size = get_result_size(result_set) + + return [_release_result_at(result_set, Cint(ii)) for ii = 1:size] +end + + """ function execute_query( query::AbstractString, @@ -495,7 +568,7 @@ function execute_query(query::AbstractString, name::AbstractString = "default") execute(transaction) - return get_results(transaction) + return _release_results(transaction) end """ @@ -526,7 +599,7 @@ function execute_query( execute(transaction) - return get_results(transaction) + return _release_results(transaction) end """ @@ -544,7 +617,7 @@ function retrieve(id::AbstractString, name::AbstractString = "default") execute(transaction) - return get_results(transaction)[1] + return _release_results(transaction)[1] end """ @@ -561,7 +634,7 @@ function retrieve(id::AbstractString, connection::Ref{CaosDB.Connection._Connect execute(transaction) - return get_results(transaction)[1] + return _release_results(transaction)[1] end """ @@ -585,7 +658,7 @@ function retrieve( execute(transaction) - return get_results(transaction) + return _release_results(transaction) end """ @@ -608,7 +681,7 @@ function retrieve( execute(transaction) - return get_results(transaction) + return _release_results(transaction) end """ function insert_entity(entity::Ref{CaosDB.Entity._Entity}) @@ -620,7 +693,7 @@ function insert_entity(entity::Ref{CaosDB.Entity._Entity}) transaction = create_transaction() add_insert_entity(transaction, entity) execute(transaction) - return get_results(transaction) + return _release_results(transaction) end """ function update_entity(entity::Ref{CaosDB.Entity._Entity}) @@ -632,7 +705,7 @@ function update_entity(entity::Ref{CaosDB.Entity._Entity}) transaction = create_transaction() add_update_entity(transaction, entity) execute(transaction) - return get_results(transaction) + return _release_results(transaction) end """ function delete_by_id(id::AbstractString) @@ -644,7 +717,7 @@ function delete_by_id(id::AbstractString) transaction = create_transaction() add_delete_by_id(transaction, id) execute(transaction) - return get_results(transaction) + return _release_results(transaction) end """ function retrieve_and_download_file_by_id( @@ -659,7 +732,7 @@ function retrieve_and_download_file_by_id(id::AbstractString, download_path::Abs transaction = create_transaction() add_retrieve_and_download_file_by_id(transaction, id, download_path) execute(transaction) - return get_results(transaction) + return _release_results(transaction) end end # Transaction -- GitLab