aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaios <naios-dev@live.de>2015-07-22 01:03:40 +0200
committerNaios <naios-dev@live.de>2015-07-22 01:56:06 +0200
commitca16dc8c1b8da86f55a790a5f8cc6913dd005fcc (patch)
tree1880f2afe728cd1e5a9abad25790273b4f26dc4e
parent026ceb85b9e0e870d95cea42895e867198c156dd (diff)
Core/Database: Enable perfect forwarding for database format calls.
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.h44
-rw-r--r--src/server/shared/Database/QueryHolder.h7
-rw-r--r--src/server/shared/Database/Transaction.h7
-rw-r--r--src/server/shared/Utilities/StringFormat.h14
4 files changed, 45 insertions, 27 deletions
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h
index 7bd233fc56a..6d35f03451d 100644
--- a/src/server/shared/Database/DatabaseWorkerPool.h
+++ b/src/server/shared/Database/DatabaseWorkerPool.h
@@ -162,7 +162,7 @@ class DatabaseWorkerPool
//! This method should only be used for queries that are only executed once, e.g during startup.
void Execute(const char* sql)
{
- if (!sql)
+ if (Trinity::IsFormatEmptyOrNull(sql))
return;
BasicStatementTask* task = new BasicStatementTask(sql);
@@ -171,13 +171,13 @@ class DatabaseWorkerPool
//! Enqueues a one-way SQL operation in string format -with variable args- that will be executed asynchronously.
//! This method should only be used for queries that are only executed once, e.g during startup.
- template<typename... Args>
- void PExecute(const char* sql, Args const&... args)
+ template<typename Format, typename... Args>
+ void PExecute(Format&& sql, Args&&... args)
{
- if (!sql)
+ if (Trinity::IsFormatEmptyOrNull(sql))
return;
- Execute(Trinity::StringFormat(sql, args...).c_str());
+ Execute(Trinity::StringFormat(std::forward<Format>(sql), std::forward<Args>(args)...).c_str());
}
//! Enqueues a one-way SQL operation in prepared statement format that will be executed asynchronously.
@@ -206,13 +206,13 @@ class DatabaseWorkerPool
//! Directly executes a one-way SQL operation in string format -with variable args-, that will block the calling thread until finished.
//! This method should only be used for queries that are only executed once, e.g during startup.
- template<typename... Args>
- void DirectPExecute(const char* sql, Args const&... args)
+ template<typename Format, typename... Args>
+ void DirectPExecute(Format&& sql, Args&&... args)
{
- if (!sql)
+ if (Trinity::IsFormatEmptyOrNull(sql))
return;
- DirectExecute(Trinity::StringFormat(sql, args...).c_str());
+ DirectExecute(Trinity::StringFormat(std::forward<Format>(sql), std::forward<Args>(args)...).c_str());
}
//! Directly executes a one-way SQL operation in prepared statement format, that will block the calling thread until finished.
@@ -233,7 +233,7 @@ class DatabaseWorkerPool
//! Directly executes an SQL query in string format that will block the calling thread until finished.
//! Returns reference counted auto pointer, no need for manual memory management in upper level code.
- QueryResult Query(const char* sql, T* conn = NULL)
+ QueryResult Query(const char* sql, T* conn = nullptr)
{
if (!conn)
conn = GetFreeConnection();
@@ -251,24 +251,24 @@ class DatabaseWorkerPool
//! Directly executes an SQL query in string format -with variable args- that will block the calling thread until finished.
//! Returns reference counted auto pointer, no need for manual memory management in upper level code.
- template<typename... Args>
- QueryResult PQuery(const char* sql, T* conn, Args const&... args)
+ template<typename Format, typename... Args>
+ QueryResult PQuery(Format&& sql, T* conn, Args&&... args)
{
- if (!sql)
- return QueryResult(NULL);
+ if (Trinity::IsFormatEmptyOrNull(sql))
+ return QueryResult(nullptr);
- return Query(Trinity::StringFormat(sql, args...).c_str(), conn);
+ return Query(Trinity::StringFormat(std::forward<Format>(sql), std::forward<Args>(args)...).c_str(), conn);
}
//! Directly executes an SQL query in string format -with variable args- that will block the calling thread until finished.
//! Returns reference counted auto pointer, no need for manual memory management in upper level code.
- template<typename... Args>
- QueryResult PQuery(const char* sql, Args const&... args)
+ template<typename Format, typename... Args>
+ QueryResult PQuery(Format&& sql, Args&&... args)
{
if (!sql)
- return QueryResult(NULL);
+ return QueryResult(nullptr);
- return Query(Trinity::StringFormat(sql, args...).c_str());
+ return Query(Trinity::StringFormat(std::forward<Format>(sql), std::forward<Args>(args)...).c_str());
}
//! Directly executes an SQL query in prepared format that will block the calling thread until finished.
@@ -309,10 +309,10 @@ class DatabaseWorkerPool
//! Enqueues a query in string format -with variable args- that will set the value of the QueryResultFuture return object as soon as the query is executed.
//! The return value is then processed in ProcessQueryCallback methods.
- template<typename... Args>
- QueryResultFuture AsyncPQuery(const char* sql, Args const&... args)
+ template<typename Format, typename... Args>
+ QueryResultFuture AsyncPQuery(Format&& sql, Args&&... args)
{
- return AsyncQuery(Trinity::StringFormat(sql, args...).c_str());
+ return AsyncQuery(Trinity::StringFormat(std::forward<Format>(sql), std::forward<Args>(args)...).c_str());
}
//! Enqueues a query in prepared format that will set the value of the PreparedQueryResultFuture return object as soon as the query is executed.
diff --git a/src/server/shared/Database/QueryHolder.h b/src/server/shared/Database/QueryHolder.h
index a190ffbbdab..657496e8196 100644
--- a/src/server/shared/Database/QueryHolder.h
+++ b/src/server/shared/Database/QueryHolder.h
@@ -30,8 +30,11 @@ class SQLQueryHolder
SQLQueryHolder() { }
virtual ~SQLQueryHolder();
bool SetQuery(size_t index, const char* sql);
- template<typename... Args>
- bool SetPQuery(size_t index, const char* sql, Args const&... args) { return SetQuery(index, Trinity::StringFormat(sql, args...).c_str()); }
+ template<typename Format, typename... Args>
+ bool SetPQuery(size_t index, Format&& sql, Args&&... args)
+ {
+ return SetQuery(index, Trinity::StringFormat(std::forward<Format>(sql), std::forward<Args>(args)...).c_str());
+ }
bool SetPreparedQuery(size_t index, PreparedStatement* stmt);
void SetSize(size_t size);
QueryResult GetResult(size_t index);
diff --git a/src/server/shared/Database/Transaction.h b/src/server/shared/Database/Transaction.h
index a51c96ea93b..4fbbe1ed45b 100644
--- a/src/server/shared/Database/Transaction.h
+++ b/src/server/shared/Database/Transaction.h
@@ -39,8 +39,11 @@ class Transaction
void Append(PreparedStatement* statement);
void Append(const char* sql);
- template<typename... Args>
- void PAppend(const char* sql, Args const&... args) { Append(Trinity::StringFormat(sql, args...).c_str()); }
+ template<typename Format, typename... Args>
+ void PAppend(Format&& sql, Args&&... args)
+ {
+ Append(Trinity::StringFormat(std::forward<Format>(sql), std::forward<Args>(args)...).c_str());
+ }
size_t GetSize() const { return m_queries.size(); }
diff --git a/src/server/shared/Utilities/StringFormat.h b/src/server/shared/Utilities/StringFormat.h
index 0e9dde471da..67e0100e7c8 100644
--- a/src/server/shared/Utilities/StringFormat.h
+++ b/src/server/shared/Utilities/StringFormat.h
@@ -19,7 +19,7 @@
#ifndef TRINITYCORE_STRING_FORMAT_H
#define TRINITYCORE_STRING_FORMAT_H
-#include <format.h>
+#include "format.h"
namespace Trinity
{
@@ -29,6 +29,18 @@ namespace Trinity
{
return fmt::sprintf(std::forward<Format>(fmt), std::forward<Args>(args)...);
}
+
+ /// Returns true if the given char pointer is null.
+ inline bool IsFormatEmptyOrNull(const char* fmt)
+ {
+ return fmt == nullptr;
+ }
+
+ /// Returns true if the given std::string is empty.
+ inline bool IsFormatEmptyOrNull(std::string const& fmt)
+ {
+ return fmt.empty();
+ }
}
#endif