From 5efc0a6e86ab72876af42f911745015ee214d536 Mon Sep 17 00:00:00 2001 From: Folling Date: Wed, 27 Dec 2023 12:52:14 +0100 Subject: [PATCH] update sqlitecpp Signed-off-by: Folling --- src/objects/object_helper.hpp | 68 --------------- src/objects/util.hpp | 151 ++++++++++++++++++++++++++++++++++ vendor/sqlitecpp | 2 +- 3 files changed, 152 insertions(+), 69 deletions(-) delete mode 100644 src/objects/object_helper.hpp create mode 100644 src/objects/util.hpp diff --git a/src/objects/object_helper.hpp b/src/objects/object_helper.hpp deleted file mode 100644 index 0fe9df7..0000000 --- a/src/objects/object_helper.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include - -#include - -#include -#include - -#include - -template F> -[[nodiscard]] cppbase::Result insert_object( - IkarusProject * project, FunctionContext * ctx, IkarusObjectType type, std::string_view name, F insert_function -) { - char const * object_type_str = ikarus_object_type_to_string(type); - - VTRY( - auto const id, - project->get_db() - ->transact([&](auto * db) -> cppbase::Result { - LOG_VERBOSE("creating {} in objects table", object_type_str); - - TRY(db->execute("INSERT INTO `objects` (`object_type`, `name`) VALUES(?, ?);", static_cast(type), name)); - - auto id = ikarus_id_from_data_and_type(db->last_insert_rowid(), IkarusObjectType_Blueprint); - - LOG_DEBUG("{} is {}", object_type_str, id); - - TRY(insert_function(db, id)); - - return cppbase::ok(id); - }) - .on_error([&](auto const& err) { - ctx->set_error( - fmt::format("unable to insert {} into database: {}", object_type_str, err), - true, - IkarusErrorInfo_Source_SubSystem, - IkarusErrorInfo_Type_SubSystem_Database - ); - }) - ); - - LOG_VERBOSE("successfully created blueprint"); - - return cppbase::ok(id); -} - -template -void delete_object(IkarusProject * project, FunctionContext * ctx, T * object) { - auto id = object->id; - auto object_type_str = ikarus_object_type_to_string(ikarus_id_get_object_type(id)); - - TRYRV(, project->get_db()->execute("DELETE FROM `objects` WHERE `id` = ?", id).on_error([&](auto const& err) { - ctx->set_error( - fmt::format("failed to delete {} from objects table: {}", object_type_str, err), - true, - IkarusErrorInfo_Source_SubSystem, - IkarusErrorInfo_Type_SubSystem_Database - ); - })); - - LOG_VERBOSE("{} was successfully deleted from database, freeing", object_type_str); - - project->uncache(object); - - LOG_VERBOSE("successfully deleted {}", object_type_str); -} diff --git a/src/objects/util.hpp b/src/objects/util.hpp new file mode 100644 index 0000000..963701b --- /dev/null +++ b/src/objects/util.hpp @@ -0,0 +1,151 @@ +#pragma once + +#include + +#include + +#include +#include + +#include + +namespace util { +template F> +[[nodiscard]] cppbase::Result insert_object( + IkarusProject * project, FunctionContext * ctx, IkarusObjectType type, std::string_view name, F insert_function +) { + char const * object_type_str = ikarus_object_type_to_string(type); + + VTRY( + auto const id, + project->get_db() + ->transact([&](auto * db) -> cppbase::Result { + LOG_VERBOSE("creating {} in objects table", object_type_str); + + TRY(db->execute("INSERT INTO `objects` (`object_type`, `name`) VALUES(?, ?);", static_cast(type), name)); + + auto id = ikarus_id_from_data_and_type(db->last_insert_rowid(), IkarusObjectType_Blueprint); + + LOG_DEBUG("{} is {}", object_type_str, id); + + TRY(insert_function(db, id)); + + return cppbase::ok(id); + }) + .on_error([&](auto const& err) { + ctx->set_error( + fmt::format("unable to insert {} into database: {}", object_type_str, err), + true, + IkarusErrorInfo_Source_SubSystem, + IkarusErrorInfo_Type_SubSystem_Database + ); + }) + ); + + LOG_VERBOSE("successfully created blueprint"); + + return cppbase::ok(id); +} + +template +void delete_object(IkarusProject * project, FunctionContext * ctx, T * object) { + auto id = object->id; + auto object_type_str = ikarus_object_type_to_string(ikarus_id_get_object_type(id)); + + TRYRV(, project->get_db()->execute("DELETE FROM `objects` WHERE `id` = ?", id).on_error([&](auto const& err) { + ctx->set_error( + fmt::format("failed to delete {} from objects table: {}", object_type_str, err), + true, + IkarusErrorInfo_Source_SubSystem, + IkarusErrorInfo_Type_SubSystem_Database + ); + })); + + LOG_VERBOSE("{} was successfully deleted from database, freeing", object_type_str); + + project->uncache(object); + + LOG_VERBOSE("successfully deleted {}", object_type_str); +} + +struct SingleQueryData { + std::string_view table_name; + std::string_view select_field_name; +}; + +template +cppbase::Result fetch_single_field(IkarusObject * object, SingleQueryData const& query_data) { + auto object_type_str = ikarus_object_type_to_string(ikarus_id_get_object_type(object->id)); + + LOG_VERBOSE("fetching property default value"); + + LOG_VERBOSE("project={};property={}", object->project->get_path().c_str(), object->id); + + auto * ctx = object->project->get_function_context(); + + VTRY( + T value, + object->project->get_db() + ->query_one( + fmt::format("SELECT `{}` FROM `{}` WHERE `id` = ?", query_data.select_field_name, query_data.table_name), + object->id + ) + .on_error([&](auto const& err) { + ctx->set_error( + fmt::format("failed to fetch {} {} from database: {}", object_type_str, query_data.select_field_name, err), + true, + IkarusErrorInfo_Source_SubSystem, + IkarusErrorInfo_Type_SubSystem_Database + ); + }) + ); + + return value; +} + +struct MultipleBufferQueryData { + std::string_view table_name; + std::string_view select_field_name; + std::string_view where_field_name; +}; + +template +cppbase::Result fetch_multiple_buffered( + IkarusObject * object, + MultipleBufferQueryData const& query_data, + std::string_view relation_desc, + T * buffer, + size_t buffer_size +) { + auto object_type_str = ikarus_object_type_to_string(ikarus_id_get_object_type(object->id)); + + LOG_VERBOSE("fetching {} {}", object_type_str, relation_desc); + + LOG_VERBOSE("project={};{}={}", object->project->get_path().c_str(), object_type_str, object->id); + + auto * ctx = object->project->get_function_context(); + + TRY(object->project->get_db() + ->query_many_buffered( + fmt::format( + "SELECT `{}` FROM `{}` WHERE `{}` = ?", + query_data.select_field_name, + query_data.table_name, + query_data.where_field_name + ), + buffer, + buffer_size, + object->id + ) + .on_error([&](auto const& err) { + ctx->set_error( + fmt::format("failed to fetch {} {} from database: {}", object_type_str, relation_desc, err), + true, + IkarusErrorInfo_Source_SubSystem, + IkarusErrorInfo_Type_SubSystem_Database + ); + })); + + return cppbase::ok(); +} +} diff --git a/vendor/sqlitecpp b/vendor/sqlitecpp index 6e39dd2..2a93b8b 160000 --- a/vendor/sqlitecpp +++ b/vendor/sqlitecpp @@ -1 +1 @@ -Subproject commit 6e39dd241f8469784b8a356e7a9563fa58b0e2c4 +Subproject commit 2a93b8b1a8be03a9a9c4c72956b1111299de0ddd