1050
1056
/* If there is an active statement message, finalize it */
1051
1057
message::Statement *statement= in_session->getStatementMessage();
1053
if (statement != NULL)
1055
finalizeStatementMessage(*statement, in_session);
1058
return 0; /* No data modification occurred inside the transaction */
1060
* Statement should always be NULL since we finalize each message
1061
* in autocommitOrRollback()
1063
assert(statement == NULL);
1066
* If no Transaction message was ever created, then no data modification
1067
* occurred inside the transaction, so nothing to do.
1069
if (in_session->getTransactionMessage() == NULL)
1060
1072
message::Transaction* transaction= getActiveTransactionMessage(in_session);
1138
1150
cleanupTransactionMessage(transaction, in_session);
1153
void TransactionServices::rollbackStatementMessage(Session *in_session)
1155
ReplicationServices &replication_services= ReplicationServices::singleton();
1156
if (! replication_services.isActive())
1159
/* If we never added a Statement message, nothing to undo. */
1160
if (in_session->getStatementMessage() == NULL)
1163
message::Transaction *transaction= getActiveTransactionMessage(in_session);
1165
google::protobuf::RepeatedPtrField<message::Statement> *statements_in_txn;
1166
statements_in_txn= transaction->mutable_statement();
1168
TODO: Fix for segmented statements
1169
message::Statement *statement= in_session->getStatementMessage();
1173
statements_in_txn->RemoveLast();
1175
in_session->setStatementMessage(NULL);
1141
1178
message::Statement &TransactionServices::getInsertStatement(Session *in_session,
1142
1179
Table *in_table,
1143
1180
uint32_t *next_segment_id)
1932
* Template for removing Statement records of different types.
1934
* The code for removing records from different Statement message types
1935
* is identical except for the class types that are embedded within the
1938
* There are 3 scenarios we need to look for:
1939
* - We've been asked to remove more records than exist in the Statement
1940
* - We've been asked to remove less records than exist in the Statement
1941
* - We've been asked to remove ALL records that exist in the Statement
1943
* If we are removing ALL records, then effectively we would be left with
1944
* an empty Statement message, so we should just remove it and clean up
1945
* message pointers in the Session object.
1947
template <class DataType, class RecordType>
1948
static bool removeStatementRecordsWithType(Session *session,
1952
uint32_t num_avail_recs= static_cast<uint32_t>(data->record_size());
1954
/* If there aren't enough records to remove 'count' of them, error. */
1955
if (num_avail_recs < count)
1959
* If we are removing all of the data records, we'll just remove this
1960
* entire Statement message.
1962
if (num_avail_recs == count)
1964
message::Transaction *transaction= session->getTransactionMessage();
1965
protobuf::RepeatedPtrField<message::Statement> *statements= transaction->mutable_statement();
1966
statements->RemoveLast();
1969
* Now need to set the Session Statement pointer to either the previous
1970
* Statement, or NULL if there isn't one.
1972
if (statements->size() == 0)
1974
session->setStatementMessage(NULL);
1979
* There isn't a great way to get a pointer to the previous Statement
1980
* message using the RepeatedPtrField object, so we'll just get to it
1981
* using the Transaction message.
1983
int last_stmt_idx= transaction->statement_size() - 1;
1984
session->setStatementMessage(transaction->mutable_statement(last_stmt_idx));
1987
/* We only need to remove 'count' records */
1988
else if (num_avail_recs > count)
1990
protobuf::RepeatedPtrField<RecordType> *records= data->mutable_record();
1992
records->RemoveLast();
1999
bool TransactionServices::removeStatementRecords(Session *session,
2002
ReplicationServices &replication_services= ReplicationServices::singleton();
2003
if (! replication_services.isActive())
2006
/* Get the most current Statement */
2007
message::Statement *statement= session->getStatementMessage();
2009
/* Make sure we have work to do */
2010
if (statement == NULL)
2015
switch (statement->type())
2017
case message::Statement::INSERT:
2019
message::InsertData *data= statement->mutable_insert_data();
2020
retval= removeStatementRecordsWithType<message::InsertData, message::InsertRecord>(session, data, count);
2024
case message::Statement::UPDATE:
2026
message::UpdateData *data= statement->mutable_update_data();
2027
retval= removeStatementRecordsWithType<message::UpdateData, message::UpdateRecord>(session, data, count);
2031
case message::Statement::DELETE: /* not sure if this one is possible... */
2033
message::DeleteData *data= statement->mutable_delete_data();
2034
retval= removeStatementRecordsWithType<message::DeleteData, message::DeleteRecord>(session, data, count);
2047
1967
void TransactionServices::createTable(Session *in_session,
2048
1968
const message::Table &table)