| 4037 | } |
| 4038 | |
| 4039 | void 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 | |
| 4076 | void jrd_tra::releaseSavepoint(thread_db* tdbb) |
no test coverage detected