PageRenderTime 21ms CodeModel.GetById 6ms RepoModel.GetById 0ms app.codeStats 0ms

/mordor/pq/transaction.cpp

http://github.com/mozy/mordor
C++ | 105 lines | 93 code | 10 blank | 2 comment | 6 complexity | 88fbff6ad3887710a1f10017e298b896 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // Copyright (c) 2010 - Mozy, Inc.
  2. #include "transaction.h"
  3. #include "mordor/assert.h"
  4. #include "connection.h"
  5. namespace Mordor {
  6. namespace PQ {
  7. Transaction::Transaction(Connection &connection, IsolationLevel isolationLevel)
  8. : m_connection(connection),
  9. m_active(true)
  10. {
  11. switch (isolationLevel) {
  12. case DEFAULT:
  13. m_connection.execute("BEGIN");
  14. break;
  15. case SERIALIZABLE:
  16. m_connection.execute("BEGIN ISOLATION LEVEL SERIALIZABLE");
  17. break;
  18. case READ_COMMITTED:
  19. m_connection.execute("BEGIN ISOLATION LEVEL READ COMMITTED");
  20. break;
  21. default:
  22. MORDOR_NOTREACHED();
  23. }
  24. }
  25. Transaction::Transaction(Connection &connection, IsolationLevel isolationLevel,
  26. Mode mode)
  27. : m_connection(connection),
  28. m_active(true)
  29. {
  30. switch (isolationLevel) {
  31. case DEFAULT:
  32. switch (mode) {
  33. case READ_WRITE:
  34. m_connection.execute("BEGIN READ WRITE");
  35. break;
  36. case READ_ONLY:
  37. m_connection.execute("BEGIN READ ONLY");
  38. break;
  39. default:
  40. MORDOR_NOTREACHED();
  41. }
  42. break;
  43. case SERIALIZABLE:
  44. switch (mode) {
  45. case READ_WRITE:
  46. m_connection.execute("BEGIN ISOLATION LEVEL SERIALIZABLE READ WRITE");
  47. break;
  48. case READ_ONLY:
  49. m_connection.execute("BEGIN ISOLATION LEVEL SERIALIZABLE READ ONLY");
  50. break;
  51. default:
  52. MORDOR_NOTREACHED();
  53. }
  54. break;
  55. case READ_COMMITTED:
  56. switch (mode) {
  57. case READ_WRITE:
  58. m_connection.execute("BEGIN ISOLATION LEVEL READ COMMITTED READ WRITE");
  59. break;
  60. case READ_ONLY:
  61. m_connection.execute("BEGIN ISOLATION LEVEL READ COMMITTED READ ONLY");
  62. break;
  63. default:
  64. MORDOR_NOTREACHED();
  65. }
  66. break;
  67. default:
  68. MORDOR_NOTREACHED();
  69. }
  70. }
  71. Transaction::~Transaction()
  72. {
  73. if (m_active) {
  74. try {
  75. m_connection.execute("ROLLBACK");
  76. } catch (...) {
  77. // No exceptions in destructors
  78. }
  79. }
  80. }
  81. void
  82. Transaction::commit()
  83. {
  84. MORDOR_ASSERT(m_active);
  85. m_connection.execute("COMMIT");
  86. m_active = false;
  87. }
  88. void
  89. Transaction::rollback()
  90. {
  91. MORDOR_ASSERT(m_active);
  92. m_connection.execute("ROLLBACK");
  93. m_active = false;
  94. }
  95. }}