From 8e57253ed14474aefb063683b172447096c11554 Mon Sep 17 00:00:00 2001 From: Alexander Kreft <akreft@trineo.org> Date: Fri, 3 Sep 2021 10:17:02 +0000 Subject: [PATCH] ENH: int and double lists --- src/CaosDB.jl | 1 + src/Entity.jl | 152 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 110 insertions(+), 43 deletions(-) diff --git a/src/CaosDB.jl b/src/CaosDB.jl index a3812ea..b9fac3b 100644 --- a/src/CaosDB.jl +++ b/src/CaosDB.jl @@ -47,6 +47,7 @@ export get_id, get_datatype, get_unit, get_value, + get_property_list_length, get_version_id, get_property, get_properties, diff --git a/src/Entity.jl b/src/Entity.jl index 56b56de..48de9ce 100644 --- a/src/Entity.jl +++ b/src/Entity.jl @@ -34,6 +34,8 @@ export get_id, get_datatype, get_unit, get_value, + get_property_list_length, + get_int_list_value_at, get_version_id, get_property, get_properties, @@ -748,6 +750,22 @@ function get_value(entity::Ref{_Entity}) return unsafe_string(out[]) end +function get_property_list_length(property::Ref{_Property}) + + length = Ref{Cint}(0) + + err_code = ccall( + (:caosdb_entity_property_get_value_list_length, CaosDB.library_name), + Cint, + (Ref{_Property}, Ref{Cint}), + property, + length, + ) + + CaosDB.Exceptions.evaluate_return_code(err_code) + + return length[] +end """ function get_value(entity::Ref{_Property}) @@ -758,56 +776,104 @@ function get_value(property::Ref{_Property}) _caosdb_dtypes = ("INTEGER", "DOUBLE", "BOOLEAN", "TEXT") prop_datatype = get_datatype(property) + is_list = prop_datatype[3] if prop_datatype[1] in _caosdb_dtypes - - if prop_datatype[1] == "INTEGER" - out = Ref{Cint}(0) - err_code = ccall( - (:caosdb_entity_property_get_int_value, CaosDB.library_name), - Cint, - (Ref{_Property}, Ref{Cint}), - property, - out, - ) - - out = out[] - elseif prop_datatype[1] == "DOUBLE" - out = Ref{Cdouble}(0) - err_code = ccall( - (:caosdb_entity_property_get_double_value, CaosDB.library_name), - Cint, - (Ref{_Property}, Ref{Cdouble}), - property, - out, - ) - out = out[] - elseif prop_datatype[1] == "BOOLEAN" - out = Ref{Cint}(0) - err_code = ccall( - (:caosdb_entity_property_get_boolean_value, CaosDB.library_name), - Cint, - (Ref{_Property}, Ref{Cint}), - property, - out, - ) - out = convert(Bool, out[]) - elseif prop_datatype[1] == "TEXT" - out = Ref{Ptr{UInt8}}(Ptr{UInt8}()) - err_code = ccall( - (:caosdb_entity_property_get_string_value, CaosDB.library_name), - Cint, - (Ref{_Property}, Ref{Ptr{UInt8}}), - property, - out, - ) - out = unsafe_string(out[]) + if !is_list + if prop_datatype[1] == "INTEGER" + out = Ref{Cint}(0) + err_code = ccall( + (:caosdb_entity_property_get_int_value, CaosDB.library_name), + Cint, + (Ref{_Property}, Ref{Cint}), + property, + out, + ) + + out = out[] + elseif prop_datatype[1] == "DOUBLE" + out = Ref{Cdouble}(0) + err_code = ccall( + (:caosdb_entity_property_get_double_value, CaosDB.library_name), + Cint, + (Ref{_Property}, Ref{Cdouble}), + property, + out, + ) + out = out[] + elseif prop_datatype[1] == "BOOLEAN" + out = Ref{Cint}(0) + err_code = ccall( + (:caosdb_entity_property_get_boolean_value, CaosDB.library_name), + Cint, + (Ref{_Property}, Ref{Cint}), + property, + out, + ) + out = convert(Bool, out[]) + elseif prop_datatype[1] == "TEXT" + out = Ref{Ptr{UInt8}}(Ptr{UInt8}()) + err_code = ccall( + (:caosdb_entity_property_get_string_value, CaosDB.library_name), + Cint, + (Ref{_Property}, Ref{Ptr{UInt8}}), + property, + out, + ) + out = unsafe_string(out[]) + end + else + list_length = get_property_list_length(property) + if prop_datatype[1] == "INTEGER" + out = Vector{Cint}() + for i::Cint in 1:list_length + temp = get_int_list_value_at(property, i) + append!(out, temp) + end + elseif prop_datatype[1] == "DOUBLE" + out = Vector{Cdouble}() + for i::Cint in 1:list_length + temp = get_double_list_value_at(property, i) + append!(out, temp) + end + end + end + if @isdefined err_code + CaosDB.Exceptions.evaluate_return_code(err_code) end - CaosDB.Exceptions.evaluate_return_code(err_code) end return out end +function get_int_list_value_at(property::Ref{_Property}, index::Cint) + out = Ref{Cint}(0) + err_code = ccall( + (:caosdb_entity_property_get_int_list_value_at, CaosDB.library_name), + Cint, + (Ref{_Property}, Ref{Cint}, Cint), + property, + out, + index-Cint(1), + ) + + CaosDB.Exceptions.evaluate_return_code(err_code) + return out[] +end + +function get_double_list_value_at(property::Ref{_Property}, index::Cint) + out = Ref{Cdouble}(0) + err_code = ccall( + (:caosdb_entity_property_get_double_list_value_at, CaosDB.library_name), + Cint, + (Ref{_Property}, Ref{Cdouble}, Cint), + property, + out, + index-Cint(1), + ) + + CaosDB.Exceptions.evaluate_return_code(err_code) + return out[] +end """ function get_version_id(entity::Ref{_Entity}) -- GitLab