MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / rollbackToSavepoint

Method rollbackToSavepoint

src/jrd/tra.cpp:4039–4073  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4037}
4038
4039void jrd_tra::rollbackToSavepoint(thread_db* tdbb, SavNumber number)
4040/**************************************
4041 *
4042 * r o l l b a c k T o S a v e p o i n t
4043 *
4044 **************************************
4045 *
4046 * Functional description
4047 * Rollback savepoints up to one with given number.
4048 * There may be cases when savepoint with given number does not exist.
4049 * Rollback all savepoints with bigger numbers then, but not more.
4050 * These cases most likely is a bug in logic somewhere, so assert is here.
4051 *
4052 **************************************/
4053{
4054 Jrd::ContextPoolHolder context(tdbb, tra_pool);
4055
4056 // Merge all savepoints (except the given one) into a single one
4057 while (tra_save_point && tra_save_point->getNumber() > number &&
4058 tra_save_point->getNext() && tra_save_point->getNext()->getNumber() >= number)
4059 {
4060 REPL_save_cleanup(tdbb, this, tra_save_point, true);
4061 tra_save_point = tra_save_point->rollforward(tdbb);
4062 }
4063
4064 // Check that savepoint with the given number really exists
4065 fb_assert(tra_save_point && tra_save_point->getNumber() == number);
4066
4067 if (tra_save_point && tra_save_point->getNumber() >= number) // second line of defence
4068 // under no circumstances a savepoint with smaller number should be rolled back
4069 {
4070 // Undo the savepoint
4071 rollbackSavepoint(tdbb);
4072 }
4073}
4074
4075
4076void jrd_tra::releaseSavepoint(thread_db* tdbb)

Callers 3

executeMethod · 0.80
EXE_receiveFunction · 0.80
execute_looperFunction · 0.80

Calls 4

REPL_save_cleanupFunction · 0.85
getNumberMethod · 0.80
rollforwardMethod · 0.80
getNextMethod · 0.45

Tested by

no test coverage detected