2 #include "zypp/cache/CacheTypes.h"
3 #include "zypp/cache/ResolvableQuery.h"
4 #include "zypp/Package.h"
5 #include "zypp/cache/sqlite3x/sqlite3x.hpp"
7 using namespace sqlite3x;
10 namespace zypp { namespace cache {
13 struct ResolvableQuery::Impl
17 CacheTypes _type_cache;
19 Impl( const Pathname &dbdir)
23 _fields = "id, name, version, release, epoch, arch, kind, installed_size, archive_size, install_only, build_time, install_time, repository_id";
30 data::ResObject_Ptr fromRow( sqlite3_reader &reader )
32 data::ResObject_Ptr ptr (new data::ResObject);
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));
38 // TODO get the rest of the data
44 void query( const data::RecordId &id,
45 ProcessResolvable fnc )
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;");
52 sqlite3_reader reader = cmd.executereader();
55 fnc( id, fromRow(reader) );
57 con.executenonquery("COMMIT;");
61 void query( const std::string &s,
62 ProcessResolvable fnc )
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%';");
70 sqlite3_reader reader = cmd.executereader();
73 fnc( reader.getint64(0), fromRow(reader) );
75 con.executenonquery("COMMIT;");
79 std::string queryStringAttribute( const data::RecordId &record_id,
80 const std::string &klass,
81 const std::string &name )
83 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
84 return queryStringAttributeTranslationInternal( con, record_id, Locale(), klass, name);
88 std::string queryStringAttributeTranslation( const data::RecordId &record_id,
90 const std::string &klass,
91 const std::string &name )
93 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
94 return queryStringAttributeTranslationInternal( con, record_id, locale, klass, name );
98 TranslatedText queryTranslatedStringAttribute( const data::RecordId &record_id,
99 const std::string &klass,
100 const std::string &name )
102 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
103 return queryTranslatedStringAttributeInternal( con, record_id, klass, name );
107 bool queryBooleanAttribute( const data::RecordId &record_id,
108 const std::string &klass,
109 const std::string &name )
111 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
112 return ( queryNumericAttributeInternal( con, record_id, klass, name) != 0 );
115 template <class _Container> _Container
116 queryStringContainerAttribute( const data::RecordId &record_id,
117 const std::string &klass,
118 const std::string &name )
120 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
121 string all = queryStringAttributeInternal( con, record_id, klass, name);
125 //str::split( all, std::inserter(words) );
130 int queryNumericAttribute( const data::RecordId &record_id,
131 const std::string &klass,
132 const std::string &name )
134 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
135 return queryNumericAttributeInternal( con, record_id, klass, name);
140 int queryNumericAttributeInternal( sqlite3_connection &con,
141 const data::RecordId &record_id,
142 const std::string &klass,
143 const std::string &name )
145 con.executenonquery("BEGIN;");
146 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;");
148 cmd.bind(":rid", record_id);
150 cmd.bind(":tclass", klass);
151 cmd.bind(":tname", name);
153 return cmd.executeint();
156 TranslatedText queryTranslatedStringAttributeInternal( sqlite3_connection &con,
157 const data::RecordId &record_id,
158 const std::string &klass,
159 const std::string &name )
161 //con.executenonquery("PRAGMA cache_size=8000;");
162 con.executenonquery("BEGIN;");
163 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;");
165 cmd.bind(":rid", record_id);
166 cmd.bind(":lclass", "lang");
168 cmd.bind(":tclass", klass);
169 cmd.bind(":tname", name);
171 TranslatedText result;
172 sqlite3_reader reader = cmd.executereader();
175 result.setText( reader.getstring(0), Locale( reader.getstring(1) ) );
180 std::string queryStringAttributeInternal( sqlite3_connection &con,
181 const data::RecordId &record_id,
182 const std::string &klass,
183 const std::string &name )
185 return queryStringAttributeTranslationInternal( con, record_id, Locale(), klass, name);
188 std::string queryStringAttributeTranslationInternal( sqlite3_connection &con,
189 const data::RecordId &record_id,
190 const Locale &locale,
191 const std::string &klass,
192 const std::string &name )
194 //con.executenonquery("PRAGMA cache_size=8000;");
195 con.executenonquery("BEGIN;");
196 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;");
198 cmd.bind(":rid", record_id);
199 cmd.bind(":lclass", "lang");
200 if (locale == Locale() )
201 cmd.bind(":lname", "none");
203 cmd.bind(":lname", locale.code());
205 cmd.bind(":tclass", klass);
206 cmd.bind(":tname", name);
208 return cmd.executestring();
213 list<string> ResolvableQuery::Impl::queryStringContainerAttribute( const data::RecordId &record_id,
214 const std::string &klass,
215 const std::string &name );
218 set<string> ResolvableQuery::Impl::queryStringContainerAttribute( const data::RecordId &record_id,
219 const std::string &klass,
220 const std::string &name );
222 //////////////////////////////////////////////////////////////////////////////
223 // FORWARD TO IMPLEMENTATION
224 //////////////////////////////////////////////////////////////////////////////
226 ResolvableQuery::ResolvableQuery( const Pathname &dbdir)
227 : _pimpl(new Impl(dbdir))
231 //////////////////////////////////////////////////////////////////////////////
233 void ResolvableQuery::query( const data::RecordId &id, ProcessResolvable fnc )
235 _pimpl->query(id, fnc);
238 //////////////////////////////////////////////////////////////////////////////
240 void ResolvableQuery::query( const std::string &s, ProcessResolvable fnc )
242 _pimpl->query(s, fnc);
245 //////////////////////////////////////////////////////////////////////////////
247 int ResolvableQuery::queryNumericAttribute( const data::RecordId &record_id,
248 const std::string &klass,
249 const std::string &name )
251 return _pimpl->queryNumericAttribute(record_id, klass, name);
254 bool ResolvableQuery::queryBooleanAttribute( const data::RecordId &record_id,
255 const std::string &klass,
256 const std::string &name )
258 return _pimpl->queryNumericAttribute(record_id, klass, name);
262 std::string ResolvableQuery::queryStringAttribute( const data::RecordId &record_id,
263 const std::string &klass,
264 const std::string &name )
266 return _pimpl->queryStringAttribute(record_id, klass, name);
269 //////////////////////////////////////////////////////////////////////////////
271 std::string ResolvableQuery::queryStringAttributeTranslation( const data::RecordId &record_id,
272 const Locale &locale,
273 const std::string &klass,
274 const std::string &name )
276 return _pimpl->queryStringAttributeTranslation(record_id, locale, klass, name);
279 //////////////////////////////////////////////////////////////////////////////
281 TranslatedText ResolvableQuery::queryTranslatedStringAttribute( const data::RecordId &record_id,
282 const std::string &klass,
283 const std::string &name )
285 return _pimpl->queryTranslatedStringAttribute(record_id, klass, name);
288 template<class _Container>
289 _Container ResolvableQuery::queryStringContainerAttribute( const data::RecordId &record_id,
290 const std::string &klass,
291 const std::string &name )
293 return _pimpl->queryStringContainerAttribute<_Container>(record_id, klass, name);
297 std::set<std::string> ResolvableQuery::queryStringContainerAttribute( const data::RecordId &record_id,
298 const std::string &klass,
299 const std::string &name );
302 std::list<std::string> ResolvableQuery::queryStringContainerAttribute( const data::RecordId &record_id,
303 const std::string &klass,
304 const std::string &name );
307 Package::Keywords ResolvableQuery::queryStringContainerAttribute( const data::RecordId &record_id,
308 const std::string &klass,
309 const std::string &name );
311 //////////////////////////////////////////////////////////////////////////////
313 } } // namespace zypp::cache