zypper port starts. zypp2 to zypp
[platform/upstream/libzypp.git] / zypp / cache / ResolvableQuery.cc
1
2 #include "zypp/cache/CacheTypes.h"
3 #include "zypp/cache/ResolvableQuery.h"
4 #include "zypp/cache/sqlite3x/sqlite3x.hpp"
5
6 using namespace sqlite3x;
7 using namespace std;
8
9 namespace zypp { namespace cache {
10
11
12 struct ResolvableQuery::Impl
13 {
14   Pathname _dbdir;
15   string _fields;
16   CacheTypes _type_cache;
17   
18   Impl( const Pathname &dbdir)
19   : _dbdir(dbdir)
20     , _type_cache(dbdir)
21   {
22     _fields = "id, name, version, release, epoch, arch, kind, installed_size, archive_size, install_only, build_time, install_time, repository_id";
23   }
24
25   ~Impl()
26   {
27   }
28
29
30   data::ResObject_Ptr fromRow( sqlite3_reader &reader )
31   {
32     data::ResObject_Ptr ptr (new data::ResObject);
33
34     ptr->name = reader.getstring(1);
35     ptr->edition = Edition( reader.getstring(2), reader.getstring(3), reader.getint(4));
36     ptr->arch = _type_cache.archFor(reader.getint(5));
37
38     // TODO get the rest of the data
39
40     return ptr;
41   }
42
43   
44   void query( const data::RecordId &id,
45                   ProcessResolvable fnc )
46   {
47     sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
48     //con.executenonquery("PRAGMA cache_size=8000;");
49     con.executenonquery("BEGIN;");
50     sqlite3_command cmd( con, "select " + _fields + " from resolvables where id=:id;");
51     cmd.bind(":id", id);
52     sqlite3_reader reader = cmd.executereader();
53     while(reader.read())
54     {
55       fnc( id, fromRow(reader) );
56     }
57     con.executenonquery("COMMIT;");
58   }
59
60
61   void query( const std::string &s,
62               ProcessResolvable fnc  )
63   {  
64     
65     sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
66     //con.executenonquery("PRAGMA cache_size=8000;");
67     con.executenonquery("BEGIN;");
68     sqlite3_command cmd( con, "select " + _fields + " from resolvables where name like '%:name%';");
69     cmd.bind(":name", s);
70     sqlite3_reader reader = cmd.executereader();
71     while(reader.read())
72     {
73       fnc( reader.getint64(0), fromRow(reader) );
74     }
75     con.executenonquery("COMMIT;");
76   }
77
78
79   std::string queryStringAttribute( const data::RecordId &record_id,
80                                     const std::string &klass,
81                                     const std::string &name )
82   {
83     sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
84     return queryStringAttributeTranslationInternal( con, record_id, Locale(), klass, name);
85   }
86
87
88   std::string queryStringAttributeTranslation( const data::RecordId &record_id,
89                                                const Locale &locale,
90                                                const std::string &klass,
91                                                const std::string &name )
92   {
93     sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
94     return queryStringAttributeTranslationInternal( con, record_id, locale, klass, name );
95   }
96
97
98   TranslatedText queryTranslatedStringAttribute( const data::RecordId &record_id,
99                                                  const std::string &klass,
100                                                  const std::string &name )
101   {
102     sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
103     return queryTranslatedStringAttributeInternal( con, record_id, klass, name );
104   }
105
106
107   int queryNumericAttribute( const data::RecordId &record_id,
108                                  const std::string &klass,
109                                  const std::string &name )
110   {
111     sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
112     return queryNumericAttributeInternal( con, record_id, klass, name);
113   }
114
115 private:
116
117   int queryNumericAttributeInternal( sqlite3_connection &con,
118                                      const data::RecordId &record_id,
119                                      const std::string &klass,
120                                      const std::string &name )
121   {
122     con.executenonquery("BEGIN;");
123     sqlite3_command cmd( con, "select a.value from numeric_attributes a,types t where a.weak_resolvable_id=:rid and a.attr_id=t.id and t.class=:tclass and t.name=:tname;");
124
125     cmd.bind(":rid", record_id);
126
127     cmd.bind(":tclass", klass);
128     cmd.bind(":tname", name);
129
130     return cmd.executeint();
131   }
132
133   TranslatedText queryTranslatedStringAttributeInternal( sqlite3_connection &con,
134                                                          const data::RecordId &record_id,
135                                                          const std::string &klass,
136                                                          const std::string &name )
137   {
138     //con.executenonquery("PRAGMA cache_size=8000;");
139     con.executenonquery("BEGIN;");
140     sqlite3_command cmd( con, "select a.text, l.name from text_attributes a,types l,types t where a.weak_resolvable_id=:rid and a.lang_id=l.id and a.attr_id=t.id and l.class=:lclass and t.class=:tclass and t.name=:tname;");
141
142     cmd.bind(":rid", record_id);
143     cmd.bind(":lclass", "lang");
144
145     cmd.bind(":tclass", klass);
146     cmd.bind(":tname", name);
147
148     TranslatedText result;
149     sqlite3_reader reader = cmd.executereader();
150     while(reader.read())
151     {
152       result.setText( reader.getstring(0), Locale( reader.getstring(1) ) );
153     }
154     return result;
155   }
156
157   std::string queryStringAttributeInternal( sqlite3_connection &con,
158                                             const data::RecordId &record_id,
159                                             const std::string &klass,
160                                             const std::string &name )
161   {
162     return queryStringAttributeTranslationInternal( con, record_id, Locale(), klass, name);
163   }
164
165   std::string queryStringAttributeTranslationInternal( sqlite3_connection &con,
166                                                        const data::RecordId &record_id,
167                                                        const Locale &locale,
168                                                        const std::string &klass,
169                                                        const std::string &name )
170   {
171     //con.executenonquery("PRAGMA cache_size=8000;");
172     con.executenonquery("BEGIN;");
173     sqlite3_command cmd( con, "select a.text from text_attributes a,types l,types t where a.weak_resolvable_id=:rid and a.lang_id=l.id and a.attr_id=t.id and l.class=:lclass and l.name=:lname and t.class=:tclass and t.name=:tname;");
174
175     cmd.bind(":rid", record_id);
176     cmd.bind(":lclass", "lang");
177     if (locale == Locale() )
178       cmd.bind(":lname", "none");
179     else
180       cmd.bind(":lname", locale.code());
181
182     cmd.bind(":tclass", klass);
183     cmd.bind(":tname", name);
184
185     return cmd.executestring();
186   }
187 };
188
189 //////////////////////////////////////////////////////////////////////////////
190 // FORWARD TO IMPLEMENTATION
191 //////////////////////////////////////////////////////////////////////////////
192
193 ResolvableQuery::ResolvableQuery( const Pathname &dbdir)
194   : _pimpl(new Impl(dbdir))
195 {
196 }
197
198 //////////////////////////////////////////////////////////////////////////////
199
200 void ResolvableQuery::query( const data::RecordId &id, ProcessResolvable fnc  )
201 {
202   _pimpl->query(id, fnc);
203 }
204
205 //////////////////////////////////////////////////////////////////////////////
206
207 void ResolvableQuery::query( const std::string &s, ProcessResolvable fnc  )
208 {
209   _pimpl->query(s, fnc);
210 }
211
212 //////////////////////////////////////////////////////////////////////////////
213
214 int ResolvableQuery::queryNumericAttribute( const data::RecordId &record_id,
215                                             const std::string &klass,
216                                             const std::string &name )
217 {
218   return _pimpl->queryNumericAttribute(record_id, klass, name);
219 }
220
221 bool ResolvableQuery::queryBooleanAttribute( const data::RecordId &record_id,
222                                              const std::string &klass,
223                                              const std::string &name )
224 {
225   return _pimpl->queryNumericAttribute(record_id, klass, name);
226 }
227
228
229 std::string ResolvableQuery::queryStringAttribute( const data::RecordId &record_id,
230                                                    const std::string &klass,
231                                                    const std::string &name )
232 {
233   return _pimpl->queryStringAttribute(record_id, klass, name);
234 }
235
236 //////////////////////////////////////////////////////////////////////////////
237
238 std::string ResolvableQuery::queryStringAttributeTranslation( const data::RecordId &record_id,
239                                                               const Locale &locale,
240                                                               const std::string &klass,
241                                                               const std::string &name )
242 {
243   return _pimpl->queryStringAttributeTranslation(record_id, locale, klass, name);
244 }
245
246 //////////////////////////////////////////////////////////////////////////////
247
248 TranslatedText ResolvableQuery::queryTranslatedStringAttribute( const data::RecordId &record_id,
249                                                                 const std::string &klass,
250                                                                 const std::string &name )
251 {
252   return _pimpl->queryTranslatedStringAttribute(record_id, klass, name);
253 }
254
255 //////////////////////////////////////////////////////////////////////////////
256
257 } } // namespace zypp::cache