Do commit based on sat::Transaction.
[platform/upstream/libzypp.git] / zypp / ZYppCommitResult.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/ZYppCommitResult.cc
10  *
11 */
12
13 #include <iostream>
14 #include "zypp/base/LogTools.h"
15
16 #include "zypp/ZYppCommitResult.h"
17
18 ///////////////////////////////////////////////////////////////////
19 namespace zypp
20 { /////////////////////////////////////////////////////////////////
21
22   ///////////////////////////////////////////////////////////////////
23   //
24   //    CLASS NAME : ZYppCommitResult::Impl
25   //
26   ///////////////////////////////////////////////////////////////////
27
28   class ZYppCommitResult::Impl
29   {
30     public:
31       Impl()
32       {}
33
34     public:
35       Pathname                  _root;
36       sat::Transaction          _transaction;
37       TransactionStepList       _transactionStepList;
38       UpdateNotifications       _updateMessages;
39
40     private:
41       friend Impl * rwcowClone<Impl>( const Impl * rhs );
42       /** clone for RWCOW_pointer */
43       Impl * clone() const { return new Impl( *this ); }
44   };
45
46   ///////////////////////////////////////////////////////////////////
47   //
48   //    CLASS NAME : ZYppCommitResult
49   //
50   ///////////////////////////////////////////////////////////////////
51
52   ZYppCommitResult::ZYppCommitResult()
53   : _result(0), _pimpl( new Impl )
54   {}
55
56   ZYppCommitResult::ZYppCommitResult( const Pathname & root_r )
57   : _result(0), _pimpl( new Impl )
58   { _pimpl->_root = root_r; }
59
60   const Pathname & ZYppCommitResult::root() const
61   { return _pimpl->_root; }
62
63   const sat::Transaction & ZYppCommitResult::transaction() const
64   { return _pimpl->_transaction; }
65
66   sat::Transaction & ZYppCommitResult::rTransaction()
67   { return _pimpl->_transaction; }
68
69   const ZYppCommitResult::TransactionStepList & ZYppCommitResult::transactionStepList() const
70   { return _pimpl->_transactionStepList; }
71
72   ZYppCommitResult::TransactionStepList & ZYppCommitResult::rTransactionStepList()
73   { return _pimpl->_transactionStepList; }
74
75   const UpdateNotifications & ZYppCommitResult::updateMessages() const
76   { return _pimpl->_updateMessages; }
77
78   UpdateNotifications & ZYppCommitResult::rUpdateMessages()
79   { return _pimpl->_updateMessages; }
80
81   ZYppCommitResult::InsDelCnt ZYppCommitResult::totalCount() const
82   {
83     InsDelCnt ret;
84     for_( it, _pimpl->_transaction.actionBegin(), _pimpl->_transaction.actionEnd() )
85     {
86       ++( it->stepType() == sat::Transaction::TRANSACTION_ERASE ? ret.second : ret.first );
87     }
88
89     return ret;
90   }
91
92   ZYppCommitResult::InsDelCnt ZYppCommitResult::stepStageCount( sat::Transaction::StepStage stage_r ) const
93   {
94     InsDelCnt ret;
95     for_( it, _pimpl->_transaction.actionBegin(), _pimpl->_transaction.actionEnd() )
96     {
97       if ( it->stepStage() != stage_r )
98         continue;
99       ++( it->stepType() == sat::Transaction::TRANSACTION_ERASE ? ret.second : ret.first );
100     }
101     return ret;
102   }
103
104   void  ZYppCommitResult::resultCount( InsDelCnt & total_r, InsDelCnt & done_r, InsDelCnt & error_r, InsDelCnt & skipped_r ) const
105   {
106     total_r = done_r = error_r = skipped_r = InsDelCnt();
107     for_( it, _pimpl->_transaction.actionBegin(), _pimpl->_transaction.actionEnd() )
108     {
109       ++( it->stepType() == sat::Transaction::TRANSACTION_ERASE ? total_r.second : total_r.first );
110       switch ( it->stepStage() )
111       {
112         case sat::Transaction::STEP_DONE:
113           ++( it->stepType() == sat::Transaction::TRANSACTION_ERASE ? done_r.second : done_r.first );
114           break;
115         case sat::Transaction::STEP_ERROR:
116           ++( it->stepType() == sat::Transaction::TRANSACTION_ERASE ? error_r.second : error_r.first );
117           break;
118         case sat::Transaction::STEP_TODO:
119           ++( it->stepType() == sat::Transaction::TRANSACTION_ERASE ? skipped_r.second : skipped_r.first );
120           break;
121       }
122     }
123   }
124
125   ///////////////////////////////////////////////////////////////////
126
127   std::ostream & operator<<( std::ostream & str, const ZYppCommitResult::InsDelCnt & obj )
128   { return str << obj.first << '/' << obj.second; }
129
130   std::ostream & operator<<( std::ostream & str, const ZYppCommitResult & obj )
131   {
132     ZYppCommitResult::InsDelCnt result[4];
133     obj.resultCount( result[0], result[1], result[2], result[3] );
134
135     str << "CommitResult "
136         << " (ins/del total " << result[0]
137         << ", done " << result[1]
138         << ", error " << result[2]
139         << ", skipped " << result[3]
140         << ", updateMessages " << obj.updateMessages().size()
141         << ")"
142         << std::endl << obj.transaction();
143     return str;
144   }
145
146   /////////////////////////////////////////////////////////////////
147 } // namespace zypp
148 ///////////////////////////////////////////////////////////////////