fixlets for YUM progress reporting No luck
authorDuncan Mac-Vicar P <dmacvicar@suse.de>
Wed, 6 Sep 2006 11:03:49 +0000 (11:03 +0000)
committerDuncan Mac-Vicar P <dmacvicar@suse.de>
Wed, 6 Sep 2006 11:03:49 +0000 (11:03 +0000)
as igzstream can forward and rewind to get its size

devel/devel.dmacvicar/testbed.cc
zypp/parser/ParserProgress.h
zypp/parser/XMLNodeIterator.cc
zypp/parser/XMLNodeIterator.h
zypp/source/yum/YUMSourceImpl.cc

index 609262c8c2708a633f3bffffd4712c0b2ea5df8c..7efda950891d9e396bce1da74424edd094f480c6 100644 (file)
@@ -1,4 +1,5 @@
 #include <iostream>
+#include <fstream>
 
 #include <zypp/base/Logger.h>
 #include <zypp/ZYpp.h>
 #include "zypp/PublicKey.h"
 #include "zypp/detail/PackageImplIf.h"
 #include "zypp/source/PackageDelta.h"
+#include "zypp/parser/yum/YUMPrimaryParser.h"
 #include "zypp/detail/ImplConnect.h"
 
 #include "zypp/SourceFactory.h"
 #include "testsuite/src/utils/TestUtils.h"
+#include "zypp/base/GzStream.h"
 
 using namespace std;
 using namespace zypp;
@@ -21,7 +24,18 @@ using namespace zypp::source;
 using namespace zypp::packagedelta;
 //using namespace DbXml;
 
-int main()
+struct YUMSourceEventHandler
+{
+  YUMSourceEventHandler()
+  {}
+        
+  void operator()( int p )
+  {
+    std::cout << "\rProgress " << p << "               " << std::endl;
+  }
+};
+
+int main(int argc, char **argv)
 {
   try
   {
@@ -29,8 +43,25 @@ int main()
     
     //PublicKey key("repomd.xml.key");
     //cout << key << endl;
-    z->initializeTarget("/");
-        
+    //z->initializeTarget("/");
+    
+    Pathname filename = "primary.xml";
+    //ifgzstream st ( argv[1] );
+    std::ifstream st ( argv[1] );
+    
+    if ( st.bad() )
+      ZYPP_THROW(Exception("archivo malo"));
+    
+    parser::ParserProgress::Ptr progress;
+    YUMSourceEventHandler npp;
+    progress.reset( new parser::ParserProgress( npp, PathInfo(filename).size()  ) );
+    
+    parser::yum::YUMPrimaryParser prim(st, "", progress);
+    for (; !prim.atEnd(); ++prim)
+    {
+      std::cout << "iteracion" << std::endl;
+      if (*prim == NULL) continue;      // incompatible arch detected during parsi
+    }    
   }
   catch ( const Exception &e )
   {
index 157869bd62166f95f3d93b430d4598ad021790d5..8467723965ddca53e2429a5338d11018dc59c512 100644 (file)
@@ -27,11 +27,11 @@ namespace parser
       /**
        * initializes a progress objetc, with a callback functor
        * if you are not reporting percentage, then set
-       * the metric to the goal, and report using the same
+       * the total_steps to the goal, and report using the same
        * unit, then
        */
-      ParserProgress( boost::function<void (int)> fnc, int metric = 100 )
-      : _fnc(fnc), _previous_progress(0), _metric(metric)
+      ParserProgress( boost::function<void (long int)> fnc, long int total_steps = 100 )
+      : _fnc(fnc), _previous_progress(0), _total_steps(total_steps)
       {
         
       };
@@ -45,12 +45,13 @@ namespace parser
        * this progress object to update progress
        * information
        */
-      void progress(int p)
+      void progress(long int p)
       {
-        if ( _metric != 100 )
+        //std::cout << "real " << p << std::endl;
+        if ( _total_steps != 100 )
         {
-          int current_done = p;
-          p = (int)((float) current_done/(float) _metric);
+          long int current_done = p;
+          p = (long int)(((double) current_done/(double) _total_steps)*100);
         }
         
         if (_fnc && ( p !=  _previous_progress ))
@@ -60,6 +61,11 @@ namespace parser
         }
       }
       
+      void setTotalSteps( long int total_steps )
+      {
+        _total_steps = total_steps;
+      }
+      
       /**
        * report progress finished
        */
@@ -87,9 +93,9 @@ namespace parser
       }
       
     private:
-      boost::function<void (int)> _fnc;
-      int _previous_progress;
-      int _metric;
+      boost::function<void (long int)> _fnc;
+      long int _previous_progress;
+      long int _total_steps;
   };
 
 } // namespace parser
index 1440f4e06efadc7024bd763a64452a1a104fadb5..9b7ff5ca9357a8c6dd3034b49561ac5b48624f6a 100644 (file)
@@ -126,7 +126,7 @@ namespace zypp {
       _input(& input),
       _reader(xmlReaderForIO(ioread, ioclose, _input, baseUrl.c_str(), "utf-8",
                              XML_PARSE_PEDANTIC)),
-      _baseUrl(baseUrl), _progress(progress)
+      _baseUrl(baseUrl), _progress(progress), _stream_size(0), _bytes_consumed(0)
     {
       xmlTextReaderSetErrorHandler(_reader, (xmlTextReaderErrorFunc) errorHandler, this);
       // xmlTextReaderSetStructuredErrorHandler(_reader, structuredErrorHandler, this);
@@ -160,8 +160,13 @@ namespace zypp {
     bool
     XMLNodeIteratorBase::atEnd() const
     {
-      return (_error.get() != 0
-              || getCurrent() == 0);
+      if ( _error.get() != 0 || getCurrent() == 0 )
+      {
+        if ( _progress )
+          _progress->finish();
+        return true;
+      }
+      return false;
     }
 
 
@@ -185,6 +190,19 @@ namespace zypp {
     void XMLNodeIteratorBase::fetchNext()
     {
       xml_assert(_reader);
+      
+      if ( _progress )
+      {
+        long int consumed = xmlTextReaderByteConsumed (_reader);
+        //MIL <<  consumed << " bytes consumed." << endl;
+        // only report every 4k or more
+        if ( ( consumed - _bytes_consumed > 4096 ) )
+        {
+          _progress->progress(consumed);
+          _bytes_consumed = consumed;
+        }
+      }
+      
       int status;
       /* throw away the old entry */
       setCurrent(0);
@@ -193,20 +211,18 @@ namespace zypp {
           /* this is a trivial iterator over (max) only one element,
              and we reach the end now. */
         ;
-        if ( _progress )
-          _progress->progress( 100 );
       }
       else {
           /* repeat as long as we successfully read nodes
              breaks out when an interesting node has been found */
-        while ((status = xmlTextReaderRead(_reader))==1) {
+        while ((status = xmlTextReaderRead(_reader))==1)
+        { 
           xmlNodePtr node = xmlTextReaderCurrentNode(_reader);
+          
           if (isInterested(node))
           {
               // xmlDebugDumpNode(stdout,node,5);
             _process(_reader);
-            if ( _progress )
-              _progress->progress( xmlTextReaderByteConsumed (_reader) );
               // _currentDataPtr.reset(new ENTRYTYPE(process(_reader)));
             status = xmlTextReaderNext(_reader);
             break;
index a538157dbfc6cee419887b60522db4d2b1a6430e..7dc8f25215b8bfa790bf09383cd90ccab4c7a80b 100644 (file)
@@ -294,6 +294,14 @@ namespace zypp {
        */
       parser::ParserProgress::Ptr _progress;
       
+      /**
+       * size of the stream to parse
+       */
+      long int _stream_size;
+      /**
+       * bytes consumed in last report
+       */
+      long int _bytes_consumed;
     }; /* end class XMLNodeIteratorBase */
 
 
index 1f8b1428324ece43827c005c3ef697868e20d263..177d8f895ec7886e455143acd181501df2979811 100644 (file)
@@ -84,6 +84,21 @@ namespace zypp
         callback::SendReport<SourceReport> &_report;
       };
       
+      static long int get_stream_size( const Pathname &p )
+      {
+        ifgzstream input( p.asString().c_str() );
+        
+        if ( input.bad() )
+          ZYPP_THROW(Exception("Can't read " + p.asString() + " to calculate compressed stream size"));
+        
+        // get the size of the stream
+        DBG << "Getting size of the stream." << std::endl;
+        input.seekg (0, ios::end);
+        long int stream_size = input.tellg();
+        DBG << "XML stream size: " << stream_size << std::endl;
+        return stream_size;
+      }
+      
       ///////////////////////////////////////////////////////////////////
       //
       //        CLASS NAME : YUMSourceImpl
@@ -392,7 +407,7 @@ namespace zypp
         parser::ParserProgress::Ptr progress;
         callback::SendReport<SourceReport> report;
         YUMSourceEventHandler npp(report);
-        progress.reset( new parser::ParserProgress( npp, PathInfo(repomdFile()).size()  ) );
+        progress.reset( new parser::ParserProgress( npp ) );
         
         report->start( selfSourceRef(), "Parsing index file" );
         try
@@ -497,7 +512,7 @@ namespace zypp
 
             parser::ParserProgress::Ptr progress;
             YUMSourceEventHandler npp(report);
-            progress.reset( new parser::ParserProgress( npp, PathInfo(filename).size() ) );
+            progress.reset( new parser::ParserProgress( npp, get_stream_size(filename) ) );
             report->start( selfSourceRef(), "Parsing filelist from " + filename.asString() );
             
             YUMFileListParser filelist ( st, "", progress );
@@ -538,7 +553,7 @@ namespace zypp
             
             parser::ParserProgress::Ptr progress;
             YUMSourceEventHandler npp(report);
-            progress.reset( new parser::ParserProgress( npp, PathInfo(filename).size() ) );
+            progress.reset( new parser::ParserProgress( npp ) );
             report->start( selfSourceRef(), "Parsing packages from " + filename.asString() );
             
             ifgzstream st ( filename.asString().c_str() );
@@ -611,7 +626,7 @@ namespace zypp
             
             parser::ParserProgress::Ptr progress;
             YUMSourceEventHandler npp(report);
-            progress.reset( new parser::ParserProgress( npp, PathInfo(filename).size() ) );
+            progress.reset( new parser::ParserProgress( npp ) );
             report->start( selfSourceRef(), "Parsing selection " + filename.asString() );
             
             YUMGroupParser group(st, "", progress);
@@ -657,7 +672,7 @@ namespace zypp
             
             parser::ParserProgress::Ptr progress;
             YUMSourceEventHandler npp(report);
-            progress.reset( new parser::ParserProgress( npp, PathInfo(filename).size() )  );
+            progress.reset( new parser::ParserProgress( npp )  );
             report->start( selfSourceRef(), "Parsing pattern " + filename.asString() );
             
             YUMPatternParser pattern(st, "", progress);
@@ -706,7 +721,7 @@ namespace zypp
             
             parser::ParserProgress::Ptr progress;
             YUMSourceEventHandler npp(report);
-            progress.reset( new parser::ParserProgress( npp, PathInfo(filename).size() ) );
+            progress.reset( new parser::ParserProgress( npp ) );
             report->start( selfSourceRef(), "Parsing patches index " + filename.asString() );
             YUMPatchesParser patch(st, "", progress);
 
@@ -750,7 +765,7 @@ namespace zypp
             
             parser::ParserProgress::Ptr progress;
             YUMSourceEventHandler npp(report);
-            progress.reset( new parser::ParserProgress( npp, PathInfo(filename).size() ) );
+            progress.reset( new parser::ParserProgress( npp ) );
         
             report->start( selfSourceRef(), "Parsing patch " + filename.asString() );