aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Database/Transaction.cpp
diff options
context:
space:
mode:
authorMachiavelli <machiavelli.trinity@gmail.com>2011-05-23 16:33:33 +0200
committerMachiavelli <machiavelli.trinity@gmail.com>2011-05-23 16:33:33 +0200
commit402198c5ff06c30fcbafc54e704a5e44e4911477 (patch)
treed86b83669e4696e18733e926be4c2b7c48ce29aa /src/server/shared/Database/Transaction.cpp
parentf7ce41c4afe1ea4d7cf65fbd08895e2e8325f66c (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-xsrc/server/shared/Database/Transaction.cpp18
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;
}