diff options
author | Machiavelli <machiavelli.trinity@gmail.com> | 2011-05-23 16:33:33 +0200 |
---|---|---|
committer | Machiavelli <machiavelli.trinity@gmail.com> | 2011-05-23 16:33:33 +0200 |
commit | 402198c5ff06c30fcbafc54e704a5e44e4911477 (patch) | |
tree | d86b83669e4696e18733e926be4c2b7c48ce29aa /src/server/shared/Database/Transaction.cpp | |
parent | f7ce41c4afe1ea4d7cf65fbd08895e2e8325f66c (diff) |
Core/DBLayer: Proper core-side handling of MySQL errno 1213 to prevent a snowballeffect (until innodb_lock_wait_timeout)
Diffstat (limited to 'src/server/shared/Database/Transaction.cpp')
-rwxr-xr-x | src/server/shared/Database/Transaction.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/server/shared/Database/Transaction.cpp b/src/server/shared/Database/Transaction.cpp index 8604dfc609c..73cf1e77542 100755 --- a/src/server/shared/Database/Transaction.cpp +++ b/src/server/shared/Database/Transaction.cpp @@ -24,7 +24,7 @@ void Transaction::Append(const char* sql) SQLElementData data; data.type = SQL_ELEMENT_RAW; data.element.query = strdup(sql); - m_queries.push(data); + m_queries.push_back(data); } void Transaction::PAppend(const char* sql, ...) @@ -44,14 +44,18 @@ void Transaction::Append(PreparedStatement* stmt) SQLElementData data; data.type = SQL_ELEMENT_PREPARED; data.element.stmt = stmt; - m_queries.push(data); + m_queries.push_back(data); } void Transaction::Cleanup() { + // This might be called by explicit calls to Cleanup or by the auto-destructor + if (_cleanedUp) + return; + while (!m_queries.empty()) { - SQLElementData data = m_queries.front(); + SQLElementData const &data = m_queries.front(); switch (data.type) { case SQL_ELEMENT_PREPARED: @@ -61,8 +65,11 @@ void Transaction::Cleanup() free((void*)(data.element.query)); break; } - m_queries.pop(); + + m_queries.pop_front(); } + + _cleanedUp = true; } bool TransactionTask::Execute() @@ -78,5 +85,8 @@ bool TransactionTask::Execute() return true; } + // Clean up now. + m_trans->Cleanup(); + return false; } |