Use libsolv includes and adjust documentation
[platform/upstream/libzypp.git] / zypp / Repository.h
index ce50621..f23dc60 100644 (file)
 #include "zypp/base/SafeBool.h"
 #include "zypp/Pathname.h"
 #include "zypp/sat/detail/PoolMember.h"
+#include "zypp/sat/LookupAttr.h"     // LookupAttrTools.h included at EOF
 #include "zypp/sat/Solvable.h"
 #include "zypp/RepoInfo.h"
 #include "zypp/Date.h"
-extern "C"
-{
-#include "satsolver/repo.h"
-}
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
 
+    namespace detail
+    {
+      struct ByRepository;
+    }
+
     ///////////////////////////////////////////////////////////////////
     //
     // CLASS NAME : Repository
@@ -41,6 +43,8 @@ namespace zypp
         typedef sat::detail::size_type size_type;
         typedef sat::detail::RepoIdType IdType;
 
+        typedef sat::ArrayAttr<std::string,std::string> Keywords;
+
     public:
         /** Default ctor creates \ref noRepository.*/
         Repository()
@@ -54,56 +58,103 @@ namespace zypp
         /** Represents no \ref Repository. */
         static const Repository noRepository;
 
+#ifndef SWIG // Swig treats it as syntax error
         /** Evaluate \ref Repository in a boolean context (\c != \c noRepository). */
         using base::SafeBool<Repository>::operator bool_type;
+#endif
+        /** Reserved system repository alias \c @System. */
+        static const std::string & systemRepoAlias();
 
         /** Return whether this is the system repository. */
         bool isSystemRepo() const;
 
     public:
-         /** 
-          * Short unique, convenience string to refer to a repo.
+         /**
+          * Short unique string to identify a repo.
           * ie: openSUSE-10.3
           *
           * If you are looking for a label to display
-          * see \ref info() which provides \ref RepoInfo::name()
+          * see \ref name().
           * ie: "openSUSE 10.3 Main repository"
           *
           */
         std::string alias() const;
 
-         /** 
-          * Short unique, convenience string to refer to a repo.
-          * ie: openSUSE-10.3
-          *
-          * The sat solver uses name for what we know as alias
-          * In rpm repositories, name is a label string
-          * ie: "openSUSE 10.3 Main repository"
-          *
-          * We know follow rpm conventions and ignore satsolver
-          * wording for name.
-          *
-          * Use \ref alias() instead
-          */
-        ZYPP_DEPRECATED std::string name() const
-        { return alias(); }
-        
+        /** Label to display for this repo. */
+        std::string name() const;
+
         /**
          * Timestamp when this repository was generated
+         *
+         * Usually this value is calculated as the newer
+         * timestamp from the timestamp of all the resources
+         * that conform the repository's metadata.
+         *
+         * For example in a rpm-md repository, it would be
+         * the resource specified in the xml file whith
+         * the newest timestamp attribute (which is the
+         * timestamp of the file in the server ).
+         *
+         * The timestamp is 0 if the repository does not
+         * specify when it was generated.
+         *
          */
-        zypp::Date generatedTimestamp() const;
+        Date generatedTimestamp() const;
 
         /**
-         * Expiration date
+         * Suggested expiration timestamp.
+         *
+         * Repositories can define an amount of time
+         * they expire, with the generated timestamp as
+         * the base point of time.
+         *
+         * Note that is the responsability of the repository
+         * to freshen the generated timestamp to tell the
+         * client that the repo is alive and updating the
+         * metadata.
+         *
+         * The timestamp is 0 if the repository does not specify
+         * an expiration date.
+         *
          */
-        zypp::Date expirationTimestamp() const;
+        Date suggestedExpirationTimestamp() const;
 
         /**
-         * The expiration date of this repository
+         * repository keywords (tags)
+         */
+        Keywords keywords() const;
+
+        /**
+         * The suggested expiration date of this repository
          * already passed
+         *
+         * rpm-md repositories can provide this tag using the
+         * expire extension tag:
+         * \see http://en.opensuse.org/Standards/Rpm_Metadata#SUSE_repository_info_.28suseinfo.xml.29.2C_extensions_to_repomd.xml
          */
         bool maybeOutdated() const;
 
+        /**
+         * if the repository claims to update something then
+         * it is an update repository
+         *
+         * This is implemented by looking at the repository updates
+         * tag.
+         * \see http://en.opensuse.org/Standards/Rpm_Metadata#SUSE_repository_info_.28suseinfo.xml.29.2C_extensions_to_repomd.xml
+         */
+        bool isUpdateRepo() const;
+
+        /**
+         * wether the repository claims to update something \ref prod
+         * with key \ref cpeid
+         *
+         * \see zypp::Product::cpeId()
+         *
+         * See http://cpe.mitre.org/ for more information on the
+         * Common Platform Enumearation.
+         */
+        bool providesUpdatesFor( const std::string &cpeid ) const;
+
         /** Whether \ref Repository contains solvables. */
         bool solvablesEmpty() const;
 
@@ -117,6 +168,41 @@ namespace zypp
         SolvableIterator solvablesEnd() const;
 
     public:
+
+      /** Query class for Repository */
+      class ProductInfoIterator;
+
+      /**
+       * Get an iterator to the beginning of the repository
+       * compatible distros.
+       * \note This is only a hint. There is no guarantee that
+       * the repository is built for that product.
+       * \see Repository::ProductInfoIterator
+       */
+      ProductInfoIterator compatibleWithProductBegin() const;
+
+      /**
+       * Get an iterator to the end of the repository
+       * compatible distros.
+       * \see Repository::ProductInfoIterator
+       */
+      ProductInfoIterator compatibleWithProductEnd() const;
+
+      /**
+       * Get an iterator to the beginning of the repository
+       * compatible distros.
+       * \see Repository::ProductInfoIterator
+       */
+      ProductInfoIterator updatesProductBegin() const;
+
+      /**
+       * Get an iterator to the end of the repository
+       * compatible distros.
+       * \see Repository::ProductInfoIterator
+       */
+      ProductInfoIterator updatesProductEnd() const;
+
+    public:
         /** Return any associated \ref RepoInfo. */
         RepoInfo info() const;
 
@@ -155,7 +241,16 @@ namespace zypp
          */
         void addSolv( const Pathname & file_r );
 
-        /** Add \c count_r new empty \ref Solvable to this \ref Repository. */
+         /** Load \ref Solvables from a helix-file.
+         * Supports loading of gzip compressed files (.gz). In case of an exception
+         * the repository remains in the \ref Pool.
+         * \throws Exception if this is \ref noRepository
+         * \throws Exception if loading the helix-file fails.
+         * \see \ref Pool::addRepoHelix and \ref Repository::EraseFromPool
+         */
+        void addHelix( const Pathname & file_r );
+
+       /** Add \c count_r new empty \ref Solvable to this \ref Repository. */
         sat::Solvable::IdType addSolvables( unsigned count_r );
         /** \overload Add only one new \ref Solvable. */
         sat::Solvable::IdType addSolvable()
@@ -167,8 +262,21 @@ namespace zypp
         ::_Repo * get() const;
         /** Expert backdoor. */
         IdType id() const { return _id; }
+        /** libsolv internal priorities.
+         * Unlike the \ref RepoInfo priority which tries to be YUM conform
+         * (H[1-99]L), this one is the solvers internal priority representation.
+         * It is type \c int and as one might expect it, the higher the value
+         * the higher the priority. Subpriority is currently used to express
+         * media preferences (\see \ref MediaPriority).
+         */
+        //@{
+        int satInternalPriority() const;
+        int satInternalSubPriority() const;
+        //@}
     private:
+#ifndef SWIG // Swig treats it as syntax error
         friend base::SafeBool<Repository>::operator bool_type() const;
+#endif
         bool boolTest() const { return get(); }
     private:
         IdType _id;
@@ -191,6 +299,59 @@ namespace zypp
     { return lhs.get() < rhs.get(); }
 
     ///////////////////////////////////////////////////////////////////
+    /**
+     * Query class for Repository related products
+     *
+     * The iterator does not provide a dereference
+     * operator so you can do * on it, but you can
+     * access the attributes of each related product
+     * directly from the iterator.
+     *
+     * \code
+     * for_( it, repo.compatibleWithProductBegin(), repo.compatibleWithProductEnd() )
+     * {
+     *   cout << it.cpeid() << endl;
+     * }
+     * \endcode
+     *
+     */
+    class Repository::ProductInfoIterator : public boost::iterator_adaptor<
+        Repository::ProductInfoIterator    // Derived
+        , sat::LookupAttr::iterator        // Base
+        , int                              // Value
+        , boost::forward_traversal_tag     // CategoryOrTraversal
+        , int                              // Reference
+    >
+    {
+      public:
+        ProductInfoIterator()
+        {}
+
+        /**
+         * Product label
+         */
+        std::string label() const;
+
+        /**
+         * The Common Platform Enumeration name
+         * for this product.
+         *
+         * See http://cpe.mitre.org
+         */
+        std::string cpeId() const;
+
+      private:
+        friend class Repository;
+        /** Hide ctor as just a limited set of attributes is valid. */
+        explicit ProductInfoIterator( sat::SolvAttr attr_r, Repository repo_r );
+
+      private:
+        friend class boost::iterator_core_access;
+        int dereference() const { return 0; }
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
     //
     // CLASS NAME : Repository::EraseFromPool
     //
@@ -226,6 +387,7 @@ namespace zypp
            { repository_r.eraseFromPool(); }
     };
     ///////////////////////////////////////////////////////////////////
+
     ///////////////////////////////////////////////////////////////////
     namespace detail
     { /////////////////////////////////////////////////////////////////
@@ -234,54 +396,57 @@ namespace zypp
       //       CLASS NAME : RepositoryIterator
       //
       /** */
-       class RepositoryIterator : public boost::iterator_adaptor<
+      class RepositoryIterator : public boost::iterator_adaptor<
            RepositoryIterator                            // Derived
                           , ::_Repo **                   // Base
-                          , Repository                   // Value
+                           , Repository                   // Value
                           , boost::forward_traversal_tag // CategoryOrTraversal
                           , Repository                   // Reference
                             >
-       {
+      {
         public:
-           RepositoryIterator()
-               : RepositoryIterator::iterator_adaptor_( 0 )
-               {}
+          RepositoryIterator()
+          : RepositoryIterator::iterator_adaptor_( 0 )
+          {}
 
-           explicit RepositoryIterator( ::_Repo ** p )
-               : RepositoryIterator::iterator_adaptor_( p )
-               {}
+          explicit RepositoryIterator( ::_Repo ** p )
+          : RepositoryIterator::iterator_adaptor_( p )
+          {}
 
         private:
-           friend class boost::iterator_core_access;
-
-           Repository dereference() const
-               { return Repository( *base() ); }
-       };
-       ///////////////////////////////////////////////////////////////////
-       ///////////////////////////////////////////////////////////////////
-       //
-       //      CLASS NAME : ByRepository
-       //
-       /** Functor filtering \ref Solvable by \ref Repository.*/
-       struct ByRepository
-       {
+          friend class boost::iterator_core_access;
+
+          Repository dereference() const
+          { return Repository( *base() ); }
+      };
+      ///////////////////////////////////////////////////////////////////
+      ///////////////////////////////////////////////////////////////////
+      //
+      //       CLASS NAME : ByRepository
+      //
+      /** Functor filtering \ref Solvable by \ref Repository.*/
+      struct ByRepository
+      {
         public:
-           ByRepository( const Repository & repository_r ) : _repository( repository_r ) {}
-           ByRepository( sat::detail::RepoIdType id_r ) : _repository( id_r ) {}
-           ByRepository() {}
+          ByRepository( const Repository & repository_r ) : _repository( repository_r ) {}
+          ByRepository( sat::detail::RepoIdType id_r ) : _repository( id_r ) {}
+          ByRepository() {}
 
-           bool operator()( const sat::Solvable & slv_r ) const
-               { return slv_r.repository() == _repository; }
+          bool operator()( const sat::Solvable & slv_r ) const
+          { return slv_r.repository() == _repository; }
 
         private:
-           Repository _repository;
-       };
-       ///////////////////////////////////////////////////////////////////
-       /////////////////////////////////////////////////////////////////
+          Repository _repository;
+      };
+      ///////////////////////////////////////////////////////////////////
+      /////////////////////////////////////////////////////////////////
     } // namespace detail
     ///////////////////////////////////////////////////////////////////
-
-    /////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
 } // namespace zypp
 ///////////////////////////////////////////////////////////////////
+
+// Late include as sat::ArrayAttr requires Repository.h
+#include "zypp/sat/LookupAttrTools.h"
+
 #endif // ZYPP_SAT_REPOSITORY_H