75
78
* Transaction and Statement messages, false otherwise.
77
80
bool shouldConstructMessages();
82
* Method which returns the active Transaction message
83
* for the supplied Session. If one is not found, a new Transaction
84
* message is allocated, initialized, and returned. It is possible that
85
* we may want to NOT increment the transaction id for a new Transaction
86
* object (e.g., splitting up Transactions into smaller chunks). The
87
* should_inc_trx_id flag controls if we do this.
89
* @param in_session The session processing the transaction
90
* @param should_inc_trx_id If true, increments the transaction id for a new trx
92
message::Transaction *getActiveTransactionMessage(Session *in_session,
93
bool should_inc_trx_id= true);
95
* Method which attaches a transaction context
96
* the supplied transaction based on the supplied Session's
97
* transaction information. This method also ensure the
98
* transaction message is attached properly to the Session object
100
* @param in_transaction The transaction message to initialize
101
* @param in_session The Session processing this transaction
102
* @param should_inc_trx_id If true, increments the transaction id for a new trx
104
void initTransactionMessage(message::Transaction &in_transaction,
106
bool should_inc_trx_id);
108
* Helper method which finalizes data members for the
109
* supplied transaction's context.
111
* @param in_transaction The transaction message to finalize
112
* @param in_session The Session processing this transaction
114
void finalizeTransactionMessage(message::Transaction &in_transaction, Session *in_session);
116
* Helper method which deletes transaction memory and
117
* unsets Session's transaction and statement messages.
119
void cleanupTransactionMessage(message::Transaction *in_transaction,
120
Session *in_session);
123
* Helper method which initializes a Statement message
125
* @param statement The statement to initialize
126
* @param in_type The type of the statement
127
* @param in_session The session processing this statement
129
void initStatementMessage(message::Statement &statement,
130
message::Statement::Type in_type,
131
Session *in_session);
80
133
* Finalizes a Statement message and sets the Session's statement
81
134
* message to NULL.
83
136
* @param statement The statement to initialize
84
* @param session The Session object processing this statement
137
* @param in_session The session processing this statement
86
139
void finalizeStatementMessage(message::Statement &statement,
87
Session::reference session);
140
Session *in_session);
141
/** Helper method which returns an initialized Statement message for methods
142
* doing insertion of data.
144
* @param[in] in_session Pointer to the Session doing the processing
145
* @param[in] in_table Pointer to the Table object being inserted into
146
* @param[out] next_segment_id The next Statement segment id to be used
148
message::Statement &getInsertStatement(Session *in_session,
150
uint32_t *next_segment_id);
153
* Helper method which initializes the header message for
156
* @param[in,out] statement Statement message container to modify
157
* @param[in] in_session Pointer to the Session doing the processing
158
* @param[in] in_table Pointer to the Table being inserted into
160
void setInsertHeader(message::Statement &statement,
164
* Helper method which returns an initialized Statement
165
* message for methods doing updates of data.
167
* @param[in] in_session Pointer to the Session doing the processing
168
* @param[in] in_table Pointer to the Table object being updated
169
* @param[in] old_record Pointer to the old data in the record
170
* @param[in] new_record Pointer to the new data in the record
171
* @param[out] next_segment_id The next Statement segment id to be used
173
message::Statement &getUpdateStatement(Session *in_session,
175
const unsigned char *old_record,
176
const unsigned char *new_record,
177
uint32_t *next_segment_id);
179
* Helper method which initializes the header message for
182
* @param[in,out] statement Statement message container to modify
183
* @param[in] in_session Pointer to the Session doing the processing
184
* @param[in] in_table Pointer to the Table being updated
185
* @param[in] old_record Pointer to the old data in the record
186
* @param[in] new_record Pointer to the new data in the record
188
void setUpdateHeader(message::Statement &statement,
191
const unsigned char *old_record,
192
const unsigned char *new_record);
194
* Helper method which returns an initialized Statement
195
* message for methods doing deletion of data.
197
* @param[in] in_session Pointer to the Session doing the processing
198
* @param[in] in_table Pointer to the Table object being deleted from
199
* @param[out] next_segment_id The next Statement segment id to be used
201
message::Statement &getDeleteStatement(Session *in_session,
203
uint32_t *next_segment_id);
206
* Helper method which initializes the header message for
209
* @param[in,out] statement Statement message container to modify
210
* @param[in] in_session Pointer to the Session doing the processing
211
* @param[in] in_table Pointer to the Table being deleted from
213
void setDeleteHeader(message::Statement &statement,
217
* Commits a normal transaction (see above) and pushes the transaction
218
* message out to the replicators.
220
* @param in_session Pointer to the Session committing the transaction
222
int commitTransactionMessage(Session *in_session);
224
* Marks the current active transaction message as being rolled back and
225
* pushes the transaction message out to replicators.
227
* @param in_session Pointer to the Session committing the transaction
229
void rollbackTransactionMessage(Session *in_session);
90
231
* Creates a new InsertRecord GPB message and pushes it to
93
* @param session Session object which has inserted a record
94
* @param table Table object containing insert information
234
* @param in_session Pointer to the Session which has inserted a record
235
* @param in_table Pointer to the Table containing insert information
96
237
* Grr, returning "true" here on error because of the cursor
97
238
* reversed bool return crap...fix that.
99
bool insertRecord(Session::reference session, Table &in_table);
240
bool insertRecord(Session *in_session, Table *in_table);
102
242
* Creates a new UpdateRecord GPB message and pushes it to
105
* @param session Session object which has updated a record
106
* @param table Table object containing update information
245
* @param in_session Pointer to the Session which has updated a record
246
* @param in_table Pointer to the Table containing update information
107
247
* @param old_record Pointer to the raw bytes representing the old record/row
108
248
* @param new_record Pointer to the raw bytes representing the new record/row
110
void updateRecord(Session::reference session,
250
void updateRecord(Session *in_session,
112
252
const unsigned char *old_record,
113
253
const unsigned char *new_record);
116
255
* Creates a new DeleteRecord GPB message and pushes it to
119
* @param session Session object which has deleted a record
120
* @param table Table object containing delete information
258
* @param in_session Pointer to the Session which has deleted a record
259
* @param in_table Pointer to the Table containing delete information
121
260
* @param use_update_record If true, uses the values from the update row instead
123
void deleteRecord(Session::reference session,
125
bool use_update_record= false);
262
void deleteRecord(Session *in_session, Table *in_table, bool use_update_record= false);
265
* Used to undo effects of a failed statement.
267
* An SQL statement, like an UPDATE, that affects multiple rows could
268
* potentially fail mid-way through processing the rows. In such a case,
269
* the successfully modified rows that preceeded the failing row would
270
* have been added to the Statement message. This method is used for
271
* rolling back that change.
274
* This particular failure is seen on column constraint violations
275
* during a multi-row UPDATE and a multi-row INSERT..SELECT.
277
* @param in_session Pointer to the Session containing the Statement
278
* @param count The number of records to remove from Statement.
280
* @retval true Successfully removed 'count' records
281
* @retval false Failure
283
bool removeStatementRecords(Session *in_session, uint32_t count);
128
286
* Creates a CreateSchema Statement GPB message and adds it
129
287
* to the Session's active Transaction GPB message for pushing
130
288
* out to the replicator streams.
132
* @param[in] session Session object which issued the statement
290
* @param[in] in_session Pointer to the Session which issued the statement
133
291
* @param[in] schema message::Schema message describing new schema
135
void createSchema(Session::reference session, const message::Schema &schema);
293
void createSchema(Session *in_session, const message::Schema &schema);
138
295
* Creates a DropSchema Statement GPB message and adds it
139
296
* to the Session's active Transaction GPB message for pushing
140
297
* out to the replicator streams.
142
* @param[in] session Session object which issued the statement
143
* @param[in] identifier Identifier for the schema to drop
145
void dropSchema(Session::reference session,
146
identifier::Schema::const_reference identifier);
149
* Creates an AlterSchema Statement GPB message and adds it
150
* to the Session's active Transaction GPB message for pushing
151
* out to the replicator streams.
153
* @param[in] session Session object which issued the statement
154
* @param[in] old_schema Original schema definition
155
* @param[in] new_schema New schema definition
157
void alterSchema(Session::reference session,
158
const message::schema::shared_ptr &old_schema,
159
const message::Schema &new_schema);
299
* @param[in] in_session Pointer to the Session which issued the statement
300
* @param[in] schema_name message::Schema message describing new schema
302
void dropSchema(Session *in_session, const std::string &schema_name);
162
304
* Creates a CreateTable Statement GPB message and adds it
163
305
* to the Session's active Transaction GPB message for pushing
164
306
* out to the replicator streams.
166
* @param[in] session Session object which issued the statement
308
* @param[in] in_session Pointer to the Session which issued the statement
167
309
* @param[in] table message::Table message describing new schema
169
void createTable(Session::reference session, const message::Table &table);
311
void createTable(Session *in_session, const message::Table &table);
172
313
* Creates a DropTable Statement GPB message and adds it
173
314
* to the Session's active Transaction GPB message for pushing
174
315
* out to the replicator streams.
176
* @param[in] session Session object which issued the statement
177
* @param[in] table Identifier for the table being dropped
317
* @param[in] in_session Pointer to the Session which issued the statement
318
* @param[in] schema_name The schema of the table being dropped
319
* @param[in] table_name The table name of the table being dropped
178
320
* @param[in] if_exists Did the user specify an IF EXISTS clause?
180
void dropTable(Session::reference session,
181
const identifier::Table &table,
322
void dropTable(Session *in_session,
323
const std::string &schema_name,
324
const std::string &table_name,
185
327
* Creates a TruncateTable Statement GPB message and adds it
186
328
* to the Session's active Transaction GPB message for pushing
187
329
* out to the replicator streams.
189
* @param[in] session Session object which issued the statement
190
* @param[in] table The Table being truncated
331
* @param[in] in_session Pointer to the Session which issued the statement
332
* @param[in] in_table The Table being truncated
192
void truncateTable(Session::reference session, Table &table);
334
void truncateTable(Session *in_session, Table *in_table);
195
336
* Creates a new RawSql GPB message and pushes it to
200
341
* on the I_S, etc. Not sure what to do with administrative
201
342
* commands like CHECK TABLE, though..
203
* @param session Session object which issued the statement
344
* @param in_session Pointer to the Session which issued the statement
204
345
* @param query Query string
206
void rawStatement(Session::reference session, const std::string &query);
347
void rawStatement(Session *in_session, const std::string &query);
208
348
/* transactions: interface to plugin::StorageEngine functions */
209
int rollbackTransaction(Session::reference session, bool all);
212
* Commit the current transaction.
215
* @retval 1 transaction was rolled back
216
* @retval 2 error during commit, data may be inconsistent
219
* Since we don't support nested statement transactions in 5.0,
220
* we can't commit or rollback stmt transactions while we are inside
221
* stored functions or triggers. So we simply do nothing now.
222
* This should be fixed in later ( >= 5.1) releases.
224
int commitTransaction(Session::reference session, bool all);
227
* This is used to commit or rollback a single statement depending on
228
* the value of error.
231
* Note that if the autocommit is on, then the following call inside
232
* InnoDB will commit or rollback the whole transaction (= the statement). The
233
* autocommit mechanism built into InnoDB is based on counting locks, but if
234
* the user has used LOCK TABLES then that mechanism does not know to do the
237
int autocommitOrRollback(Session::reference session, int error);
349
int commitPhaseOne(Session *session, bool all);
350
int rollbackTransaction(Session *session, bool all);
352
/* transactions: these functions never call plugin::StorageEngine functions directly */
353
int commitTransaction(Session *session, bool all);
354
int autocommitOrRollback(Session *session, int error);
240
int rollbackToSavepoint(Session::reference session, NamedSavepoint &sv);
241
int setSavepoint(Session::reference session, NamedSavepoint &sv);
242
int releaseSavepoint(Session::reference session, NamedSavepoint &sv);
357
int rollbackToSavepoint(Session *session, NamedSavepoint &sv);
358
int setSavepoint(Session *session, NamedSavepoint &sv);
359
int releaseSavepoint(Session *session, NamedSavepoint &sv);
245
362
* Marks a storage engine as participating in a statement
330
459
* Send server startup event.
332
* @param session Session object
461
* @param session Session pointer
334
463
* @retval true Success
335
464
* @retval false Failure
337
bool sendStartupEvent(Session::reference session);
466
bool sendStartupEvent(Session *session);
340
469
* Send server shutdown event.
342
* @param session Session object
471
* @param session Session pointer
344
473
* @retval true Success
345
474
* @retval false Failure
347
bool sendShutdownEvent(Session::reference session);
476
bool sendShutdownEvent(Session *session);
352
* Method which returns the active Transaction message
353
* for the supplied Session. If one is not found, a new Transaction
354
* message is allocated, initialized, and returned. It is possible that
355
* we may want to NOT increment the transaction id for a new Transaction
356
* object (e.g., splitting up Transactions into smaller chunks). The
357
* should_inc_trx_id flag controls if we do this.
359
* @param session The Session object processing the transaction
360
* @param should_inc_trx_id If true, increments the transaction id for a new trx
362
message::Transaction *getActiveTransactionMessage(Session::reference session,
363
bool should_inc_trx_id= true);
366
* Method which attaches a transaction context
367
* the supplied transaction based on the supplied Session's
368
* transaction information. This method also ensure the
369
* transaction message is attached properly to the Session object
371
* @param transaction The transaction message to initialize
372
* @param session The Session object processing this transaction
373
* @param should_inc_trx_id If true, increments the transaction id for a new trx
375
void initTransactionMessage(message::Transaction &transaction,
376
Session::reference session,
377
bool should_inc_trx_id);
380
* Helper method which initializes a Statement message
382
* @param statement The statement to initialize
383
* @param type The type of the statement
384
* @param session The Session object processing this statement
386
void initStatementMessage(message::Statement &statement,
387
message::Statement::Type type,
388
Session::const_reference session);
391
* Helper method which finalizes data members for the
392
* supplied transaction's context.
394
* @param transaction The transaction message to finalize
395
* @param session The Session object processing this transaction
397
void finalizeTransactionMessage(message::Transaction &transaction,
398
Session::const_reference session);
401
* Helper method which deletes transaction memory and
402
* unsets Session's transaction and statement messages.
404
void cleanupTransactionMessage(message::Transaction *transaction,
405
Session::reference session);
407
/** Helper method which returns an initialized Statement message for methods
408
* doing insertion of data.
410
* @param[in] session Session object doing the processing
411
* @param[in] table Table object being inserted into
412
* @param[out] next_segment_id The next Statement segment id to be used
414
message::Statement &getInsertStatement(Session::reference session,
416
uint32_t *next_segment_id);
419
* Helper method which initializes the header message for
422
* @param[in,out] statement Statement message container to modify
423
* @param[in] session Session object doing the processing
424
* @param[in] table Table object being inserted into
426
void setInsertHeader(message::Statement &statement,
427
Session::const_reference session,
430
* Helper method which returns an initialized Statement
431
* message for methods doing updates of data.
433
* @param[in] session Session object doing the processing
434
* @param[in] table Table object being updated
435
* @param[in] old_record Pointer to the old data in the record
436
* @param[in] new_record Pointer to the new data in the record
437
* @param[out] next_segment_id The next Statement segment id to be used
439
message::Statement &getUpdateStatement(Session::reference session,
441
const unsigned char *old_record,
442
const unsigned char *new_record,
443
uint32_t *next_segment_id);
445
* Helper method which initializes the header message for
448
* @param[in,out] statement Statement message container to modify
449
* @param[in] session Session object doing the processing
450
* @param[in] table Table object being updated
451
* @param[in] old_record Pointer to the old data in the record
452
* @param[in] new_record Pointer to the new data in the record
454
void setUpdateHeader(message::Statement &statement,
455
Session::const_reference session,
457
const unsigned char *old_record,
458
const unsigned char *new_record);
461
* Helper method which returns an initialized Statement
462
* message for methods doing deletion of data.
464
* @param[in] session Session object doing the processing
465
* @param[in] table Table object being deleted from
466
* @param[out] next_segment_id The next Statement segment id to be used
468
message::Statement &getDeleteStatement(Session::reference session,
470
uint32_t *next_segment_id);
473
* Helper method which initializes the header message for
476
* @param[in,out] statement Statement message container to modify
477
* @param[in] session Session object doing the processing
478
* @param[in] table Table object being deleted from
480
void setDeleteHeader(message::Statement &statement,
481
Session::const_reference session,
485
* Commits a normal transaction (see above) and pushes the transaction
486
* message out to the replicators.
488
* @param session Session object committing the transaction
490
int commitTransactionMessage(Session::reference session);
493
* Marks the current active transaction message as being rolled back and
494
* pushes the transaction message out to replicators.
496
* @param session Session object committing the transaction
498
void rollbackTransactionMessage(Session::reference session);
501
* Rolls back the current statement, deleting the last Statement out of
502
* the current Transaction message.
504
* @param session Session object committing the transaction
506
* @note This depends on having clear statement boundaries (i.e., one
507
* Statement message per actual SQL statement).
509
void rollbackStatementMessage(Session::reference session);
479
atomic<TransactionId> current_transaction_id;
512
482
* Checks if a field has been updated
514
484
* @param current_field Pointer to the field to check if it is updated
515
* @param table Table object containing update information
485
* @in_table Pointer to the Table containing update information
516
486
* @param old_record Pointer to the raw bytes representing the old record/row
517
487
* @param new_record Pointer to the raw bytes representing the new record/row
519
489
bool isFieldUpdated(Field *current_field,
521
491
const unsigned char *old_record,
522
492
const unsigned char *new_record);