added date_type_t, time_type_t and timestamp, ensure allocated postgres resources are released, split repository into basic_repository and repository.
This commit is contained in:
@@ -1,34 +1,30 @@
|
||||
#ifndef SCHEMA_NODE_HPP
|
||||
#define SCHEMA_NODE_HPP
|
||||
#ifndef REPOSITORY_NODE_HPP
|
||||
#define REPOSITORY_NODE_HPP
|
||||
|
||||
#include "matador/object/object_generator.hpp"
|
||||
#include "matador/object/object_info.hpp"
|
||||
#include "matador/object/internal/observer_list_creator.hpp"
|
||||
|
||||
#include "matador/utils/error.hpp"
|
||||
#include "matador/utils/result.hpp"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace matador::object {
|
||||
|
||||
class basic_object_info;
|
||||
class repository;
|
||||
class basic_repository;
|
||||
|
||||
class repository_node final {
|
||||
public:
|
||||
using node_ptr = std::shared_ptr<repository_node>;
|
||||
using node_ptr = repository_node*;
|
||||
template< typename Type>
|
||||
using creator_func = std::function<std::unique_ptr<Type>()>;
|
||||
|
||||
template < typename Type, template<typename> typename... Observers >
|
||||
static std::shared_ptr<repository_node> make_node(repository& repo,
|
||||
static std::unique_ptr<repository_node> make_node(basic_repository& repo,
|
||||
const std::string& name,
|
||||
creator_func<Type> creator,
|
||||
std::vector<std::unique_ptr<observer<Type>>>&& observers);
|
||||
|
||||
static std::shared_ptr<repository_node> make_null_node(repository& repo);
|
||||
|
||||
explicit repository_node(basic_repository& repo);
|
||||
repository_node(const repository_node& other) = delete;
|
||||
repository_node(repository_node&& other) = default;
|
||||
repository_node& operator=(const repository_node& other) = delete;
|
||||
@@ -50,7 +46,7 @@ public:
|
||||
return std::ref(static_cast<const object_info<Type>&>(*info_));
|
||||
}
|
||||
|
||||
[[nodiscard]] const repository& schema() const;
|
||||
[[nodiscard]] const basic_repository& schema() const;
|
||||
|
||||
[[nodiscard]] bool has_children() const;
|
||||
|
||||
@@ -58,52 +54,52 @@ public:
|
||||
void on_detach() const;
|
||||
|
||||
private:
|
||||
explicit repository_node(repository& repo);
|
||||
repository_node(repository& repo, const std::type_index& ti);
|
||||
repository_node(repository& repo, std::string name, const std::type_index& ti);
|
||||
repository_node(basic_repository& repo, const std::type_index& ti);
|
||||
repository_node(basic_repository& repo, std::string name, const std::type_index& ti);
|
||||
|
||||
void unlink();
|
||||
|
||||
private:
|
||||
friend class repository;
|
||||
friend class basic_repository;
|
||||
template<typename Type, template<typename> typename... Observers>
|
||||
friend class relation_completer;
|
||||
template < typename NodeType, template<typename> typename ...Observers >
|
||||
friend class foreign_node_completer;
|
||||
friend class const_repository_node_iterator;
|
||||
|
||||
repository &repo_;
|
||||
basic_repository &repo_;
|
||||
std::type_index type_index_;
|
||||
std::unique_ptr<basic_object_info> info_;
|
||||
|
||||
std::shared_ptr<repository_node> parent_;
|
||||
std::shared_ptr<repository_node> previous_sibling_;
|
||||
std::shared_ptr<repository_node> next_sibling_;
|
||||
std::shared_ptr<repository_node> first_child_;
|
||||
std::shared_ptr<repository_node> last_child_;
|
||||
repository_node* parent_{nullptr};
|
||||
repository_node* previous_sibling_{nullptr};
|
||||
repository_node* next_sibling_{nullptr};
|
||||
std::unique_ptr<repository_node> first_child_;
|
||||
std::unique_ptr<repository_node> last_child_;
|
||||
|
||||
std::string name_;
|
||||
size_t depth_{0};
|
||||
};
|
||||
|
||||
template<typename Type, template <typename> class ... Observers>
|
||||
std::shared_ptr<repository_node> repository_node::make_node(repository &repo, const std::string &name,
|
||||
creator_func<Type> creator, std::vector<std::unique_ptr<observer<Type>>> &&observers) {
|
||||
std::unique_ptr<repository_node> repository_node::make_node(basic_repository &repo,
|
||||
const std::string &name,
|
||||
creator_func<Type> creator,
|
||||
std::vector<std::unique_ptr<observer<Type>>> &&observers) {
|
||||
const std::type_index ti(typeid(Type));
|
||||
auto node = std::shared_ptr<repository_node>(new repository_node(repo, name, ti));
|
||||
auto node = std::unique_ptr<repository_node>(new repository_node(repo, name, ti));
|
||||
|
||||
internal::observer_list_creator<Type, Observers...>::create_missing(observers);
|
||||
|
||||
auto obj = object_generator::generate<Type>(creator(), repo, name);
|
||||
auto info = std::make_unique<object_info<Type>>(
|
||||
node,
|
||||
std::move(obj),
|
||||
node->info_.reset(std::make_unique<object_info<Type>>(
|
||||
*node,
|
||||
obj,
|
||||
std::move(observers),
|
||||
std::forward<creator_func<Type>>(creator)
|
||||
);
|
||||
node->info_ = std::move(info);
|
||||
).release());
|
||||
|
||||
return node;
|
||||
}
|
||||
}
|
||||
#endif //SCHEMA_NODE_HPP
|
||||
#endif //REPOSITORY_NODE_HPP
|
||||
|
||||
Reference in New Issue
Block a user