diff --git a/common/events/player_event_logs.cpp b/common/events/player_event_logs.cpp index e2dfbb90b..a0b57f0d8 100644 --- a/common/events/player_event_logs.cpp +++ b/common/events/player_event_logs.cpp @@ -37,6 +37,8 @@ void PlayerEventLogs::Init() db.emplace_back(e.id); } + std::vector settings_to_insert{}; + // insert entries that don't exist in database for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) { bool is_in_database = std::find(db.begin(), db.end(), i) != db.end(); @@ -56,21 +58,21 @@ void PlayerEventLogs::Init() bool is_missing_in_database = std::find(db.begin(), db.end(), i) == db.end(); if (is_missing_in_database && is_implemented && !is_deprecated) { - LogInfo( - "[New] PlayerEvent [{}] ({})", - PlayerEvent::EventName[i], - i - ); + LogInfo("[New] PlayerEvent [{}] ({})", PlayerEvent::EventName[i], i); auto c = PlayerEventLogSettingsRepository::NewEntity(); c.id = i; c.event_name = PlayerEvent::EventName[i]; c.event_enabled = m_settings[i].event_enabled; c.retention_days = m_settings[i].retention_days; - PlayerEventLogSettingsRepository::InsertOne(*m_database, c); + settings_to_insert.emplace_back(c); } } + if (!settings_to_insert.empty()) { + PlayerEventLogSettingsRepository::ReplaceMany(*m_database, settings_to_insert); + } + bool processing_in_world = !RuleB(Logging, PlayerEventsQSProcess) && IsWorld(); bool processing_in_qs = RuleB(Logging, PlayerEventsQSProcess) && IsQueryServ(); diff --git a/common/repositories/base/base_player_event_log_settings_repository.h b/common/repositories/base/base_player_event_log_settings_repository.h index 69156fa72..ad359c2b0 100644 --- a/common/repositories/base/base_player_event_log_settings_repository.h +++ b/common/repositories/base/base_player_event_log_settings_repository.h @@ -6,7 +6,7 @@ * Any modifications to base repositories are to be made by the generator only * * @generator ./utils/scripts/generators/repository-generator.pl - * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + * @docs https://docs.eqemu.io/developer/repositories */ #ifndef EQEMU_BASE_PLAYER_EVENT_LOG_SETTINGS_REPOSITORY_H @@ -16,6 +16,7 @@ #include "../../strings.h" #include + class BasePlayerEventLogSettingsRepository { public: struct PlayerEventLogSettings { @@ -359,6 +360,70 @@ public: return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0); } + static std::string BaseReplace() + { + return fmt::format( + "REPLACE INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static int ReplaceOne( + Database& db, + const PlayerEventLogSettings &e + ) + { + std::vector v; + + v.push_back(std::to_string(e.id)); + v.push_back("'" + Strings::Escape(e.event_name) + "'"); + v.push_back(std::to_string(e.event_enabled)); + v.push_back(std::to_string(e.retention_days)); + v.push_back(std::to_string(e.discord_webhook_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseReplace(), + Strings::Implode(",", v) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int ReplaceMany( + Database& db, + const std::vector &entries + ) + { + std::vector insert_chunks; + + for (auto &e: entries) { + std::vector v; + + v.push_back(std::to_string(e.id)); + v.push_back("'" + Strings::Escape(e.event_name) + "'"); + v.push_back(std::to_string(e.event_enabled)); + v.push_back(std::to_string(e.retention_days)); + v.push_back(std::to_string(e.discord_webhook_id)); + + insert_chunks.push_back("(" + Strings::Implode(",", v) + ")"); + } + + std::vector v; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseReplace(), + Strings::Implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } }; #endif //EQEMU_BASE_PLAYER_EVENT_LOG_SETTINGS_REPOSITORY_H diff --git a/common/repositories/base/base_player_event_logs_repository.h b/common/repositories/base/base_player_event_logs_repository.h index 8030303a9..4e188dc16 100644 --- a/common/repositories/base/base_player_event_logs_repository.h +++ b/common/repositories/base/base_player_event_logs_repository.h @@ -6,7 +6,7 @@ * Any modifications to base repositories are to be made by the generator only * * @generator ./utils/scripts/generators/repository-generator.pl - * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + * @docs https://docs.eqemu.io/developer/repositories */ #ifndef EQEMU_BASE_PLAYER_EVENT_LOGS_REPOSITORY_H @@ -240,8 +240,8 @@ public: v.push_back(columns[7] + " = " + std::to_string(e.z)); v.push_back(columns[8] + " = " + std::to_string(e.heading)); v.push_back(columns[9] + " = " + std::to_string(e.event_type_id)); - v.push_back(columns[10] + " = '" + db.Escape(e.event_type_name) + "'"); - v.push_back(columns[11] + " = '" + db.Escape(e.event_data) + "'"); + v.push_back(columns[10] + " = '" + Strings::Escape(e.event_type_name) + "'"); + v.push_back(columns[11] + " = '" + Strings::Escape(e.event_data) + "'"); v.push_back(columns[12] + " = FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")"); auto results = db.QueryDatabase( @@ -274,8 +274,8 @@ public: v.push_back(std::to_string(e.z)); v.push_back(std::to_string(e.heading)); v.push_back(std::to_string(e.event_type_id)); - v.push_back("'" + db.Escape(e.event_type_name) + "'"); - v.push_back("'" + db.Escape(e.event_data) + "'"); + v.push_back("'" + Strings::Escape(e.event_type_name) + "'"); + v.push_back("'" + Strings::Escape(e.event_data) + "'"); v.push_back("FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")"); auto results = db.QueryDatabase( @@ -316,8 +316,8 @@ public: v.push_back(std::to_string(e.z)); v.push_back(std::to_string(e.heading)); v.push_back(std::to_string(e.event_type_id)); - v.push_back("'" + db.Escape(e.event_type_name) + "'"); - v.push_back("'" + db.Escape(e.event_data) + "'"); + v.push_back("'" + Strings::Escape(e.event_type_name) + "'"); + v.push_back("'" + Strings::Escape(e.event_data) + "'"); v.push_back("FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")"); insert_chunks.push_back("(" + Strings::Implode(",", v) + ")"); @@ -460,6 +460,86 @@ public: return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0); } + static std::string BaseReplace() + { + return fmt::format( + "REPLACE INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static int ReplaceOne( + Database& db, + const PlayerEventLogs &e + ) + { + std::vector v; + + v.push_back(std::to_string(e.id)); + v.push_back(std::to_string(e.account_id)); + v.push_back(std::to_string(e.character_id)); + v.push_back(std::to_string(e.zone_id)); + v.push_back(std::to_string(e.instance_id)); + v.push_back(std::to_string(e.x)); + v.push_back(std::to_string(e.y)); + v.push_back(std::to_string(e.z)); + v.push_back(std::to_string(e.heading)); + v.push_back(std::to_string(e.event_type_id)); + v.push_back("'" + Strings::Escape(e.event_type_name) + "'"); + v.push_back("'" + Strings::Escape(e.event_data) + "'"); + v.push_back("FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseReplace(), + Strings::Implode(",", v) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int ReplaceMany( + Database& db, + const std::vector &entries + ) + { + std::vector insert_chunks; + + for (auto &e: entries) { + std::vector v; + + v.push_back(std::to_string(e.id)); + v.push_back(std::to_string(e.account_id)); + v.push_back(std::to_string(e.character_id)); + v.push_back(std::to_string(e.zone_id)); + v.push_back(std::to_string(e.instance_id)); + v.push_back(std::to_string(e.x)); + v.push_back(std::to_string(e.y)); + v.push_back(std::to_string(e.z)); + v.push_back(std::to_string(e.heading)); + v.push_back(std::to_string(e.event_type_id)); + v.push_back("'" + Strings::Escape(e.event_type_name) + "'"); + v.push_back("'" + Strings::Escape(e.event_data) + "'"); + v.push_back("FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")"); + + insert_chunks.push_back("(" + Strings::Implode(",", v) + ")"); + } + + std::vector v; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseReplace(), + Strings::Implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } }; #endif //EQEMU_BASE_PLAYER_EVENT_LOGS_REPOSITORY_H