libzypp
10.5.0
|
00001 /*---------------------------------------------------------------------\ 00002 | ____ _ __ __ ___ | 00003 | |__ / \ / / . \ . \ | 00004 | / / \ V /| _/ _/ | 00005 | / /__ | | | | | | | 00006 | /_____||_| |_| |_| | 00007 | | 00008 \---------------------------------------------------------------------*/ 00012 #ifndef ZYPP_POOLQUERY_H 00013 #define ZYPP_POOLQUERY_H 00014 00015 #include <iosfwd> 00016 #include <set> 00017 #include <map> 00018 00019 #include "zypp/base/Regex.h" 00020 #include "zypp/base/PtrTypes.h" 00021 #include "zypp/base/Function.h" 00022 00023 #include "zypp/sat/SolvIterMixin.h" 00024 #include "zypp/sat/LookupAttr.h" 00025 #include "zypp/sat/AttrMatcher.h" 00026 #include "zypp/sat/Pool.h" 00027 00029 namespace zypp 00030 { 00031 00032 namespace detail 00033 { 00034 class PoolQueryIterator; 00035 } 00036 00038 // 00039 // CLASS NAME : PoolQuery 00040 // 00090 class PoolQuery : public sat::SolvIterMixin<PoolQuery, detail::PoolQueryIterator> 00091 { 00092 public: 00093 typedef std::set<ResKind> Kinds; 00094 typedef std::set<std::string> StrContainer; 00095 typedef std::map<sat::SolvAttr, StrContainer> AttrRawStrMap; 00096 00097 typedef detail::PoolQueryIterator const_iterator; 00098 typedef unsigned int size_type; 00099 00100 public: 00101 typedef function<bool( const sat::Solvable & )> ProcessResolvable; 00102 00103 PoolQuery(); 00104 ~PoolQuery(); 00105 00120 const_iterator begin() const; 00121 00123 const_iterator end() const; 00124 00126 bool empty() const; 00127 00129 size_type size() const; 00131 00136 void execute(ProcessResolvable fnc); 00137 00146 void addKind(const ResKind & kind); 00147 00154 void addRepo(const std::string &repoalias); 00155 00158 00162 enum StatusFilter { 00163 ALL = 0, // both install filter and uninstall filter bits are 0 00164 INSTALLED_ONLY = 1, 00165 UNINSTALLED_ONLY = 2 00166 }; 00167 00169 void setInstalledOnly(); 00171 void setUninstalledOnly(); 00173 void setStatusFilterFlags( StatusFilter flags ); 00174 00176 00188 void addString(const std::string & value); 00189 00217 void addAttribute( const sat::SolvAttr & attr, const std::string & value = "" ); 00218 00280 void addDependency( const sat::SolvAttr & attr, const std::string & name, const Rel & op, const Edition & edition ); 00282 void addDependency( const sat::SolvAttr & attr, const std::string & name, const Rel & op, const Edition & edition, const Arch & arch ); 00283 00285 void addDependency( const sat::SolvAttr & attr, const std::string & name, const Edition & edition ) 00286 { addDependency( attr, name, Rel::EQ, edition ); } 00288 void addDependency( const sat::SolvAttr & attr, const std::string & name, const Edition & edition, const Arch & arch ) 00289 { addDependency( attr, name, Rel::EQ, edition, arch ); } 00290 00292 void addDependency( const sat::SolvAttr & attr, const std::string & name ) 00293 { addDependency( attr, name, Rel::ANY, Edition() ); } 00295 void addDependency( const sat::SolvAttr & attr, const std::string & name, const Arch & arch ) 00296 { addDependency( attr, name, Rel::ANY, Edition(), arch ); } 00297 00299 void addDependency( const sat::SolvAttr & attr, const Rel & op, const Edition & edition ) 00300 { addDependency( attr, std::string(), op, edition ); } 00302 void addDependency( const sat::SolvAttr & attr, const Rel & op, const Edition & edition, const Arch & arch ) 00303 { addDependency( attr, std::string(), op, edition, arch ); } 00304 00306 void addDependency( const sat::SolvAttr & attr, const Edition & edition ) 00307 { addDependency( attr, std::string(), Rel::EQ, edition ); } 00309 void addDependency( const sat::SolvAttr & attr, const Edition & edition, const Arch & arch ) 00310 { addDependency( attr, std::string(), Rel::EQ, edition, arch ); } 00311 00313 void addDependency( const sat::SolvAttr & attr ) 00314 { addDependency( attr, std::string(), Rel::ANY, Edition() ); } 00316 void addDependency( const sat::SolvAttr & attr, const Arch & arch ) 00317 { addDependency( attr, std::string(), Rel::ANY, Edition(), arch ); } 00318 00323 void addDependency( const sat::SolvAttr & attr, Capability cap_r ); 00325 00333 void setEdition(const Edition & edition, const Rel & op = Rel::EQ); 00334 00348 void setCaseSensitive( bool value = true ); 00349 00355 void setFilesMatchFullPath( bool value = true ); 00357 void setFilesMatchBasename( bool value = true ) 00358 { setFilesMatchFullPath( !value ); } 00359 00361 void setMatchExact(); 00363 void setMatchSubstring(); 00365 void setMatchGlob(); 00367 void setMatchRegex(); 00369 void setMatchWord(); 00370 //void setLocale(const Locale & locale); 00372 00379 void setRequireAll( bool require_all = true ); 00380 00381 00384 00386 const StrContainer & strings() const; 00390 const AttrRawStrMap & attributes() const; 00391 00392 const StrContainer & attribute(const sat::SolvAttr & attr) const; 00393 00394 const Kinds & kinds() const; 00395 00396 const StrContainer & repos() const; 00397 00398 const Edition edition() const; 00399 const Rel editionRel() const; 00400 00404 bool caseSensitive() const; 00405 00407 bool filesMatchFullPath() const; 00409 bool filesMatchBasename() const 00410 { return !filesMatchFullPath(); } 00411 00412 bool matchExact() const; 00413 bool matchSubstring() const; 00414 bool matchGlob() const; 00415 bool matchRegex() const; 00416 bool matchWord() const; 00417 00421 Match::Mode matchMode() const 00422 { return flags().mode(); } 00423 00428 bool requireAll() const; 00429 00430 StatusFilter statusFilterFlags() const; 00432 00443 bool recover( std::istream &str, char delim = '\n' ); 00444 00454 void serialize( std::ostream &str, char delim = '\n' ) const; 00455 00457 std::string asString() const; 00458 00459 bool operator==(const PoolQuery& b) const; 00460 bool operator!=(const PoolQuery& b) const { return !(*this == b ); } 00461 00462 // low level API 00463 00470 Match flags() const; 00471 00478 void setFlags( const Match & flags ); 00479 00480 public: 00481 class Impl; 00482 private: 00484 RW_pointer<Impl> _pimpl; 00485 }; 00487 00489 std::ostream & operator<<( std::ostream & str, const PoolQuery & obj ); 00490 00492 std::ostream & dumpOn( std::ostream & str, const PoolQuery & obj ); 00493 00495 namespace detail 00496 { 00497 00498 class PoolQueryMatcher; 00499 00501 // 00502 // CLASS NAME : PoolQuery::PoolQueryIterator 00503 // 00511 class PoolQueryIterator : public boost::iterator_adaptor< 00512 PoolQueryIterator // Derived 00513 , sat::LookupAttr::iterator // Base 00514 , const sat::Solvable // Value 00515 , boost::forward_traversal_tag // CategoryOrTraversal 00516 , const sat::Solvable // Reference 00517 > 00518 { 00519 typedef std::vector<sat::LookupAttr::iterator> Matches; 00520 public: 00521 typedef Matches::size_type size_type; 00522 typedef Matches::const_iterator matches_iterator; 00523 public: 00525 PoolQueryIterator() 00526 {} 00527 00529 PoolQueryIterator( const shared_ptr<PoolQueryMatcher> & matcher_r ) 00530 : _matcher( matcher_r ) 00531 { increment(); } 00532 00579 bool matchesEmpty() const { return ! _matcher; } 00581 size_type matchesSize() const { return matches().size(); } 00583 matches_iterator matchesBegin() const { return matches().begin(); } 00585 matches_iterator matchesEnd() const { return matches().end(); } 00587 00588 private: 00589 friend class boost::iterator_core_access; 00590 00591 sat::Solvable dereference() const 00592 { return base_reference().inSolvable(); } 00593 00594 void increment(); 00595 00596 private: 00597 const Matches & matches() const; 00598 00599 private: 00600 shared_ptr<PoolQueryMatcher> _matcher; 00601 mutable shared_ptr<Matches> _matches; 00602 }; 00604 00606 inline std::ostream & operator<<( std::ostream & str, const PoolQueryIterator & obj ) 00607 { return str << obj.base(); } 00608 00610 std::ostream & dumpOn( std::ostream & str, const PoolQueryIterator & obj ); 00611 00613 } //namespace detail 00615 00616 inline detail::PoolQueryIterator PoolQuery::end() const 00617 { return detail::PoolQueryIterator(); } 00618 00620 } // namespace zypp 00622 00623 #endif // ZYPP_POOLQUERY_H