From 223e231c06d7bb1596b49a99095dde8b13542439 Mon Sep 17 00:00:00 2001
From: florian <f.spreckelsen@inidscale.com>
Date: Mon, 20 Sep 2021 09:56:50 +0200
Subject: [PATCH] ENH: Add creators for values and datatypes

---
 src/Entity.jl | 157 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 153 insertions(+), 4 deletions(-)

diff --git a/src/Entity.jl b/src/Entity.jl
index 22cf081..ee18834 100644
--- a/src/Entity.jl
+++ b/src/Entity.jl
@@ -490,7 +490,30 @@ function create_atomic_datatype(name::AbstractString)
         Cint,
         (Ref{_DataType}, Cstring),
         datatype,
-        name
+        name,
+    )
+
+    CaosDB.Exceptions.evaluate_return_code(err_code)
+
+    return datatype
+end
+
+"""
+    function create_reference_datatype(name::AbstractString)
+
+Create and return a DataType object with a reference datatype specified by
+`name`.
+"""
+function create_reference_datatype(name::AbstractString)
+
+    datatype = Ref{_DataType}(_DataType(true))
+
+    err_code = ccall(
+        (:caosdb_entity_create_reference_datatype, CaosDB.library_name),
+        Cint,
+        (Ref{_DataType}, Cstring),
+        datatype,
+        name,
     )
 
     CaosDB.Exceptions.evaluate_return_code(err_code)
@@ -498,11 +521,137 @@ function create_atomic_datatype(name::AbstractString)
     return datatype
 end
 
-function create_reference_datatype(name::AbstractString) end
+"""
+    function create_atomic_list_datatype(name::AbstractString)
+
+Create and return a DataType object which is a list of atomics specified by
+`name`.
+"""
+function create_atomic_list_datatype(name::AbstractString)
+
+    datatype = Ref{_DataType}(_DataType(true))
 
-function create_list_of_atomic_datatype(name::AbstractString) end
+    err_code = ccall(
+        (:caosdb_entity_create_atomic_list_datatype, CaosDB.library_name),
+        Cint,
+        (Ref{_DataType}, Cstring),
+        datatype,
+        name,
+    )
+
+    CaosDB.Exceptions.evaluate_return_code(err_code)
+
+    return datatype
+end
+
+"""
+    function create_list_of_reference_datatype(name::AbstractString)
+
+Create and return a DataType object which is a list of references specified by
+`name`.
+"""
+function create_list_of_reference_datatype(name::AbstractString)
+
+    datatype = Ref{_DataType}(_DataType(true))
+
+    err_code = ccall(
+        (:caosdb_entity_create_reference_list_datatype, CaosDB.library_name),
+        Cint,
+        (Ref{_DataType}, Cstring),
+        datatype,
+        name,
+    )
 
-function create_list_of_reference_datatype(name::AbstractString) end
+    CaosDB.Exceptions.evaluate_return_code(err_code)
+
+    return datatype
+end
+
+function create_value(
+    value::Union{AbstractString,Number,Bool,Vactor{T}},
+) where {T<:Union{AbstractString,Number,Bool}}
+
+    in_type = typeof(value)
+    out = Ref{_Value}(_Value(true))
+    if in_type <: AbstractString
+        err_code = ccall(
+            (:caosdb_entity_create_string_value, CaosDB.library_name),
+            Cint,
+            (Ref{_Value}, Cstring),
+            out,
+            value,
+        )
+    elseif in_type <: Bool
+        err_code = ccall(
+            (:caosdb_entity_create_bool_value, CaosDB.library_name),
+            Cint,
+            (Ref{_Value}, Bool),
+            out,
+            value,
+        )
+    elseif in_type <: Integer
+        err_code = ccall(
+            (:caosdb_entity_create_bool_value, CaosDB.library_name),
+            Cint,
+            (Ref{_Value}, Clong),
+            out,
+            Clong(value),
+        )
+    elseif in_type <: Number
+        err_code = ccall(
+            (:caosdb_entity_create_bool_value, CaosDB.library_name),
+            Cint,
+            (Ref{_Value}, Cdouble),
+            out,
+            Cdouble(value),
+        )
+    elseif in_type <: Vector{T} where {T<:AbstractString}
+        err_code = ccall(
+            (:caosdb_entity_create_string_vector_value, CaosDB.library_name),
+            Cint,
+            (Ref{_Value}, Ptr{Ptr{Cchar}}, Cint),
+            out,
+            value,
+            Cint(length(value)),
+        )
+    elseif in_type <: Vector{T} where {T<:Bool}
+        err_code = ccall(
+            (:caosdb_entity_create_bool_vector_value, CaosDB.library_name),
+            Cint,
+            (Ref{_Value}, Ptr{Bool}, Cint),
+            out,
+            value,
+            Cint(length(value)),
+        )
+    elseif in_type <: Vector{T} where {T<:Integer}
+        err_code = ccall(
+            (:caosdb_entity_create_int_vector_value, CaosDB.library_name),
+            Cint,
+            (Ref{_Value}, Ptr{Clong}, Cint),
+            out,
+            Vector{Clong}(value),
+            Cint(length(value)),
+        )
+    elseif in_type <: Vector{T} where {T<:Number}
+        err_code = ccall(
+            (:caosdb_entity_create_double_vector_value, CaosDB.library_name),
+            Cint,
+            (Ref{_Value}, Ptr{Cdouble}, Cint),
+            out,
+            Vector{Cdouble}(value),
+            Cint(length(value)),
+        )
+    else
+        # Should never enter here but treat it just in case
+        @throw ArgumentError(
+            "The argument of type $in_type couldn't be converted into a valid CaosDB value object.",
+        )
+    end
+
+    CaosDB.Exceptions.evaluate_return_code(err_code)
+
+    return out
+end
 
 """
     function get_id(entity::Ref{_Entity})
-- 
GitLab