From 45dabd8416395294270b78f1b8e45ec6f6af25fe Mon Sep 17 00:00:00 2001
From: florian <f.spreckelsen@inidscale.com>
Date: Thu, 12 Aug 2021 10:10:02 +0200
Subject: [PATCH] DRAFT: Begin implementation of entities

---
 src/CaosDB.jl |   2 +-
 src/Entity.jl | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 148 insertions(+), 1 deletion(-)
 create mode 100644 src/Entity.jl

diff --git a/src/CaosDB.jl b/src/CaosDB.jl
index 5cc7367..92ba077 100644
--- a/src/CaosDB.jl
+++ b/src/CaosDB.jl
@@ -214,7 +214,7 @@ end # Authentication
 
 include("Connection.jl")
 
-module Entity end
+include("Entity.jl")
 
 include("Transaction.jl")
 
diff --git a/src/Entity.jl b/src/Entity.jl
new file mode 100644
index 0000000..8e059a6
--- /dev/null
+++ b/src/Entity.jl
@@ -0,0 +1,147 @@
+# ** header v3.0
+# This file is a part of the CaosDB Project.
+#
+# Copyright (C) 2021 Indiscale GmbH <info@indiscale.com>
+# Copyright (C) 2021 Florian Spreckelsen <f.spreckelsen@indiscale.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public
+# License along with this program. If not, see
+# <https://www.gnu.org/licenses/>.
+#
+# ** end header
+#
+module Entity
+
+export create_entity,
+    create_parent, create_property, create_property_entity, create_record, create_recordtype
+
+export get_id, get_role, get_name
+
+export set_id, set_role, set_name
+
+using CaosDB
+
+""" 
+Struct containing a pointer to the wrapped cpp entity
+object. Meant for internal use; use `CaosDB.Entity.create_entity` to
+create an entity. 
+"""
+mutable struct _Entity
+    wrapped_entity::Ptr{Cvoid}
+
+    function _Entity(managed_by_julia::Bool = false)
+
+        entity = new()
+
+        if managed_by_julia
+            function f(t)
+                ccall(
+                    (:caosdb_entity_delete_entity, CaosDB.library_name),
+                    Cint,
+                    (Ref{_Entity},),
+                    Ref{_Entity}(t),
+                )
+            end
+            finalizer(f, entity)
+        end
+
+        return entity
+    end
+end
+
+
+""" 
+Struct containing a pointer to the wrapped cpp parent
+object. Meant for internal use; use `CaosDB.Entity.create_parent` to
+create an parent. 
+"""
+mutable struct _Parent
+    wrapped_parent::Ptr{Cvoid}
+
+    function _Parent(managed_by_julia::Bool = false)
+
+        parent = new()
+
+        if managed_by_julia
+            function f(t)
+                ccall(
+                    (:caosdb_entity_delete_parent, CaosDB.library_name),
+                    Cint,
+                    (Ref{_Parent},),
+                    Ref{_Parent}(t),
+                )
+            end
+            finalizer(f, parent)
+        end
+
+        return parent
+    end
+end
+
+
+""" 
+Struct containing a pointer to the wrapped cpp property
+object. Meant for internal use; use `CaosDB.Entity.create_property` to
+create an property. 
+"""
+mutable struct _Property
+    wrapped_property::Ptr{Cvoid}
+
+    function _Property(managed_by_julia::Bool = false)
+
+        property = new()
+
+        if managed_by_julia
+            function f(t)
+                ccall(
+                    (:caosdb_entity_delete_property, CaosDB.library_name),
+                    Cint,
+                    (Ref{_Property},),
+                    Ref{_Property}(t),
+                )
+            end
+            finalizer(f, property)
+        end
+
+        return property
+    end
+end
+
+"""
+    function create_entity(name::AbstractString = "")
+
+Return a new entity object. If a `name` was provided, set the name of
+the entity correspondingly.
+"""
+function create_entity(name::AbstractString = "")
+
+    entity = Ref{_Entity}(_Entity(true))
+
+    err_code = ccall(
+        (:caosdb_entity_create_entity, CaosDB.library_name),
+        Cint,
+        (Ref{_Entity},),
+        entity,
+    )
+
+    CaosDB.Exceptions.evaluate_return_code(err_code)
+
+    if name != ""
+        set_name(entity, name)
+    end
+
+    return entity
+
+end
+
+end
-- 
GitLab