00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00025 #pragma once
00026
00027 #include <drizzled/atomics.h>
00028 #include <drizzled/message/transaction.pb.h>
00029 #include <drizzled/identifier/table.h>
00030 #include <drizzled/identifier/schema.h>
00031 #include <drizzled/message/schema.h>
00032 #include <drizzled/session.h>
00033
00034 #include <drizzled/visibility.h>
00035
00036 namespace drizzled
00037 {
00038
00039
00040 namespace plugin
00041 {
00042 class MonitoredInTransaction;
00043 class XaResourceManager;
00044 class XaStorageEngine;
00045 class TransactionalStorageEngine;
00046 }
00047
00048 class Session;
00049 class NamedSavepoint;
00050 class Field;
00051
00056 class DRIZZLED_API TransactionServices
00057 {
00058 public:
00059 static const size_t DEFAULT_RECORD_SIZE= 100;
00060
00061 TransactionServices();
00062
00067 static inline TransactionServices &singleton()
00068 {
00069 static TransactionServices transaction_services;
00070 return transaction_services;
00071 }
00072
00077 bool shouldConstructMessages();
00078
00086 void finalizeStatementMessage(message::Statement &statement,
00087 Session::reference session);
00088
00099 bool insertRecord(Session::reference session, Table &in_table);
00100
00110 void updateRecord(Session::reference session,
00111 Table &table,
00112 const unsigned char *old_record,
00113 const unsigned char *new_record);
00114
00123 void deleteRecord(Session::reference session,
00124 Table &table,
00125 bool use_update_record= false);
00126
00135 void createSchema(Session::reference session, const message::Schema &schema);
00136
00145 void dropSchema(Session::reference session,
00146 identifier::Schema::const_reference identifier,
00147 message::schema::const_reference schema);
00148
00158 void alterSchema(Session::reference session,
00159 const message::Schema &old_schema,
00160 const message::Schema &new_schema);
00161
00170 void createTable(Session::reference session, const message::Table &table);
00171
00181 void dropTable(Session::reference session,
00182 identifier::Table::const_reference identifier,
00183 message::table::const_reference table,
00184 bool if_exists);
00185
00194 void truncateTable(Session::reference session, Table &table);
00195
00209 void rawStatement(Session::reference session,
00210 const std::string &query,
00211 const std::string &schema);
00212
00213 void rawStatement(Session::reference session, const std::string &query)
00214 {
00215 rawStatement(session, query, "");
00216 }
00217
00218
00219 int rollbackTransaction(Session::reference session, bool all);
00220
00234 int commitTransaction(Session::reference session, bool all);
00235
00247 int autocommitOrRollback(Session::reference session, int error);
00248
00249
00250 int rollbackToSavepoint(Session::reference session, NamedSavepoint &sv);
00251 int setSavepoint(Session::reference session, NamedSavepoint &sv);
00252 int releaseSavepoint(Session::reference session, NamedSavepoint &sv);
00253
00272 void registerResourceForStatement(Session::reference session,
00273 plugin::MonitoredInTransaction *monitored,
00274 plugin::TransactionalStorageEngine *engine);
00275
00295 void registerResourceForStatement(Session::reference session,
00296 plugin::MonitoredInTransaction *monitored,
00297 plugin::TransactionalStorageEngine *engine,
00298 plugin::XaResourceManager *resource_manager);
00299
00324 void registerResourceForTransaction(Session::reference session,
00325 plugin::MonitoredInTransaction *monitored,
00326 plugin::TransactionalStorageEngine *engine);
00327
00328 void registerResourceForTransaction(Session::reference session,
00329 plugin::MonitoredInTransaction *monitored,
00330 plugin::TransactionalStorageEngine *engine,
00331 plugin::XaResourceManager *resource_manager);
00332
00333 void allocateNewTransactionId();
00334
00335
00336
00337
00338
00347 bool sendStartupEvent(Session::reference session);
00348
00357 bool sendShutdownEvent(Session::reference session);
00358
00359 private:
00360
00372 message::Transaction *getActiveTransactionMessage(Session::reference session,
00373 bool should_inc_trx_id= true);
00374
00385 void initTransactionMessage(message::Transaction &transaction,
00386 Session::reference session,
00387 bool should_inc_trx_id);
00388
00396 void initStatementMessage(message::Statement &statement,
00397 message::Statement::Type type,
00398 Session::const_reference session);
00399
00407 void finalizeTransactionMessage(message::Transaction &transaction,
00408 Session::const_reference session);
00409
00414 void cleanupTransactionMessage(message::Transaction *transaction,
00415 Session::reference session);
00416
00424 message::Statement &getInsertStatement(Session::reference session,
00425 Table &table,
00426 uint32_t *next_segment_id);
00427
00436 void setInsertHeader(message::Statement &statement,
00437 Session::const_reference session,
00438 Table &table);
00449 message::Statement &getUpdateStatement(Session::reference session,
00450 Table &table,
00451 const unsigned char *old_record,
00452 const unsigned char *new_record,
00453 uint32_t *next_segment_id);
00464 void setUpdateHeader(message::Statement &statement,
00465 Session::const_reference session,
00466 Table &table,
00467 const unsigned char *old_record,
00468 const unsigned char *new_record);
00469
00478 message::Statement &getDeleteStatement(Session::reference session,
00479 Table &table,
00480 uint32_t *next_segment_id);
00481
00490 void setDeleteHeader(message::Statement &statement,
00491 Session::const_reference session,
00492 Table &table);
00493
00500 int commitTransactionMessage(Session::reference session);
00501
00508 void rollbackTransactionMessage(Session::reference session);
00509
00519 void rollbackStatementMessage(Session::reference session);
00520
00529 bool isFieldUpdated(Field *current_field,
00530 Table &table,
00531 const unsigned char *old_record,
00532 const unsigned char *new_record);
00533
00548 int sendEvent(Session::reference session, const message::Event &event);
00549
00562 message::Transaction *segmentTransactionMessage(Session::reference session,
00563 message::Transaction *transaction);
00564
00565 int commitPhaseOne(Session::reference session, bool all);
00566
00567 uint64_t getCurrentTransactionId(Session::reference session);
00568
00569 plugin::XaStorageEngine *xa_storage_engine;
00570 };
00571
00572 }
00573