@@ -717,47 +717,104 @@ void dbDatabase::write(std::ostream& file)
717717void dbDatabase::beginEco (dbBlock* block_)
718718{
719719 _dbBlock* block = (_dbBlock*) block_;
720-
721- {
722- delete block->_journal ;
720+ if (block->_journal ) {
721+ endEco (block_);
723722 }
724-
725723 block->_journal = new dbJournal (block_);
726724 assert (block->_journal );
725+ debugPrint (block_->getImpl ()->getLogger (),
726+ utl::ODB,
727+ " DB_ECO" ,
728+ 2 ,
729+ " ECO: Started ECO #{}" ,
730+ block->_journal_stack .size ());
727731}
728732
729733void dbDatabase::endEco (dbBlock* block_)
730734{
731735 _dbBlock* block = (_dbBlock*) block_;
732- dbJournal* eco = block->_journal ;
736+ assert (block->_journal );
737+ block->_journal_stack .push (block->_journal );
733738 block->_journal = nullptr ;
739+ debugPrint (block_->getImpl ()->getLogger (),
740+ utl::ODB,
741+ " DB_ECO" ,
742+ 2 ,
743+ " ECO: Ended ECO #{} (size {}) and pushed to ECO stack" ,
744+ block->_journal_stack .size () - 1 ,
745+ block->_journal_stack .top ()->size ());
746+ }
734747
735- {
736- delete block->_journal_pending ;
737- }
748+ void dbDatabase::commitEco (dbBlock* block_)
749+ {
750+ _dbBlock* block = (_dbBlock*) block_;
751+ // Commit the current ECO or the last ECO into stack
752+ assert (block->_journal || !block->_journal_stack .empty ());
753+ if (!block->_journal ) {
754+ block->_journal = block->_journal_stack .top ();
755+ block->_journal_stack .pop ();
756+ }
757+ if (!block->_journal_stack .empty ()) {
758+ dbJournal* prev_journal = block->_journal_stack .top ();
759+ int old_size = prev_journal->size ();
760+ prev_journal->append (block->_journal );
761+ debugPrint (block_->getImpl ()->getLogger (),
762+ utl::ODB,
763+ " DB_ECO" ,
764+ 2 ,
765+ " ECO: Merged ECO #{} (size {}) with ECO #{} (size {} -> {})" ,
766+ block->_journal_stack .size (),
767+ block->_journal ->size (),
768+ block->_journal_stack .size () - 1 ,
769+ old_size,
770+ block->_journal_stack .top ()->size ());
771+ } else {
772+ debugPrint (block_->getImpl ()->getLogger (),
773+ utl::ODB,
774+ " DB_ECO" ,
775+ 2 ,
776+ " ECO: Committed ECO #{} (size {}) and removed from ECO stack" ,
777+ block->_journal_stack .size (),
778+ block->_journal ->size ());
779+ }
780+ delete block->_journal ;
781+ block->_journal = nullptr ;
782+ }
738783
739- block->_journal_pending = eco;
784+ void dbDatabase::undoEco (dbBlock* block_)
785+ {
786+ _dbBlock* block = (_dbBlock*) block_;
787+ assert (block->_journal || !block->_journal_stack .empty ());
788+ if (!block->_journal ) {
789+ block->_journal = block->_journal_stack .top ();
790+ block->_journal_stack .pop ();
791+ }
792+ debugPrint (block_->getImpl ()->getLogger (),
793+ utl::ODB,
794+ " DB_ECO" ,
795+ 2 ,
796+ " ECO: Undid ECO #{} (size {})" ,
797+ block->_journal_stack .size (),
798+ block->_journal ->size ());
799+ dbJournal* journal = block->_journal ;
800+ block->_journal = nullptr ;
801+ journal->undo ();
802+ delete block->_journal ;
740803}
741804
742805bool dbDatabase::ecoEmpty (dbBlock* block_)
743806{
744807 _dbBlock* block = (_dbBlock*) block_;
745-
746808 if (block->_journal ) {
747809 return block->_journal ->empty ();
748810 }
749-
750811 return false ;
751812}
752813
753- int dbDatabase::checkEco (dbBlock* block_)
814+ bool dbDatabase::ecoStackEmpty (dbBlock* block_)
754815{
755816 _dbBlock* block = (_dbBlock*) block_;
756-
757- if (block->_journal ) {
758- return block->_journal ->size ();
759- }
760- return 0 ;
817+ return block->_journal_stack .empty ();
761818}
762819
763820void dbDatabase::readEco (dbBlock* block_, const char * filename)
@@ -774,11 +831,10 @@ void dbDatabase::readEco(dbBlock* block_, const char* filename)
774831 assert (eco);
775832 stream >> *eco;
776833
777- {
778- delete block->_journal_pending ;
779- }
780-
781- block->_journal_pending = eco;
834+ delete block->_journal ;
835+ block->_journal = nullptr ;
836+ eco->redo ();
837+ block->_journal = eco;
782838}
783839
784840void dbDatabase::writeEco (dbBlock* block_, const char * filename)
@@ -796,33 +852,12 @@ void dbDatabase::writeEco(dbBlock* block_, const char* filename)
796852 file.exceptions (std::ifstream::failbit | std::ifstream::badbit
797853 | std::ios::eofbit);
798854
799- if (block->_journal_pending ) {
855+ if (block->_journal ) {
800856 dbOStream stream (block->getDatabase (), file);
801- stream << *block->_journal_pending ;
802- }
803- }
804-
805- void dbDatabase::commitEco (dbBlock* block_)
806- {
807- _dbBlock* block = (_dbBlock*) block_;
808-
809- // TODO: Need a check to ensure the commit is not applied to the block of
810- // which this eco was generated from.
811- if (block->_journal_pending ) {
812- block->_journal_pending ->redo ();
813- delete block->_journal_pending ;
814- block->_journal_pending = nullptr ;
815- }
816- }
817-
818- void dbDatabase::undoEco (dbBlock* block_)
819- {
820- _dbBlock* block = (_dbBlock*) block_;
821-
822- if (block->_journal_pending ) {
823- block->_journal_pending ->undo ();
824- delete block->_journal_pending ;
825- block->_journal_pending = nullptr ;
857+ stream << *block->_journal ;
858+ } else if (!block->_journal_stack .empty ()) {
859+ dbOStream stream (block->getDatabase (), file);
860+ stream << *block->_journal_stack .top ();
826861 }
827862}
828863
0 commit comments