#pragma once #include #include #include #include #include namespace ikarus::util { template [[nodiscard]] int64_t object_get_id(O const * object, IkarusErrorData * error_out) { IKARUS_FAIL_IF_NULL(object, 0); IKARUS_FAIL_IF_OBJECT_MISSING(object, 0); return object->id; } template [[nodiscard]] IkarusProject * object_get_project(O const * object, IkarusErrorData * error_out) { IKARUS_FAIL_IF_NULL(object, nullptr); IKARUS_FAIL_IF_OBJECT_MISSING(object, nullptr); return object->project; } template [[nodiscard]] char const * object_get_name(O const * object, IkarusErrorData * error_out) { IKARUS_FAIL_IF_NULL(object, nullptr); IKARUS_FAIL_IF_OBJECT_MISSING(object, nullptr); IKARUS_VTRYRV_OR_FAIL( auto const ret, nullptr, fmt::runtime(fmt::format("unable to fetch {} name: {{}}", ikarus_object_type_to_string(ikarus_id_get_object_type(object->id)))), IkarusErrorInfo_Database_QueryFailed, object->project->db ->template query_one(fmt::format("SELECT `name` FROM `{}` WHERE `id` = ?", object->get_table_name()), object->id) ); return strdup(ret.data()); } #define IKARUS_FAIL_IF_NAME_INVALID(name, ret) IKARUS_FAIL_IF_NULL(name, ret); template void object_set_name(O * object, char const * name, IkarusErrorData * error_out) { IKARUS_FAIL_IF_NULL(object, ); IKARUS_FAIL_IF_OBJECT_MISSING(object, ); IKARUS_FAIL_IF_NULL(name, ); IKARUS_FAIL_IF_NAME_INVALID(name, ); IKARUS_TRYRV_OR_FAIL( , fmt::runtime(fmt::format("unable to set {} name: {{}}", ikarus_object_type_to_string(ikarus_id_get_object_type(object->id)))), IkarusErrorInfo_Database_QueryFailed, object->project->db->execute(fmt::format("UPDATE `{}` SET `name` = ? WHERE `id` = ?", object->get_table_name()), name, object->id) ); } } // namespace ikarus::util