| 203 | } |
| 204 | |
| 205 | Error Connection::TransactionHandler( |
| 206 | Connection& connection, Transaction::TransactionOperation operation, |
| 207 | Transaction& transaction) |
| 208 | { |
| 209 | std::string sql; |
| 210 | |
| 211 | const auto& name = transaction.mName; |
| 212 | |
| 213 | switch (operation) |
| 214 | { |
| 215 | case Transaction::TransactionOperation::BeginOp: |
| 216 | sql = std::string("SAVEPOINT ") + name; |
| 217 | break; |
| 218 | case Transaction::TransactionOperation::CommitOp: |
| 219 | sql = std::string("RELEASE SAVEPOINT ") + name; |
| 220 | break; |
| 221 | case Transaction::TransactionOperation::RollbackOp: |
| 222 | sql = std::string("ROLLBACK TO SAVEPOINT ") + name + |
| 223 | std::string("; RELEASE SAVEPOINT ") + name; |
| 224 | break; |
| 225 | } |
| 226 | |
| 227 | auto error = Error(sqlite3_exec( |
| 228 | connection.mConnection, sql.c_str(), nullptr, nullptr, nullptr)); |
| 229 | |
| 230 | if (operation != Transaction::TransactionOperation::BeginOp) |
| 231 | { |
| 232 | transaction.mCommitted = true; |
| 233 | |
| 234 | connection.mPendingTransactions.erase( |
| 235 | std::remove_if( |
| 236 | connection.mPendingTransactions.begin(), |
| 237 | connection.mPendingTransactions.end(), |
| 238 | [tx = &transaction](auto lhs) { return lhs == tx; }), |
| 239 | connection.mPendingTransactions.end()); |
| 240 | } |
| 241 | |
| 242 | if (error.IsError()) |
| 243 | return error; |
| 244 | |
| 245 | if (operation == Transaction::TransactionOperation::BeginOp) |
| 246 | { |
| 247 | connection.mPendingTransactions.push_back(&transaction); |
| 248 | } |
| 249 | |
| 250 | return {}; |
| 251 | } |
| 252 | |
| 253 | Result<Statement> Connection::CreateStatement(std::string_view sql) const |
| 254 | { |