4 #include "zypp/cache/CacheTypes.h"
5 #include "zypp/cache/ResolvableQuery.h"
6 #include "zypp/Package.h"
7 #include "zypp/cache/sqlite3x/sqlite3x.hpp"
9 using namespace sqlite3x;
12 namespace zypp { namespace cache {
15 struct ResolvableQuery::Impl
19 CacheTypes _type_cache;
21 Impl( const Pathname &dbdir)
25 _fields = "id, name, version, release, epoch, arch, kind, installed_size, archive_size, install_only, build_time, install_time, repository_id";
32 data::ResObject_Ptr fromRow( sqlite3_reader &reader )
34 data::ResObject_Ptr ptr (new data::ResObject);
36 ptr->name = reader.getstring(1);
37 ptr->edition = Edition( reader.getstring(2), reader.getstring(3), reader.getint(4));
38 ptr->arch = _type_cache.archFor(reader.getint(5));
40 // TODO get the rest of the data
46 void query( const data::RecordId &id,
47 ProcessResolvable fnc )
49 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
50 //con.executenonquery("PRAGMA cache_size=8000;");
51 con.executenonquery("BEGIN;");
52 sqlite3_command cmd( con, "select " + _fields + " from resolvables where id=:id;");
54 sqlite3_reader reader = cmd.executereader();
57 fnc( id, fromRow(reader) );
59 con.executenonquery("COMMIT;");
63 void query( const std::string &s,
64 ProcessResolvable fnc )
67 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
68 //con.executenonquery("PRAGMA cache_size=8000;");
69 con.executenonquery("BEGIN;");
70 sqlite3_command cmd( con, "select " + _fields + " from resolvables where name like '%:name%';");
72 sqlite3_reader reader = cmd.executereader();
75 fnc( reader.getint64(0), fromRow(reader) );
77 con.executenonquery("COMMIT;");
81 std::string queryStringAttribute( const data::RecordId &record_id,
82 const std::string &klass,
83 const std::string &name )
85 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
86 return queryStringAttributeTranslationInternal( con, record_id, Locale(), klass, name);
90 std::string queryStringAttributeTranslation( const data::RecordId &record_id,
92 const std::string &klass,
93 const std::string &name )
95 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
96 return queryStringAttributeTranslationInternal( con, record_id, locale, klass, name );
100 TranslatedText queryTranslatedStringAttribute( const data::RecordId &record_id,
101 const std::string &klass,
102 const std::string &name )
104 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
105 return queryTranslatedStringAttributeInternal( con, record_id, klass, name );
109 bool queryBooleanAttribute( const data::RecordId &record_id,
110 const std::string &klass,
111 const std::string &name )
113 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
114 return ( queryNumericAttributeInternal( con, record_id, klass, name) != 0 );
117 template <class _Container> _Container
118 queryStringContainerAttribute( const data::RecordId &record_id,
119 const std::string &klass,
120 const std::string &name )
122 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
123 string all = queryStringAttributeInternal( con, record_id, klass, name);
127 str::split( all, std::inserter(words, words.begin()) );
132 int queryNumericAttribute( const data::RecordId &record_id,
133 const std::string &klass,
134 const std::string &name )
136 sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
137 return queryNumericAttributeInternal( con, record_id, klass, name);
142 int queryNumericAttributeInternal( sqlite3_connection &con,
143 const data::RecordId &record_id,
144 const std::string &klass,
145 const std::string &name )
147 con.executenonquery("BEGIN;");
148 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;");
150 cmd.bind(":rid", record_id);
152 cmd.bind(":tclass", klass);
153 cmd.bind(":tname", name);
155 return cmd.executeint();
158 TranslatedText queryTranslatedStringAttributeInternal( sqlite3_connection &con,
159 const data::RecordId &record_id,
160 const std::string &klass,
161 const std::string &name )
163 //con.executenonquery("PRAGMA cache_size=8000;");
164 con.executenonquery("BEGIN;");
165 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;");
167 cmd.bind(":rid", record_id);
168 cmd.bind(":lclass", "lang");
170 cmd.bind(":tclass", klass);
171 cmd.bind(":tname", name);
173 TranslatedText result;
174 sqlite3_reader reader = cmd.executereader();
177 result.setText( reader.getstring(0), Locale( reader.getstring(1) ) );
182 std::string queryStringAttributeInternal( sqlite3_connection &con,
183 const data::RecordId &record_id,
184 const std::string &klass,
185 const std::string &name )
187 return queryStringAttributeTranslationInternal( con, record_id, Locale(), klass, name);
190 std::string queryStringAttributeTranslationInternal( sqlite3_connection &con,
191 const data::RecordId &record_id,
192 const Locale &locale,
193 const std::string &klass,
194 const std::string &name )
196 //con.executenonquery("PRAGMA cache_size=8000;");
197 con.executenonquery("BEGIN;");
198 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;");
200 cmd.bind(":rid", record_id);
201 cmd.bind(":lclass", "lang");
202 if (locale == Locale() )
203 cmd.bind(":lname", "none");
205 cmd.bind(":lname", locale.code());
207 cmd.bind(":tclass", klass);
208 cmd.bind(":tname", name);
210 return cmd.executestring();
214 //////////////////////////////////////////////////////////////////////////////
215 // FORWARD TO IMPLEMENTATION
216 //////////////////////////////////////////////////////////////////////////////
218 ResolvableQuery::ResolvableQuery( const Pathname &dbdir)
219 : _pimpl(new Impl(dbdir))
223 //////////////////////////////////////////////////////////////////////////////
225 void ResolvableQuery::query( const data::RecordId &id, ProcessResolvable fnc )
227 _pimpl->query(id, fnc);
230 //////////////////////////////////////////////////////////////////////////////
232 void ResolvableQuery::query( const std::string &s, ProcessResolvable fnc )
234 _pimpl->query(s, fnc);
237 //////////////////////////////////////////////////////////////////////////////
239 int ResolvableQuery::queryNumericAttribute( const data::RecordId &record_id,
240 const std::string &klass,
241 const std::string &name )
243 return _pimpl->queryNumericAttribute(record_id, klass, name);
246 bool ResolvableQuery::queryBooleanAttribute( const data::RecordId &record_id,
247 const std::string &klass,
248 const std::string &name )
250 return _pimpl->queryNumericAttribute(record_id, klass, name);
254 std::string ResolvableQuery::queryStringAttribute( const data::RecordId &record_id,
255 const std::string &klass,
256 const std::string &name )
258 return _pimpl->queryStringAttribute(record_id, klass, name);
261 //////////////////////////////////////////////////////////////////////////////
263 std::string ResolvableQuery::queryStringAttributeTranslation( const data::RecordId &record_id,
264 const Locale &locale,
265 const std::string &klass,
266 const std::string &name )
268 return _pimpl->queryStringAttributeTranslation(record_id, locale, klass, name);
271 //////////////////////////////////////////////////////////////////////////////
273 TranslatedText ResolvableQuery::queryTranslatedStringAttribute( const data::RecordId &record_id,
274 const std::string &klass,
275 const std::string &name )
277 return _pimpl->queryTranslatedStringAttribute(record_id, klass, name);
280 template<class _Container>
281 _Container ResolvableQuery::queryStringContainerAttribute( const data::RecordId &record_id,
282 const std::string &klass,
283 const std::string &name )
285 return _pimpl->queryStringContainerAttribute<_Container>(record_id, klass, name);
289 std::set<std::string> ResolvableQuery::queryStringContainerAttribute( const data::RecordId &record_id,
290 const std::string &klass,
291 const std::string &name );
294 std::list<std::string> ResolvableQuery::queryStringContainerAttribute( const data::RecordId &record_id,
295 const std::string &klass,
296 const std::string &name );
299 Package::Keywords ResolvableQuery::queryStringContainerAttribute( const data::RecordId &record_id,
300 const std::string &klass,
301 const std::string &name );
303 //////////////////////////////////////////////////////////////////////////////
305 } } // namespace zypp::cache