Improved build helper scripts for the server

This commit is contained in:
WolverinDEV 2020-01-24 14:02:19 +01:00
parent 98c51bc8b2
commit 73f292f951
5 changed files with 53 additions and 31 deletions

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.6)
project(TeaSpeak-Shared)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD 20)
if(NOT WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wno-reorder -Wno-sign-compare -fpermissive -ftemplate-depth=1000 ${MEMORY_DEBUG_FLAGS}")

View File

@ -1,7 +1,7 @@
#include <utility>
#pragma once
#include <utility>
#include <memory>
#include <cassert>
#include <cstring>
#include <cstdint>
@ -13,6 +13,7 @@
#define _NDEBUG
namespace ts {
struct CommandResult;
namespace permission {
enum PermissionType : uint16_t;
}
@ -158,9 +159,10 @@ namespace ts {
std::map<std::string, std::string> extra_properties;
};
/*
* return command_result{permission::b_virtualserver_select_godmode}; => movabs rax,0xa08001700000001; ret; (Only if there is no deconstructor!)
* return command_result{permission::b_virtualserver_select_godmode}; => movabs rax,0xa08001700000001; ret; (Only if there is no deconstructor!)
* return command_result{permission::b_virtualserver_select_godmode}; => movabs rax,0xa08001700000001; ret; (Only if there is no destructor!)
* return command_result{permission::b_virtualserver_select_godmode}; => movabs rax,0xa08001700000001; ret; (Only if there is no destructor!)
* return command_result{error::vs_critical, "unknown error"}; => To a lot of code
*/
struct command_result { /* fixed size of 8 (64 bits) */
@ -181,30 +183,32 @@ namespace ts {
uint64_t data = 0;
/* Test for mode 1 as described before */
static_assert(sizeof(permission::PermissionType) * 8 + sizeof(error::type) * 8 <= 63);
static_assert(sizeof(permission::PermissionType) * 8 + sizeof(error::type) * 8 <= 62);
inline error::type error_code() {
[[nodiscard]] inline error::type error_code() const {
return (error::type) ((this->data >> OFFSET_ERROR) & MASK_ERROR);
}
inline error::type permission_id() {
return (error::type) ((this->data >> OFFSET_PERMISSION) & MASK_PERMISSION);
[[nodiscard]] inline permission::PermissionType permission_id() const {
return (permission::PermissionType) ((this->data >> OFFSET_PERMISSION) & MASK_PERMISSION);
}
inline detailed_command_result* details() {
return (detailed_command_result*) this->data;
}
[[nodiscard]] inline const detailed_command_result* details() const { return (detailed_command_result*) this->data; }
[[nodiscard]] inline detailed_command_result* details() { return (detailed_command_result*) this->data; }
inline bool is_detailed() {
[[nodiscard]] inline bool is_detailed() const {
return (this->data & 0x1UL) == 0;
}
inline detailed_command_result* release_details() {
inline std::unique_ptr<detailed_command_result> release_details() {
auto result = this->details();
this->data = 0;
return result;
return std::unique_ptr<detailed_command_result>{result};
}
/* Attention: Releases the internal detailed pointer! */
inline CommandResult as_command_result();
#ifndef _NDEBUG /* We dont need to secure that because gcc deduct us to an uint64_t and the only advantage is the mem leak test which is deactivated anyways */
command_result(command_result&) = delete;
command_result(const command_result&) = delete;
@ -231,7 +235,7 @@ namespace ts {
command_result(error::type error, const std::string& message) {
auto details_ptr = new detailed_command_result{};
assert(((uintptr_t) details_ptr & 0x01) == 0); // must be aligned!
assert(((uintptr_t) details_ptr & 0x03U) == 0); // must be aligned!
this->data = (uintptr_t) details_ptr;
@ -239,7 +243,7 @@ namespace ts {
details_ptr->extra_properties["extra_msg"] = message;
}
command_result(error::type error, const std::map<std::string, std::string>& properties) : command_result{error, ""} {
command_result(error::type error, const std::map<std::string, std::string>& properties) : command_result{error, std::string{""}} {
assert(this->is_detailed());
this->details()->extra_properties = properties;
}
@ -311,6 +315,7 @@ namespace ts {
CommandResult(ErrorType error, const std::string &extraMsg = "") : error(std::move(error)) { if(extraMsg.empty()) return; /*extraProperties["extramsg"] = extraMsg; */extraProperties["extra_msg"] = extraMsg; }
CommandResult(std::string error, const std::string &extraMsg = "") : error(findError(std::move(error))) { if(extraMsg.empty()) return; /*extraProperties["extramsg"] = extraMsg; */extraProperties["extra_msg"] = extraMsg; }
CommandResult() : CommandResult(ErrorType::Success, ""){}
CommandResult(ErrorType error, std::map<std::string, std::string> details) : error(error), extraProperties(std::move(details)) {}
bool operator==(const CommandResult& ref){
return this->error == ref.error && ref.extraProperties == this->extraProperties;
@ -335,6 +340,22 @@ namespace ts {
public:
CommandResultPermissionError(permission::PermissionType error, const std::string &extraMsg = "");
};
CommandResult command_result::as_command_result() {
if(this->is_detailed()) {
const auto details = this->details();
auto result = CommandResult{findError(details->error_id), details->extra_properties};
this->release_details();
return result;
} else {
const auto code = this->error_code();
auto error = findError(this->error_code());
if(code == error::server_insufficeient_permissions)
return CommandResultPermissionError{(permission::PermissionType) this->permission_id()};
else
return CommandResult{error};
}
}
}
#undef _NDEBUG

View File

@ -46,7 +46,7 @@ command::command(const std::string& command, bool editable) {
this->handle->command = command;
}
std::string command::identifier() const {
const std::string& command::identifier() const {
return this->handle->command;
}

View File

@ -59,22 +59,22 @@ namespace ts {
static command parse(const std::string_view& /* command data */, bool /* expect type */ = true, bool /* drop non UTF-8 characters */ = false);
explicit command(const std::string& /* command */ = "", bool /* editable */ = true);
std::string identifier() const;
[[nodiscard]] const std::string& identifier() const;
void set_identifier(const std::string& /* command */);
command_bulk bulk(size_t /* bulk index */);
const command_bulk bulk(size_t /* bulk index */) const;
size_t bulk_count() const;
[[nodiscard]] const command_bulk bulk(size_t /* bulk index */) const;
[[nodiscard]] size_t bulk_count() const;
inline command_bulk operator[](size_t /* index */);
inline const command_bulk operator[](size_t /* index */) const;
command_entry value(const std::string& /* key */);
const command_entry value(const std::string& /* key */) const;
bool has_value(const std::string& /* key */) const;
[[nodiscard]] const command_entry value(const std::string& /* key */) const;
[[nodiscard]] bool has_value(const std::string& /* key */) const;
command_entry operator[](const std::string& /* key */);
const command_entry operator[](const std::string& /* key */) const;
bool has_trigger(const std::string& /* key */) const;
[[nodiscard]] bool has_trigger(const std::string& /* key */) const;
void set_trigger(const std::string& /* key */, bool /* value */ = true);
std::string build(format::value /* format */ = format::QUERY);
@ -86,9 +86,9 @@ namespace ts {
class command_bulk {
friend class command;
public:
bool has(const std::string& /* key */) const;
[[nodiscard]] bool has(const std::string& /* key */) const;
command_entry value(const std::string& /* key */);
command_entry const value(const std::string& /* key */) const;
[[nodiscard]] command_entry const value(const std::string& /* key */) const;
inline command_entry operator[](const std::string& /* key */);
@ -120,7 +120,7 @@ namespace ts {
return *this;
}
const std::string string() const {
[[nodiscard]] const std::string string() const {
if(this->is_empty()) return "";
if(!this->handle->casted || this->handle->value.type() == typeid(std::string)) //No cast needed
@ -130,9 +130,9 @@ namespace ts {
return this->handle->to_string(this->handle->value);
}
inline const std::string value() const { return (std::string) this->string(); }
[[nodiscard]] inline const std::string value() const { return (std::string) this->string(); }
inline operator std::string() const {
[[nodiscard]] inline operator std::string() const {
return this->string();
}

View File

@ -565,6 +565,7 @@ namespace sql::mysql {
delete[] descriptors;
}
ResultBind(size_t a, BindMemory* b, const ResultBindDescriptor** c) : field_count{a}, memory{b}, descriptors{c} {}
ResultBind(const ResultBind&) = delete;
ResultBind(ResultBind&&) = default;
@ -708,7 +709,7 @@ result MySQLManager::executeCommand(std::shared_ptr<CommandData> _ptr) {
if(!sql::mysql::create_bind(bind_parameter_memory.ptr, mapped_variables))
return {ptr->sql_command, -1, "Failed to allocate bind memory!"};
ResultBind bind_result_data{0, nullptr, nullptr};
ResultBind bind_result_data{.field_count = 0, .memory = nullptr, .descriptors = nullptr};
auto connection = this->next_connection();
if(!connection) return {ptr->sql_command, -1, "Could not get a valid connection!"};
@ -762,7 +763,7 @@ result MySQLManager::queryCommand(shared_ptr<CommandData> _ptr, const QueryCallb
FreeGuard<BindMemory> bind_parameter_memory{nullptr};
if(!sql::mysql::create_bind(bind_parameter_memory.ptr, mapped_variables)) return {ptr->sql_command, -1, "Failed to allocate bind memory!"};
ResultBind bind_result_data{0, nullptr, nullptr};
ResultBind bind_result_data{.field_count = 0, .memory = nullptr, .descriptors = nullptr};
auto connection = this->next_connection();
if(!connection) return {ptr->sql_command, -1, "Could not get a valid connection!"};