3 #include "zypp/base/PtrTypes.h"
4 #include "zypp/base/Logger.h"
5 #include "zypp/cache/CacheTypes.h"
6 #include "zypp/cache/ResolvableQuery.h"
7 #include "zypp/Package.h"
8 #include "zypp/cache/sqlite3x/sqlite3x.hpp"
10 using namespace sqlite3x;
14 typedef shared_ptr<sqlite3_command> sqlite3_command_ptr;
16 namespace zypp { namespace cache {
18 struct ResolvableQuery::Impl
22 CacheTypes _type_cache;
23 sqlite3_connection _con;
24 sqlite3_command_ptr _cmd_attr_str;
25 sqlite3_command_ptr _cmd_attr_tstr;
26 sqlite3_command_ptr _cmd_attr_num;
27 sqlite3_command_ptr _cmd_disk_usage;
29 Impl( const Pathname &dbdir)
33 _con.open((dbdir + "zypp.db").asString().c_str());
34 _con.executenonquery("PRAGMA cache_size=8000;");
36 _cmd_attr_tstr.reset( new sqlite3_command( _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;") );
39 _cmd_attr_str.reset( new sqlite3_command( _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;"));
41 _cmd_attr_num.reset( new sqlite3_command( _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;"));
43 _cmd_disk_usage.reset( new sqlite3_command( _con, "select d.name,du.size,du.files from resolvable_disk_usage du,dir_names d where du.resolvable_id=:rid and du.dir_name_id=d.id;"));
45 MIL << "Creating Resolvable query impl" << endl;
46 _fields = "id, name, version, release, epoch, arch, kind, installed_size, archive_size, install_only, build_time, install_time, repository_id";
51 MIL << "Destroying Resolvable query impl" << endl;
54 data::ResObject_Ptr fromRow( sqlite3_reader &reader )
56 data::ResObject_Ptr ptr (new data::ResObject);
58 ptr->name = reader.getstring(1);
59 ptr->edition = Edition( reader.getstring(2), reader.getstring(3), reader.getint(4));
60 ptr->arch = _type_cache.archFor(reader.getint(5));
62 // TODO get the rest of the data
68 void query( const data::RecordId &id,
69 ProcessResolvable fnc )
71 sqlite3_command cmd( _con, "select " + _fields + " from resolvables where id=:id;");
73 sqlite3_reader reader = cmd.executereader();
76 fnc( id, fromRow(reader) );
81 void query( const std::string &s,
82 ProcessResolvable fnc )
85 sqlite3_command cmd( _con, "select " + _fields + " from resolvables where name like :name;");
86 cmd.bind(":name", string("%") + s + "%");
87 sqlite3_reader reader = cmd.executereader();
90 fnc( reader.getint64(0), fromRow(reader) );
94 void queryByName( const std::string &name, int wild, ProcessResolvable fnc )
96 std::string sqlcmd = "select " + _fields + " from resolvables where name ";
97 std::string s( name );
106 sqlite3_command cmd( _con, sqlcmd + " :name;");
111 cmd.bind( ":name", s );
112 sqlite3_reader reader = cmd.executereader();
115 fnc( reader.getint64(0), fromRow(reader) );
120 std::string queryStringAttribute( const data::RecordId &record_id,
121 const std::string &klass,
122 const std::string &name,
123 const std::string &default_value )
126 return queryStringAttributeTranslationInternal( _con, record_id, Locale(), klass, name, default_value);
130 std::string queryStringAttributeTranslation( const data::RecordId &record_id,
131 const Locale &locale,
132 const std::string &klass,
133 const std::string &name,
134 const std::string &default_value )
136 return queryStringAttributeTranslationInternal( _con, record_id, locale, klass, name, default_value );
140 TranslatedText queryTranslatedStringAttribute( const data::RecordId &record_id,
141 const std::string &klass,
142 const std::string &name,
143 const TranslatedText &default_value )
145 return queryTranslatedStringAttributeInternal( _con, record_id, klass, name, default_value );
149 bool queryBooleanAttribute( const data::RecordId &record_id,
150 const std::string &klass,
151 const std::string &name,
154 return ( queryNumericAttributeInternal( _con, record_id, klass, name, default_value) > 0 );
157 int queryNumericAttribute( const data::RecordId &record_id,
158 const std::string &klass,
159 const std::string &name,
162 return queryNumericAttributeInternal( _con, record_id, klass, name, default_value);
165 void queryDiskUsage( const data::RecordId &record_id, DiskUsage &du )
167 _cmd_disk_usage->bind(":rid", record_id);
168 sqlite3_reader reader = _cmd_disk_usage->executereader();
170 while ( reader.read() )
172 DiskUsage::Entry entry(reader.getstring(0),
179 std::string queryRepositoryAlias( const data::RecordId &repo_id )
182 sqlite3_command cmd( _con, "select alias from repositories where id=:id;" );
183 cmd.bind( ":id", repo_id );
184 sqlite3_reader reader = cmd.executereader();
185 while( reader.read() )
187 alias = reader.getstring( 0 );
195 int queryNumericAttributeInternal( sqlite3_connection &con,
196 const data::RecordId &record_id,
197 const std::string &klass,
198 const std::string &name,
201 //con.executenonquery("BEGIN;");
202 _cmd_attr_num->bind(":rid", record_id);
204 _cmd_attr_num->bind(":tclass", klass);
205 _cmd_attr_num->bind(":tname", name);
207 sqlite3_reader reader = _cmd_attr_num->executereader();
209 return reader.getint(0);
211 return default_value;
214 TranslatedText queryTranslatedStringAttributeInternal( sqlite3_connection &con,
215 const data::RecordId &record_id,
216 const std::string &klass,
217 const std::string &name,
218 const TranslatedText &default_value )
220 //con.executenonquery("PRAGMA cache_size=8000;");
221 //con.executenonquery("BEGIN;");
223 _cmd_attr_tstr->bind(":rid", record_id);
224 _cmd_attr_tstr->bind(":lclass", "lang");
226 _cmd_attr_tstr->bind(":tclass", klass);
227 _cmd_attr_tstr->bind(":tname", name);
229 TranslatedText result;
230 sqlite3_reader reader = _cmd_attr_tstr->executereader();
235 result.setText( reader.getstring(0), Locale( reader.getstring(1) ) );
242 return default_value;
245 std::string queryStringAttributeInternal( sqlite3_connection &con,
246 const data::RecordId &record_id,
247 const std::string &klass,
248 const std::string &name,
249 const std::string &default_value )
251 return queryStringAttributeTranslationInternal( con, record_id, Locale(), klass, name, default_value );
254 std::string queryStringAttributeTranslationInternal( sqlite3_connection &con,
255 const data::RecordId &record_id,
256 const Locale &locale,
257 const std::string &klass,
258 const std::string &name,
259 const std::string &default_value )
261 //con.executenonquery("BEGIN;");
262 _cmd_attr_str->bind(":rid", record_id);
263 _cmd_attr_str->bind(":lclass", "lang");
264 if (locale == Locale() )
265 _cmd_attr_str->bind(":lname", "none");
267 _cmd_attr_str->bind(":lname", locale.code());
269 _cmd_attr_str->bind(":tclass", klass);
270 _cmd_attr_str->bind(":tname", name);
272 sqlite3_reader reader = _cmd_attr_str->executereader();
275 return reader.getstring(0);
277 return default_value;
281 //////////////////////////////////////////////////////////////////////////////
282 // FORWARD TO IMPLEMENTATION
283 //////////////////////////////////////////////////////////////////////////////
285 ResolvableQuery::ResolvableQuery( const Pathname &dbdir)
286 : _pimpl(new Impl(dbdir))
288 //MIL << "Creating Resolvable query" << endl;
291 ResolvableQuery::~ResolvableQuery()
293 //MIL << "Destroying Resolvable query" << endl;
296 //////////////////////////////////////////////////////////////////////////////
298 void ResolvableQuery::query( const data::RecordId &id, ProcessResolvable fnc )
300 _pimpl->query(id, fnc);
303 //////////////////////////////////////////////////////////////////////////////
305 void ResolvableQuery::query( const std::string &s, ProcessResolvable fnc )
307 _pimpl->query(s, fnc);
310 //////////////////////////////////////////////////////////////////////////////
312 int ResolvableQuery::queryNumericAttribute( const data::RecordId &record_id,
313 const std::string &klass,
314 const std::string &name,
317 return _pimpl->queryNumericAttribute(record_id, klass, name, default_value);
320 bool ResolvableQuery::queryBooleanAttribute( const data::RecordId &record_id,
321 const std::string &klass,
322 const std::string &name,
325 return _pimpl->queryNumericAttribute(record_id, klass, name, default_value);
329 std::string ResolvableQuery::queryStringAttribute( const data::RecordId &record_id,
330 const std::string &klass,
331 const std::string &name,
332 const std::string &default_value )
334 return _pimpl->queryStringAttribute(record_id, klass, name, default_value);
337 //////////////////////////////////////////////////////////////////////////////
339 std::string ResolvableQuery::queryStringAttributeTranslation( const data::RecordId &record_id,
340 const Locale &locale,
341 const std::string &klass,
342 const std::string &name,
343 const std::string &default_value )
345 return _pimpl->queryStringAttributeTranslation(record_id, locale, klass, name, default_value );
348 //////////////////////////////////////////////////////////////////////////////
350 TranslatedText ResolvableQuery::queryTranslatedStringAttribute( const data::RecordId &record_id,
351 const std::string &klass,
352 const std::string &name,
353 const TranslatedText &default_value )
355 return _pimpl->queryTranslatedStringAttribute(record_id, klass, name, default_value );
358 void ResolvableQuery::queryDiskUsage( const data::RecordId &record_id, DiskUsage &du )
360 _pimpl->queryDiskUsage(record_id, du);
363 std::string ResolvableQuery::queryRepositoryAlias( const data::RecordId &repo_id )
365 return _pimpl->queryRepositoryAlias( repo_id );
368 void ResolvableQuery::queryByName( const std::string &name, int wild, ProcessResolvable fnc )
370 _pimpl->queryByName( name, wild, fnc );
373 //////////////////////////////////////////////////////////////////////////////
375 } } // namespace zypp::cache