00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <config.h>
00022
00023 #include <drizzled/plugin/transactional_storage_engine.h>
00024 #include <drizzled/resource_context.h>
00025 #include <drizzled/session.h>
00026
00027 #include <vector>
00028 #include <algorithm>
00029 #include <functional>
00030
00031 namespace drizzled {
00032 namespace plugin {
00033
00034 static std::vector<TransactionalStorageEngine*> g_engines;
00035
00036 TransactionalStorageEngine::TransactionalStorageEngine(const std::string &name_arg,
00037 const std::bitset<HTON_BIT_SIZE> &flags_arg)
00038 : StorageEngine(name_arg, flags_arg)
00039 {
00040 }
00041
00042 void TransactionalStorageEngine::setTransactionReadWrite(Session& session)
00043 {
00044 ResourceContext& resource_context= session.getResourceContext(*this);
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 if (resource_context.isStarted())
00055 resource_context.markModifiedData();
00056 }
00057
00076 void TransactionalStorageEngine::releaseTemporaryLatches(Session *session)
00077 {
00078 BOOST_FOREACH(TransactionalStorageEngine* it, g_engines)
00079 it->doReleaseTemporaryLatches(session);
00080 }
00081
00082 int TransactionalStorageEngine::notifyStartTransaction(Session *session, start_transaction_option_t options)
00083 {
00084 if (g_engines.empty())
00085 return 0;
00086 std::vector<int> results;
00087 results.reserve(g_engines.size());
00088 BOOST_FOREACH(TransactionalStorageEngine* it, g_engines)
00089 results.push_back(it->startTransaction(session, options));
00090 return *std::max_element(results.begin(), results.end());
00091 }
00092
00093 bool TransactionalStorageEngine::addPlugin(TransactionalStorageEngine *engine)
00094 {
00095 g_engines.push_back(engine);
00096 return StorageEngine::addPlugin(engine);
00097 }
00098
00099 void TransactionalStorageEngine::removePlugin(TransactionalStorageEngine*)
00100 {
00101 g_engines.clear();
00102 }
00103
00104 }
00105 }