60
64
static TransactionServices transaction_services;
61
65
return transaction_services;
69
* Returns true if the transaction manager should construct
70
* Transaction and Statement messages, false otherwise.
72
bool shouldConstructMessages();
74
* Method which returns the active Transaction message
75
* for the supplied Session. If one is not found, a new Transaction
76
* message is allocated, initialized, and returned. It is possible that
77
* we may want to NOT increment the transaction id for a new Transaction
78
* object (e.g., splitting up Transactions into smaller chunks). The
79
* should_inc_trx_id flag controls if we do this.
81
* @param in_session The session processing the transaction
82
* @param should_inc_trx_id If true, increments the transaction id for a new trx
84
message::Transaction *getActiveTransactionMessage(Session *in_session,
85
bool should_inc_trx_id= true);
87
* Method which attaches a transaction context
88
* the supplied transaction based on the supplied Session's
89
* transaction information. This method also ensure the
90
* transaction message is attached properly to the Session object
92
* @param in_transaction The transaction message to initialize
93
* @param in_session The Session processing this transaction
94
* @param should_inc_trx_id If true, increments the transaction id for a new trx
96
void initTransactionMessage(message::Transaction &in_transaction,
98
bool should_inc_trx_id);
100
* Helper method which finalizes data members for the
101
* supplied transaction's context.
103
* @param in_transaction The transaction message to finalize
104
* @param in_session The Session processing this transaction
106
void finalizeTransactionMessage(message::Transaction &in_transaction, Session *in_session);
108
* Helper method which deletes transaction memory and
109
* unsets Session's transaction and statement messages.
111
void cleanupTransactionMessage(message::Transaction *in_transaction,
112
Session *in_session);
115
* Helper method which initializes a Statement message
117
* @param statement The statement to initialize
118
* @param in_type The type of the statement
119
* @param in_session The session processing this statement
121
void initStatementMessage(message::Statement &statement,
122
message::Statement::Type in_type,
123
Session *in_session);
125
* Finalizes a Statement message and sets the Session's statement
128
* @param statement The statement to initialize
129
* @param in_session The session processing this statement
131
void finalizeStatementMessage(message::Statement &statement,
132
Session *in_session);
133
/** Helper method which returns an initialized Statement message for methods
134
* doing insertion of data.
136
* @param[in] in_session Pointer to the Session doing the processing
137
* @param[in] in_table Pointer to the Table object being inserted into
138
* @param[out] next_segment_id The next Statement segment id to be used
140
message::Statement &getInsertStatement(Session *in_session,
142
uint32_t *next_segment_id);
145
* Helper method which initializes the header message for
148
* @param[in,out] statement Statement message container to modify
149
* @param[in] in_session Pointer to the Session doing the processing
150
* @param[in] in_table Pointer to the Table being inserted into
152
void setInsertHeader(message::Statement &statement,
156
* Helper method which returns an initialized Statement
157
* message for methods doing updates of data.
159
* @param[in] in_session Pointer to the Session doing the processing
160
* @param[in] in_table Pointer to the Table object being updated
161
* @param[in] old_record Pointer to the old data in the record
162
* @param[in] new_record Pointer to the new data in the record
163
* @param[out] next_segment_id The next Statement segment id to be used
165
message::Statement &getUpdateStatement(Session *in_session,
167
const unsigned char *old_record,
168
const unsigned char *new_record,
169
uint32_t *next_segment_id);
171
* Helper method which initializes the header message for
174
* @param[in,out] statement Statement message container to modify
175
* @param[in] in_session Pointer to the Session doing the processing
176
* @param[in] in_table Pointer to the Table being updated
177
* @param[in] old_record Pointer to the old data in the record
178
* @param[in] new_record Pointer to the new data in the record
180
void setUpdateHeader(message::Statement &statement,
183
const unsigned char *old_record,
184
const unsigned char *new_record);
186
* Helper method which returns an initialized Statement
187
* message for methods doing deletion of data.
189
* @param[in] in_session Pointer to the Session doing the processing
190
* @param[in] in_table Pointer to the Table object being deleted from
191
* @param[out] next_segment_id The next Statement segment id to be used
193
message::Statement &getDeleteStatement(Session *in_session,
195
uint32_t *next_segment_id);
198
* Helper method which initializes the header message for
201
* @param[in,out] statement Statement message container to modify
202
* @param[in] in_session Pointer to the Session doing the processing
203
* @param[in] in_table Pointer to the Table being deleted from
205
void setDeleteHeader(message::Statement &statement,
209
* Commits a normal transaction (see above) and pushes the transaction
210
* message out to the replicators.
212
* @param in_session Pointer to the Session committing the transaction
214
int commitTransactionMessage(Session *in_session);
216
* Marks the current active transaction message as being rolled back and
217
* pushes the transaction message out to replicators.
219
* @param in_session Pointer to the Session committing the transaction
221
void rollbackTransactionMessage(Session *in_session);
223
* Creates a new InsertRecord GPB message and pushes it to
226
* @param in_session Pointer to the Session which has inserted a record
227
* @param in_table Pointer to the Table containing insert information
229
* Grr, returning "true" here on error because of the cursor
230
* reversed bool return crap...fix that.
232
bool insertRecord(Session *in_session, Table *in_table);
234
* Creates a new UpdateRecord GPB message and pushes it to
237
* @param in_session Pointer to the Session which has updated a record
238
* @param in_table Pointer to the Table containing update information
239
* @param old_record Pointer to the raw bytes representing the old record/row
240
* @param new_record Pointer to the raw bytes representing the new record/row
242
void updateRecord(Session *in_session,
244
const unsigned char *old_record,
245
const unsigned char *new_record);
247
* Creates a new DeleteRecord GPB message and pushes it to
250
* @param in_session Pointer to the Session which has deleted a record
251
* @param in_table Pointer to the Table containing delete information
252
* @param use_update_record If true, uses the values from the update row instead
254
void deleteRecord(Session *in_session, Table *in_table, bool use_update_record= false);
257
* Used to undo effects of a failed statement.
259
* An SQL statement, like an UPDATE, that affects multiple rows could
260
* potentially fail mid-way through processing the rows. In such a case,
261
* the successfully modified rows that preceeded the failing row would
262
* have been added to the Statement message. This method is used for
263
* rolling back that change.
266
* This particular failure is seen on column constraint violations
267
* during a multi-row UPDATE and a multi-row INSERT..SELECT.
269
* @param in_session Pointer to the Session containing the Statement
270
* @param count The number of records to remove from Statement.
272
* @retval true Successfully removed 'count' records
273
* @retval false Failure
275
bool removeStatementRecords(Session *in_session, uint32_t count);
278
* Creates a CreateSchema Statement GPB message and adds it
279
* to the Session's active Transaction GPB message for pushing
280
* out to the replicator streams.
282
* @param[in] in_session Pointer to the Session which issued the statement
283
* @param[in] schema message::Schema message describing new schema
285
void createSchema(Session *in_session, const message::Schema &schema);
287
* Creates a DropSchema Statement GPB message and adds it
288
* to the Session's active Transaction GPB message for pushing
289
* out to the replicator streams.
291
* @param[in] in_session Pointer to the Session which issued the statement
292
* @param[in] schema_name message::Schema message describing new schema
294
void dropSchema(Session *in_session, const std::string &schema_name);
296
* Creates a CreateTable Statement GPB message and adds it
297
* to the Session's active Transaction GPB message for pushing
298
* out to the replicator streams.
300
* @param[in] in_session Pointer to the Session which issued the statement
301
* @param[in] table message::Table message describing new schema
303
void createTable(Session *in_session, const message::Table &table);
305
* Creates a DropTable Statement GPB message and adds it
306
* to the Session's active Transaction GPB message for pushing
307
* out to the replicator streams.
309
* @param[in] in_session Pointer to the Session which issued the statement
310
* @param[in] schema_name The schema of the table being dropped
311
* @param[in] table_name The table name of the table being dropped
312
* @param[in] if_exists Did the user specify an IF EXISTS clause?
314
void dropTable(Session *in_session,
315
const std::string &schema_name,
316
const std::string &table_name,
319
* Creates a TruncateTable Statement GPB message and adds it
320
* to the Session's active Transaction GPB message for pushing
321
* out to the replicator streams.
323
* @param[in] in_session Pointer to the Session which issued the statement
324
* @param[in] in_table The Table being truncated
326
void truncateTable(Session *in_session, Table *in_table);
328
* Creates a new RawSql GPB message and pushes it to
331
* @TODO With a real data dictionary, this really shouldn't
332
* be needed. CREATE TABLE would map to insertRecord call
333
* on the I_S, etc. Not sure what to do with administrative
334
* commands like CHECK TABLE, though..
336
* @param in_session Pointer to the Session which issued the statement
337
* @param query Query string
339
void rawStatement(Session *in_session, const std::string &query);
63
340
/* transactions: interface to plugin::StorageEngine functions */
64
int ha_commit_one_phase(Session *session, bool all);
65
int ha_rollback_trans(Session *session, bool all);
341
int commitPhaseOne(Session *session, bool all);
342
int rollbackTransaction(Session *session, bool all);
67
344
/* transactions: these functions never call plugin::StorageEngine functions directly */
68
int ha_commit_trans(Session *session, bool all);
69
int ha_autocommit_or_rollback(Session *session, int error);
345
int commitTransaction(Session *session, bool all);
346
int autocommitOrRollback(Session *session, int error);
72
int ha_rollback_to_savepoint(Session *session, NamedSavepoint &sv);
73
int ha_savepoint(Session *session, NamedSavepoint &sv);
74
int ha_release_savepoint(Session *session, NamedSavepoint &sv);
75
bool mysql_xa_recover(Session *session);
349
int rollbackToSavepoint(Session *session, NamedSavepoint &sv);
350
int setSavepoint(Session *session, NamedSavepoint &sv);
351
int releaseSavepoint(Session *session, NamedSavepoint &sv);
78
354
* Marks a storage engine as participating in a statement
151
427
plugin::MonitoredInTransaction *monitored,
152
428
plugin::TransactionalStorageEngine *engine,
153
429
plugin::XaResourceManager *resource_manager);
431
uint64_t getCurrentTransactionId(Session *session);
433
void allocateNewTransactionId();
440
* Send server startup event.
442
* @param session Session pointer
444
* @retval true Success
445
* @retval false Failure
447
bool sendStartupEvent(Session *session);
450
* Send server shutdown event.
452
* @param session Session pointer
454
* @retval true Success
455
* @retval false Failure
457
bool sendShutdownEvent(Session *session);
462
* Checks if a field has been updated
464
* @param current_field Pointer to the field to check if it is updated
465
* @in_table Pointer to the Table containing update information
466
* @param old_record Pointer to the raw bytes representing the old record/row
467
* @param new_record Pointer to the raw bytes representing the new record/row
469
bool isFieldUpdated(Field *current_field,
471
const unsigned char *old_record,
472
const unsigned char *new_record);
475
* Create a Transaction that contains event information and send it off.
477
* This differs from other uses of Transaction in that we don't use the
478
* message associated with Session. We create a totally new message and
481
* @param session Session pointer
482
* @param event Event message to send
484
* @note Used by the public Events API.
486
* @returns Non-zero on error
488
int sendEvent(Session *session, const message::Event &event);
491
* Helper method which checks the UpdateHeader to determine
492
* if it needs to be finalized.
494
* @param[in] statement Statement message container to check
495
* @param[in] in_table Pointer to the Table being updated
496
* @param[in] old_record Pointer to the old data in the record
497
* @param[in] new_record Pointer to the new data in the record
499
bool useExistingUpdateHeader(message::Statement &statement,
501
const unsigned char *old_record,
502
const unsigned char *new_record);
504
plugin::XaStorageEngine *xa_storage_engine;
156
507
} /* namespace drizzled */