Drizzled Public API Documentation

transaction_services.h

00001 /* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
00002  *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
00003  *
00004  *  Copyright (C) 2008 Sun Microsystems, Inc.
00005  *  Copyright (C) 2010 Jay Pipes <jaypipes@gmail.com>
00006  *
00007  *  This program is free software; you can redistribute it and/or modify
00008  *  it under the terms of the GNU General Public License as published by
00009  *  the Free Software Foundation; version 2 of the License.
00010  *
00011  *  This program is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *  GNU General Public License for more details.
00015  *
00016  *  You should have received a copy of the GNU General Public License
00017  *  along with this program; if not, write to the Free Software
00018  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
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 /* some forward declarations needed */
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   /* transactions: interface to plugin::StorageEngine functions */
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   /* savepoints */
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    * Events API
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 } /* namespace drizzled */
00573