Imported Upstream version 15.21.0
[platform/upstream/libzypp.git] / zypp / PoolQueryUtil.tcc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/PoolQueryUtil.tcc
10  *
11  * including fstream is not hell here because this header only included
12  * by implementation file, header doesn't need include it.
13 */
14 #ifndef ZYPP_POOLQUERYUTIL_TCC
15 #define ZYPP_POOLQUERYUTIL_TCC
16
17 #include <fstream>
18
19 #include "zypp/Pathname.h"
20 #include "zypp/PoolQuery.h"
21 #include "zypp/base/String.h"
22
23 namespace zypp
24 {
25
26   /**
27    * sends to output iterator all queries readed from file.
28    *
29    * \code
30    *  list<PoolQuery> s;
31    *  insert_iterator<list<PoolQuery> > ii(s, s.end());
32    *  readPoolQueriesFromStream(f,ii);
33    * \endcode
34    */
35   template <class OutputIterator>
36   void readPoolQueriesFromFile(const zypp::filesystem::Pathname &file,
37       OutputIterator out )
38   {
39     bool found;
40     std::ifstream fin( file.c_str() );
41
42     if (!fin)
43       ZYPP_THROW(Exception(str::form("Cannot open file %s",file.c_str())));
44
45     do
46     {
47       zypp::PoolQuery q;
48       found = q.recover( fin );
49       if (found)
50         *out++ = q;
51     } while ( found );
52
53     fin.close();
54   }
55
56   /**
57    * Writes all queries from begin to end.
58    */
59
60   template <class InputIterator>
61   void writePoolQueriesToFile(const zypp::filesystem::Pathname &file,
62       InputIterator begin, InputIterator end )
63   {
64     std::ofstream fout( file.c_str(), std::ios_base::out | std::ios_base::trunc );
65
66     if (!fout)
67       ZYPP_THROW(Exception(str::form("Cannot open file %s",file.c_str())));
68
69     for_( it, begin, end )
70     {
71       it->serialize( fout );
72     }
73
74     fout.close();
75   }
76
77 }
78 #endif // ZYPP_POOLQUERYUTIL_H