diff --git a/src/CaosDB.jl b/src/CaosDB.jl index a3812ea254853e72e2276704a1c0174e5ff6c266..b9fac3bb3a5c0fdbee41760a5258a21ea615660f 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 56b56de557a791e25396d760487c9e9bf8b5af64..48de9cedb95985364b771016779cea20522b0464 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})