00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #pragma once
00022
00023 #include <drizzled/definitions.h>
00024 #include <drizzled/plugin/storage_engine.h>
00025 #include <drizzled/transaction_services.h>
00026
00027 #include <drizzled/visibility.h>
00028
00029 namespace drizzled {
00030 namespace plugin {
00031
00057 class DRIZZLED_API TransactionalStorageEngine : public StorageEngine
00058 {
00059 friend class SEAPITester;
00060 public:
00061 TransactionalStorageEngine(const std::string &name_arg,
00062 const std::bitset<HTON_BIT_SIZE> &flags_arg= HTON_NO_FLAGS);
00063
00064 virtual int startTransaction(Session *session, start_transaction_option_t options)
00065 {
00066 TransactionServices::registerResourceForTransaction(*session, this, this);
00067 return doStartTransaction(session, options);
00068 }
00069
00070 virtual void startStatement(Session *session)
00071 {
00072 TransactionServices::registerResourceForStatement(*session, this, this);
00073 doStartStatement(session);
00074 }
00075
00076 virtual int commit(Session *session, bool normal_transaction)
00077 {
00078 return doCommit(session, normal_transaction);
00079 }
00080
00081 virtual int rollback(Session *session, bool normal_transaction)
00082 {
00083 return doRollback(session, normal_transaction);
00084 }
00085
00086 int setSavepoint(Session *session, NamedSavepoint &sp)
00087 {
00088 return doSetSavepoint(session, sp);
00089 }
00090
00091 int rollbackToSavepoint(Session *session, NamedSavepoint &sp)
00092 {
00093 return doRollbackToSavepoint(session, sp);
00094 }
00095
00096 int releaseSavepoint(Session *session, NamedSavepoint &sp)
00097 {
00098 return doReleaseSavepoint(session, sp);
00099 }
00100
00101
00102
00103
00104
00105 virtual bool participatesInSqlTransaction() const
00106 {
00107 return true;
00108 }
00109 virtual bool participatesInXaTransaction() const
00110 {
00111 return false;
00112 }
00113 virtual bool alwaysRegisterForXaTransaction() const
00114 {
00115 return false;
00116 }
00117
00122 static int notifyStartTransaction(Session *session, start_transaction_option_t options);
00126 static void releaseTemporaryLatches(Session *session);
00127
00128
00129 static bool addPlugin(plugin::TransactionalStorageEngine *engine);
00130 static void removePlugin(plugin::TransactionalStorageEngine *engine);
00131
00132 private:
00133 void setTransactionReadWrite(Session& session);
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 virtual int doStartTransaction(Session *session, start_transaction_option_t options)
00153 {
00154 (void) session;
00155 (void) options;
00156 return 0;
00157 }
00158
00159
00160
00161
00162
00163 virtual void doStartStatement(Session *session)
00164 {
00165 (void) session;
00166 }
00167
00168
00169
00170
00171
00172
00173 virtual void doEndStatement(Session *session)
00174 {
00175 (void) session;
00176 }
00181 virtual int doSetSavepoint(Session *session, NamedSavepoint &savepoint)= 0;
00182 virtual int doRollbackToSavepoint(Session *session, NamedSavepoint &savepoint)= 0;
00183 virtual int doReleaseSavepoint(Session *session, NamedSavepoint &savepoint)= 0;
00184
00197 virtual int doCommit(Session *session, bool normal_transaction)= 0;
00198
00211 virtual int doRollback(Session *session, bool normal_transaction)= 0;
00212 virtual int doReleaseTemporaryLatches(Session*)
00213 {
00214 return 0;
00215 }
00216 virtual int doStartConsistentSnapshot(Session*)
00217 {
00218 return 0;
00219 }
00220 };
00221
00222 }
00223 }
00224