AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
ModuleDatabasePool Class Referenceabstract

#include "ModuleDatabasePool.h"

Inheritance diagram for ModuleDatabasePool:
DatabaseUpdatePool

Public Member Functions

 ModuleDatabasePool ()
 
virtual ~ModuleDatabasePool ()
 
void SetConnectionInfo (std::string_view infoString, uint8 synchThreads)
 
void SetConnectionInfo (std::string_view infoString, uint8 asyncThreads, uint8 synchThreads)
 
uint32 Open ()
 
bool PrepareStatements ()
 Call once the schema is up to date.
 
void Close ()
 
void Execute (std::string_view sql)
 
void DirectExecute (std::string_view sql) override
 
QueryResult Query (std::string_view sql) override
 
MySQLConnectionInfo const * GetConnectionInfo () const override
 
template<typename... Args>
void Execute (std::string_view sql, Args &&... args)
 
template<typename... Args>
void DirectExecute (std::string_view sql, Args &&... args)
 
template<typename... Args>
QueryResult Query (std::string_view sql, Args &&... args)
 
void Execute (PreparedStatementBase *stmt)
 These take ownership of the statement and delete it.
 
void DirectExecute (PreparedStatementBase *stmt)
 
PreparedQueryResult Query (PreparedStatementBase *stmt)
 
QueryCallback AsyncQuery (PreparedStatementBase *stmt)
 
QueryCallback AsyncQuery (std::string_view sql)
 
SQLQueryHolderCallback DelayQueryHolder (std::shared_ptr< SQLQueryHolderBase > holder)
 
uint8 GetPreparedStatementParamCount (uint32 index) const
 Returns 0 until PrepareStatements() has run.
 
void CommitTransaction (std::shared_ptr< TransactionBase > transaction)
 
TransactionCallback AsyncCommitTransaction (std::shared_ptr< TransactionBase > transaction)
 
void DirectCommitTransaction (std::shared_ptr< TransactionBase > transaction)
 
void KeepAlive ()
 
std::size_t QueueSize () const
 
void WarnAboutSyncQueries (bool warn)
 
- Public Member Functions inherited from DatabaseUpdatePool
virtual ~DatabaseUpdatePool ()=default
 

Protected Member Functions

virtual MySQLConnection * CreateConnection (MySQLConnectionInfo &connInfo)=0
 
virtual MySQLConnection * CreateAsyncConnection (ProducerConsumerQueue< SQLOperation * > *queue, MySQLConnectionInfo &connInfo)
 

Private Types

enum  InternalIndex {
  IDX_ASYNC ,
  IDX_SYNCH ,
  IDX_SIZE
}
 

Private Member Functions

uint32 OpenConnections (InternalIndex type, uint8 numConnections)
 
void Enqueue (SQLOperation *op)
 
bool TryDirectCommitTransaction (std::shared_ptr< TransactionBase > transaction)
 
MySQLConnection * GetFreeConnection ()
 

Private Attributes

MySQLConnectionInfo _connectionInfo
 
std::unique_ptr< ProducerConsumerQueue< SQLOperation * > > _queue
 
std::array< std::vector< std::unique_ptr< MySQLConnection > >, IDX_SIZE > _connections
 
std::vector< uint8 > _preparedStatementSize
 
uint8 _asyncThreads
 
uint8 _synchThreads
 

Detailed Description

Member Enumeration Documentation

◆ InternalIndex

Enumerator
IDX_ASYNC 
IDX_SYNCH 
IDX_SIZE 
49 {
53 };
@ IDX_SIZE
Definition ModuleDatabasePool.h:52
@ IDX_ASYNC
Definition ModuleDatabasePool.h:50
@ IDX_SYNCH
Definition ModuleDatabasePool.h:51

Constructor & Destructor Documentation

◆ ModuleDatabasePool()

ModuleDatabasePool::ModuleDatabasePool ( )
47 :
52{
53}
uint8 _synchThreads
Definition ModuleDatabasePool.h:143
MySQLConnectionInfo _connectionInfo
Definition ModuleDatabasePool.h:138
std::unique_ptr< ProducerConsumerQueue< SQLOperation * > > _queue
Definition ModuleDatabasePool.h:139
uint8 _asyncThreads
Definition ModuleDatabasePool.h:142
Definition PCQueue.h:28

◆ ~ModuleDatabasePool()

ModuleDatabasePool::~ModuleDatabasePool ( )
virtual
56{
57 Close();
58
59 _queue->Cancel();
60}
void Close()
Definition ModuleDatabasePool.cpp:233

References _queue, and Close().

Member Function Documentation

◆ AsyncCommitTransaction()

TransactionCallback ModuleDatabasePool::AsyncCommitTransaction ( std::shared_ptr< TransactionBase >  transaction)
429{
430#ifdef ACORE_DEBUG
431 switch (transaction->GetSize())
432 {
433 case 0:
434 LOG_DEBUG("sql.driver", "Transaction contains 0 queries. Not executing.");
435 break;
436 case 1:
437 LOG_DEBUG("sql.driver",
438 "Warning: Transaction only holds 1 query, consider removing Transaction context in code.");
439 break;
440 default:
441 break;
442 }
443#endif
444
445 if (_connections[IDX_ASYNC].empty())
446 {
447 TransactionPromise result;
448 result.set_value(TryDirectCommitTransaction(transaction));
449 return TransactionCallback(result.get_future());
450 }
451
453 TransactionFuture result = task->GetFuture();
454 Enqueue(task);
455 return TransactionCallback(std::move(result));
456}
std::promise< bool > TransactionPromise
Definition DatabaseEnvFwd.h:59
std::future< bool > TransactionFuture
Definition DatabaseEnvFwd.h:58
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
bool TryDirectCommitTransaction(std::shared_ptr< TransactionBase > transaction)
Definition ModuleDatabasePool.cpp:463
std::array< std::vector< std::unique_ptr< MySQLConnection > >, IDX_SIZE > _connections
Definition ModuleDatabasePool.h:140
void Enqueue(SQLOperation *op)
Definition ModuleDatabasePool.cpp:526
Definition Transaction.h:110
Definition Transaction.h:97
TransactionFuture GetFuture()
Definition Transaction.h:101

References _connections, Enqueue(), TransactionWithResultTask::GetFuture(), IDX_ASYNC, LOG_DEBUG, and TryDirectCommitTransaction().

◆ AsyncQuery() [1/2]

QueryCallback ModuleDatabasePool::AsyncQuery ( PreparedStatementBase *  stmt)
356{
357 if (_connections[IDX_ASYNC].empty())
358 {
360 result.set_value(Query(stmt));
361 return QueryCallback(result.get_future());
362 }
363
364 PreparedStatementTask* task = new PreparedStatementTask(stmt, true);
365 PreparedQueryResultFuture result = task->GetFuture();
366 Enqueue(task);
367 return QueryCallback(std::move(result));
368}
std::promise< PreparedQueryResult > PreparedQueryResultPromise
Definition DatabaseEnvFwd.h:47
std::future< PreparedQueryResult > PreparedQueryResultFuture
Definition DatabaseEnvFwd.h:46
QueryResult Query(std::string_view sql) override
Definition ModuleDatabasePool.cpp:296
Definition PreparedStatement.h:170
PreparedQueryResultFuture GetFuture()
Definition PreparedStatement.h:176
Definition QueryCallback.h:29

References _connections, Enqueue(), PreparedStatementTask::GetFuture(), IDX_ASYNC, and Query().

◆ AsyncQuery() [2/2]

QueryCallback ModuleDatabasePool::AsyncQuery ( std::string_view  sql)
341{
342 if (_connections[IDX_ASYNC].empty())
343 {
344 QueryResultPromise result;
345 result.set_value(Query(sql));
346 return QueryCallback(result.get_future());
347 }
348
349 BasicStatementTask* task = new BasicStatementTask(sql, true);
350 QueryResultFuture result = task->GetFuture();
351 Enqueue(task);
352 return QueryCallback(std::move(result));
353}
std::promise< QueryResult > QueryResultPromise
Definition DatabaseEnvFwd.h:29
std::future< QueryResult > QueryResultFuture
Definition DatabaseEnvFwd.h:28
Definition AdhocStatement.h:27
QueryResultFuture GetFuture() const
Definition AdhocStatement.h:33

References _connections, Enqueue(), BasicStatementTask::GetFuture(), IDX_ASYNC, and Query().

◆ Close()

void ModuleDatabasePool::Close ( )
234{
235 _queue->Shutdown();
236
237 _connections[IDX_ASYNC].clear();
238 _connections[IDX_SYNCH].clear();
239
241}
std::vector< uint8 > _preparedStatementSize
Definition ModuleDatabasePool.h:141

References _connections, _preparedStatementSize, _queue, IDX_ASYNC, and IDX_SYNCH.

Referenced by Open(), PrepareStatements(), and ~ModuleDatabasePool().

◆ CommitTransaction()

void ModuleDatabasePool::CommitTransaction ( std::shared_ptr< TransactionBase >  transaction)
404{
405#ifdef ACORE_DEBUG
406 switch (transaction->GetSize())
407 {
408 case 0:
409 LOG_DEBUG("sql.driver", "Transaction contains 0 queries. Not executing.");
410 return;
411 case 1:
412 LOG_DEBUG("sql.driver",
413 "Warning: Transaction only holds 1 query, consider removing Transaction context in code.");
414 break;
415 default:
416 break;
417 }
418#endif
419 if (_connections[IDX_ASYNC].empty())
420 {
421 DirectCommitTransaction(transaction);
422 return;
423 }
424
425 Enqueue(new TransactionTask(transaction));
426}
void DirectCommitTransaction(std::shared_ptr< TransactionBase > transaction)
Definition ModuleDatabasePool.cpp:458
Definition Transaction.h:76

References _connections, DirectCommitTransaction(), Enqueue(), IDX_ASYNC, and LOG_DEBUG.

◆ CreateAsyncConnection()

MySQLConnection * ModuleDatabasePool::CreateAsyncConnection ( ProducerConsumerQueue< SQLOperation * > *  queue,
MySQLConnectionInfo &  connInfo 
)
protectedvirtual
76{
77 return nullptr;
78}

Referenced by OpenConnections().

◆ CreateConnection()

virtual MySQLConnection * ModuleDatabasePool::CreateConnection ( MySQLConnectionInfo &  connInfo)
protectedpure virtual

Referenced by OpenConnections().

◆ DelayQueryHolder()

SQLQueryHolderCallback ModuleDatabasePool::DelayQueryHolder ( std::shared_ptr< SQLQueryHolderBase >  holder)
371{
372 if (!_connections[IDX_ASYNC].empty())
373 {
374 SQLQueryHolderTask* task = new SQLQueryHolderTask(holder);
375 QueryResultHolderFuture result = task->GetFuture();
376 Enqueue(task);
377 return { std::move(holder), std::move(result) };
378 }
379
380 if (!_connections[IDX_SYNCH].empty())
381 {
382 SQLQueryHolderTask task(holder);
383 QueryResultHolderFuture result = task.GetFuture();
384
386 task.SetConnection(conn);
387 task.Execute();
388 conn->Unlock();
389
390 return { std::move(holder), std::move(result) };
391 }
392
394 result.set_value();
395 return { std::move(holder), result.get_future() };
396}
std::promise< void > QueryResultHolderPromise
Definition DatabaseEnvFwd.h:75
std::future< void > QueryResultHolderFuture
Definition DatabaseEnvFwd.h:74
MySQLConnection * GetFreeConnection()
Definition ModuleDatabasePool.cpp:531
Definition MySQLConnection.h:55
void Unlock()
Called by parent databasepool. Will let other threads access this connection.
Definition MySQLConnection.cpp:538
virtual void SetConnection(MySQLConnection *con)
Definition SQLOperation.h:54
Definition QueryHolder.h:53
bool Execute() override
Definition QueryHolder.cpp:77
QueryResultHolderFuture GetFuture()
Definition QueryHolder.h:61

References _connections, Enqueue(), SQLQueryHolderTask::Execute(), GetFreeConnection(), SQLQueryHolderTask::GetFuture(), IDX_ASYNC, IDX_SYNCH, SQLOperation::SetConnection(), and MySQLConnection::Unlock().

◆ DirectCommitTransaction()

void ModuleDatabasePool::DirectCommitTransaction ( std::shared_ptr< TransactionBase >  transaction)
459{
460 TryDirectCommitTransaction(transaction);
461}

References TryDirectCommitTransaction().

Referenced by CommitTransaction().

◆ DirectExecute() [1/3]

void ModuleDatabasePool::DirectExecute ( PreparedStatementBase *  stmt)
282{
283 if (_connections[IDX_SYNCH].empty())
284 {
285 delete stmt;
286 return;
287 }
288
290 conn->Execute(stmt);
291 conn->Unlock();
292
293 delete stmt;
294}
bool Execute(std::string_view sql)
Definition MySQLConnection.cpp:181

References _connections, MySQLConnection::Execute(), GetFreeConnection(), IDX_SYNCH, and MySQLConnection::Unlock().

◆ DirectExecute() [2/3]

void ModuleDatabasePool::DirectExecute ( std::string_view  sql)
overridevirtual

Implements DatabaseUpdatePool.

269{
270 if (sql.empty())
271 return;
272
273 if (_connections[IDX_SYNCH].empty())
274 return;
275
277 conn->Execute(sql);
278 conn->Unlock();
279}

References _connections, MySQLConnection::Execute(), GetFreeConnection(), IDX_SYNCH, and MySQLConnection::Unlock().

Referenced by Execute(), and Execute().

◆ DirectExecute() [3/3]

template<typename... Args>
void ModuleDatabasePool::DirectExecute ( std::string_view  sql,
Args &&...  args 
)
inline
86 {
87 if (sql.empty())
88 return;
89
90 DirectExecute(std::string_view(Acore::StringFormat(sql, std::forward<Args>(args)...)));
91 }
void DirectExecute(std::string_view sql) override
Definition ModuleDatabasePool.cpp:268
std::string StringFormat(FormatStringView fmt, Args &&... args)
Default AC string format function.
Definition StringFormat.h:44

References DatabaseUpdatePool::DirectExecute(), and Acore::StringFormat().

◆ Enqueue()

void ModuleDatabasePool::Enqueue ( SQLOperation *  op)
private

◆ Execute() [1/3]

void ModuleDatabasePool::Execute ( PreparedStatementBase *  stmt)

These take ownership of the statement and delete it.

258{
259 if (_connections[IDX_ASYNC].empty())
260 {
261 DirectExecute(stmt);
262 return;
263 }
264
266}

References _connections, DirectExecute(), Enqueue(), and IDX_ASYNC.

◆ Execute() [2/3]

void ModuleDatabasePool::Execute ( std::string_view  sql)
244{
245 if (sql.empty())
246 return;
247
248 if (_connections[IDX_ASYNC].empty())
249 {
250 DirectExecute(sql);
251 return;
252 }
253
254 Enqueue(new BasicStatementTask(sql));
255}

References _connections, DirectExecute(), Enqueue(), and IDX_ASYNC.

◆ Execute() [3/3]

template<typename... Args>
void ModuleDatabasePool::Execute ( std::string_view  sql,
Args &&...  args 
)
inline
77 {
78 if (sql.empty())
79 return;
80
81 Execute(std::string_view(Acore::StringFormat(sql, std::forward<Args>(args)...)));
82 }
void Execute(std::string_view sql)
Definition ModuleDatabasePool.cpp:243

References Acore::StringFormat().

◆ GetConnectionInfo()

MySQLConnectionInfo const * ModuleDatabasePool::GetConnectionInfo ( ) const
overridevirtual

Implements DatabaseUpdatePool.

562{
563 return &_connectionInfo;
564}

References _connectionInfo.

◆ GetFreeConnection()

MySQLConnection * ModuleDatabasePool::GetFreeConnection ( )
private

Block forever until a connection is free

Must be matched with connection->Unlock() or you will get deadlocks

532{
533#ifdef ACORE_DEBUG
534 if (_warnSyncQueries)
535 {
536 std::ostringstream ss;
537 ss << boost::stacktrace::stacktrace();
538 LOG_WARN("sql.performances", "Sync query at:\n{}", ss.str());
539 }
540#endif
541
542 uint8 i = 0;
543 auto const num_cons = _connections[IDX_SYNCH].size();
544 MySQLConnection* connection = nullptr;
545
547 for (;;)
548 {
549 connection = _connections[IDX_SYNCH][++i % num_cons].get();
551 if (connection->LockIfReady())
552 break;
553
554 if (i % num_cons == 0)
555 std::this_thread::yield();
556 }
557
558 return connection;
559}
std::uint8_t uint8
Definition Define.h:109
#define LOG_WARN(filterType__,...)
Definition Log.h:149
bool LockIfReady()
Definition MySQLConnection.cpp:533

References _connections, IDX_SYNCH, MySQLConnection::LockIfReady(), and LOG_WARN.

Referenced by DelayQueryHolder(), DirectExecute(), DirectExecute(), Query(), Query(), and TryDirectCommitTransaction().

◆ GetPreparedStatementParamCount()

uint8 ModuleDatabasePool::GetPreparedStatementParamCount ( uint32  index) const

Returns 0 until PrepareStatements() has run.

399{
400 return index < _preparedStatementSize.size() ? _preparedStatementSize[index] : 0;
401}

References _preparedStatementSize.

◆ KeepAlive()

void ModuleDatabasePool::KeepAlive ( )
498{
499 for (auto const& conn : _connections[IDX_SYNCH])
500 {
501 if (conn->LockIfReady())
502 {
503 conn->Ping();
504 conn->Unlock();
505 }
506 }
507
508 auto const count = _connections[IDX_ASYNC].size();
509
510 for (std::size_t i = 0; i < count; ++i)
512}
Definition SQLOperation.h:65

References _connections, Enqueue(), IDX_ASYNC, and IDX_SYNCH.

◆ Open()

uint32 ModuleDatabasePool::Open ( )
81{
82 if (!_synchThreads)
83 {
84 LOG_ERROR("sql.driver", "ModuleDatabasePool: database `{}` was configured with 0 synchronous connections, "
85 "at least one is required.", _connectionInfo.database);
86 return CR_UNKNOWN_ERROR;
87 }
88
89 LOG_INFO("sql.driver", "Opening DatabasePool '{}'. Asynchronous connections: {}, synchronous connections: {}.",
91
92 _queue->Cancel();
93 _connections[IDX_ASYNC].clear();
94 _connections[IDX_SYNCH].clear();
96 _queue->Reset();
97
99 {
100 Close();
101 return error;
102 }
103
105 {
106 Close();
107 return error;
108 }
109
110 return 0;
111}
std::uint32_t uint32
Definition Define.h:107
#define LOG_INFO(filterType__,...)
Definition Log.h:153
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
uint32 OpenConnections(InternalIndex type, uint8 numConnections)
Definition ModuleDatabasePool.cpp:113
std::string database
Definition MySQLConnection.h:48

References _asyncThreads, _connectionInfo, _connections, _preparedStatementSize, _queue, _synchThreads, Close(), MySQLConnectionInfo::database, IDX_ASYNC, IDX_SYNCH, LOG_ERROR, LOG_INFO, and OpenConnections().

◆ OpenConnections()

uint32 ModuleDatabasePool::OpenConnections ( InternalIndex  type,
uint8  numConnections 
)
private
114{
115 for (uint8 i = 0; i < numConnections; ++i)
116 {
117 std::unique_ptr<MySQLConnection> conn(type == IDX_ASYNC ? CreateAsyncConnection(_queue.get(), _connectionInfo)
119
120 if (!conn)
121 {
122 if (type == IDX_ASYNC)
123 {
124 LOG_ERROR("sql.driver", "ModuleDatabasePool: database `{}` was configured with {} asynchronous "
125 "connections, but the module does not override CreateAsyncConnection(queue, connInfo).",
126 _connectionInfo.database, numConnections);
127 }
128 else
129 {
130 LOG_ERROR("sql.driver", "ModuleDatabasePool: CreateConnection returned no synchronous connection "
131 "for database `{}`.", _connectionInfo.database);
132 }
133
134 _queue->Cancel();
135 _connections[type].clear();
136 return CR_UNKNOWN_ERROR;
137 }
138
139 if (type == IDX_ASYNC && conn->m_queue != _queue.get())
140 {
141 LOG_ERROR("sql.driver", "ModuleDatabasePool: async queries for database `{}` cannot run. No queue was "
142 "set on the asynchronous connection: pass `queue` to the connection's constructor in the module's "
143 "CreateAsyncConnection(queue, connInfo) override.", _connectionInfo.database);
144
145 _queue->Cancel();
146 _connections[type].clear();
147 return CR_UNKNOWN_ERROR;
148 }
149
150 uint32 result = conn->Open();
151 if (result != 0)
152 {
153 LOG_ERROR("sql.driver", "ModuleDatabasePool: could not open {} connection {}/{} to database `{}`, error {}",
154 type == IDX_ASYNC ? "asynchronous" : "synchronous", i + 1, numConnections,
155 _connectionInfo.database, result);
156
157 _queue->Cancel();
158 _connections[type].clear();
159 return result;
160 }
161
162 _connections[type].push_back(std::move(conn));
163 }
164
165 return 0;
166}
virtual MySQLConnection * CreateAsyncConnection(ProducerConsumerQueue< SQLOperation * > *queue, MySQLConnectionInfo &connInfo)
Definition ModuleDatabasePool.cpp:74
virtual MySQLConnection * CreateConnection(MySQLConnectionInfo &connInfo)=0

References _connectionInfo, _connections, _queue, CreateAsyncConnection(), CreateConnection(), MySQLConnectionInfo::database, IDX_ASYNC, and LOG_ERROR.

Referenced by Open().

◆ PrepareStatements()

bool ModuleDatabasePool::PrepareStatements ( )

Call once the schema is up to date.

Without async connections every statement runs on a synchronous one, so CONNECTION_ASYNC-only ones fail.

169{
170 for (auto const& connections : _connections)
171 {
172 for (auto const& conn : connections)
173 {
174 conn->LockIfReady();
175 if (!conn->PrepareStatements())
176 {
177 conn->Unlock();
178 Close();
179 return false;
180 }
181
182 conn->Unlock();
183
184 std::size_t const preparedSize = conn->m_stmts.size();
185 if (_preparedStatementSize.size() < preparedSize)
186 _preparedStatementSize.resize(preparedSize);
187
188 for (std::size_t i = 0; i < preparedSize; ++i)
189 {
190 if (_preparedStatementSize[i] > 0)
191 continue;
192
193 if (MySQLPreparedStatement* stmt = conn->m_stmts[i].get())
194 {
195 uint32 const paramCount = stmt->GetParameterCount();
196
197 // Only uint8 indices are supported.
198 ASSERT(paramCount < std::numeric_limits<uint8>::max());
199
200 _preparedStatementSize[i] = static_cast<uint8>(paramCount);
201 }
202 }
203 }
204 }
205
207 if (_connections[IDX_ASYNC].empty() && !_connections[IDX_SYNCH].empty())
208 {
209 MySQLConnection const* conn = _connections[IDX_SYNCH].front().get();
210 std::string missing;
211
212 for (std::size_t i = 0; i < conn->m_stmts.size(); ++i)
213 {
214 if (conn->m_stmts[i])
215 continue;
216
217 if (!missing.empty())
218 missing += ", ";
219
220 missing += std::to_string(i);
221 }
222
223 if (!missing.empty())
224 {
225 LOG_ERROR("sql.driver", "DatabasePool '{}' has no asynchronous connections, statements [{}] are not "
226 "prepared on the synchronous ones. Flag them CONNECTION_BOTH.", _connectionInfo.database, missing);
227 }
228 }
229
230 return true;
231}
#define ASSERT
Definition Errors.h:68
PreparedStatementContainer m_stmts
Definition MySQLConnection.h:106
Definition MySQLPreparedStatement.h:34

References _connectionInfo, _connections, _preparedStatementSize, ASSERT, Close(), MySQLConnectionInfo::database, IDX_ASYNC, IDX_SYNCH, LOG_ERROR, and MySQLConnection::m_stmts.

◆ Query() [1/3]

PreparedQueryResult ModuleDatabasePool::Query ( PreparedStatementBase *  stmt)

Delete proxy-class. Not needed anymore

317{
318 if (_connections[IDX_SYNCH].empty())
319 {
320 delete stmt;
321 return PreparedQueryResult(nullptr);
322 }
323
325 PreparedResultSet* result = conn->Query(stmt);
326 conn->Unlock();
327
329 delete stmt;
330
331 if (!result || !result->GetRowCount())
332 {
333 delete result;
334 return PreparedQueryResult(nullptr);
335 }
336
337 return PreparedQueryResult(result);
338}
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
ResultSet * Query(std::string_view sql)
Definition MySQLConnection.cpp:324
Definition QueryResult.h:99
uint64 GetRowCount() const
Definition QueryResult.h:105

References _connections, GetFreeConnection(), PreparedResultSet::GetRowCount(), IDX_SYNCH, MySQLConnection::Query(), and MySQLConnection::Unlock().

◆ Query() [2/3]

QueryResult ModuleDatabasePool::Query ( std::string_view  sql)
overridevirtual

Implements DatabaseUpdatePool.

297{
298 if (_connections[IDX_SYNCH].empty())
299 return QueryResult(nullptr);
300
302 ResultSet* result = conn->Query(sql);
303 conn->Unlock();
304
305 // Mirror DatabaseWorkerPool<T>::Query semantics: nullptr for empty results,
306 // and the first row loaded before the result is handed out.
307 if (!result || !result->GetRowCount() || !result->NextRow())
308 {
309 delete result;
310 return QueryResult(nullptr);
311 }
312
313 return QueryResult(result);
314}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
Definition QueryResult.h:49
uint64 GetRowCount() const
Definition QueryResult.h:55
bool NextRow()
Definition QueryResult.cpp:188

References _connections, GetFreeConnection(), ResultSet::GetRowCount(), IDX_SYNCH, ResultSet::NextRow(), MySQLConnection::Query(), and MySQLConnection::Unlock().

Referenced by AsyncQuery(), and AsyncQuery().

◆ Query() [3/3]

template<typename... Args>
QueryResult ModuleDatabasePool::Query ( std::string_view  sql,
Args &&...  args 
)
inline
95 {
96 if (sql.empty())
97 return QueryResult(nullptr);
98
99 return Query(std::string_view(Acore::StringFormat(sql, std::forward<Args>(args)...)));
100 }

References DatabaseUpdatePool::Query(), and Acore::StringFormat().

◆ QueueSize()

std::size_t ModuleDatabasePool::QueueSize ( ) const
515{
516 return _queue->Size();
517}

References _queue.

◆ SetConnectionInfo() [1/2]

void ModuleDatabasePool::SetConnectionInfo ( std::string_view  infoString,
uint8  asyncThreads,
uint8  synchThreads 
)
68{
70 _asyncThreads = asyncThreads;
71 _synchThreads = synchThreads;
72}
Definition MySQLConnection.h:43

References _asyncThreads, _connectionInfo, and _synchThreads.

◆ SetConnectionInfo() [2/2]

void ModuleDatabasePool::SetConnectionInfo ( std::string_view  infoString,
uint8  synchThreads 
)
63{
64 SetConnectionInfo(infoString, 0, synchThreads);
65}
void SetConnectionInfo(std::string_view infoString, uint8 synchThreads)
Definition ModuleDatabasePool.cpp:62

References SetConnectionInfo().

Referenced by SetConnectionInfo().

◆ TryDirectCommitTransaction()

bool ModuleDatabasePool::TryDirectCommitTransaction ( std::shared_ptr< TransactionBase >  transaction)
private

Handle MySQL Errno 1213 without extending deadlock to the core itself

464{
465 if (_connections[IDX_SYNCH].empty())
466 return false;
467
469 int errorCode = conn->ExecuteTransaction(transaction);
470 if (!errorCode)
471 {
472 conn->Unlock();
473 return true;
474 }
475
476 bool committed = false;
477
479 if (errorCode == ER_LOCK_DEADLOCK)
480 {
481 uint8 constexpr loopBreaker = 5;
482 for (uint8 i = 0; i < loopBreaker; ++i)
483 {
484 if (!conn->ExecuteTransaction(transaction))
485 {
486 committed = true;
487 break;
488 }
489 }
490 }
491
492 transaction->Cleanup();
493 conn->Unlock();
494 return committed;
495}
int ExecuteTransaction(std::shared_ptr< TransactionBase > transaction)
Definition MySQLConnection.cpp:396

References _connections, MySQLConnection::ExecuteTransaction(), GetFreeConnection(), IDX_SYNCH, and MySQLConnection::Unlock().

Referenced by AsyncCommitTransaction(), and DirectCommitTransaction().

◆ WarnAboutSyncQueries()

void ModuleDatabasePool::WarnAboutSyncQueries ( bool  warn)
520{
521#ifdef ACORE_DEBUG
522 _warnSyncQueries = warn;
523#endif
524}

Member Data Documentation

◆ _asyncThreads

uint8 ModuleDatabasePool::_asyncThreads
private

Referenced by Open(), and SetConnectionInfo().

◆ _connectionInfo

MySQLConnectionInfo ModuleDatabasePool::_connectionInfo
private

◆ _connections

◆ _preparedStatementSize

std::vector<uint8> ModuleDatabasePool::_preparedStatementSize
private

◆ _queue

std::unique_ptr<ProducerConsumerQueue<SQLOperation*> > ModuleDatabasePool::_queue
private

◆ _synchThreads

uint8 ModuleDatabasePool::_synchThreads
private

Referenced by Open(), and SetConnectionInfo().


The documentation for this class was generated from the following files: