Author: dmacvicar
Date: Tue May 15 18:33:47 2007
New Revision: 5554
URL: http://svn.opensuse.org/viewcvs/zypp?rev=5554&view=rev
Log:
- handle all package data, implement all data::
consumer methods.
this is a huge step forward in the cache design!
TODO: save attributes from other resolvable types.
Modified:
trunk/libzypp/devel/devel.jkupec/YUMParser.cc
trunk/libzypp/tests/cache/CacheQuery_test.cc
trunk/libzypp/zypp/data/ResolvableData.h
trunk/libzypp/zypp/data/ResolvableDataConsumer.h
trunk/libzypp/zypp2/cache/CacheStore.cpp
trunk/libzypp/zypp2/cache/CacheStore.h
trunk/libzypp/zypp2/cache/ResolvableQuery.cc
trunk/libzypp/zypp2/cache/ResolvableQuery.h
trunk/libzypp/zypp2/cache/schema/schema.sql
Modified: trunk/libzypp/devel/devel.jkupec/YUMParser.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/devel/devel.jkupec/YUMParser.cc?rev=5554&r1=5553&r2=5554&view=diff
==============================================================================
--- trunk/libzypp/devel/devel.jkupec/YUMParser.cc (original)
+++ trunk/libzypp/devel/devel.jkupec/YUMParser.cc Tue May 15 18:33:47 2007
@@ -67,10 +67,7 @@
bool YUMParser::primary_CB(const data::Package_Ptr & package_r)
{
- NVRA nvra(package_r->name, package_r->edition, package_r->arch);
- data::RecordId pkgid =
- _consumer.appendResolvable(
- _catalog_id, ResTraits<Package>::kind, nvra, package_r->deps);
+ _consumer.consumePackage( _catalog_id, package_r );
/* MIL << "got package "
<< package.name << package.edition << " "
@@ -86,7 +83,7 @@
bool YUMParser::patches_CB(const OnMediaLocation &loc, const string & patch_id)
{
DBG << "Adding patch " << loc.filename() << " to YUMParser jobs " << endl;
-
+
_jobs.push_back(YUMParserJob(loc.filename(), YUMResourceType::PATCH));
return true;
@@ -95,11 +92,8 @@
bool YUMParser::patch_CB(const zypp::data::Patch & patch)
{
- NVRA nvra(patch.name, patch.edition, patch.arch);
- data::RecordId pkgid =
- _consumer.appendResolvable(
- _catalog_id, ResTraits<Patch>::kind, nvra, patch.deps);
-
+ _consumer.consumePatch( _catalog_id, patch );
+
MIL << "got patch "
<< patch.name << patch.edition << " "
<< patch.arch
Modified: trunk/libzypp/tests/cache/CacheQuery_test.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/tests/cache/CacheQuery_test.cc?rev=5554&r1=5553&r2=5554&view=diff
==============================================================================
--- trunk/libzypp/tests/cache/CacheQuery_test.cc (original)
+++ trunk/libzypp/tests/cache/CacheQuery_test.cc Tue May 15 18:33:47 2007
@@ -31,6 +31,7 @@
bool result(const data::RecordId &id, data::ResObject_Ptr ptr )
{
MIL << "result: " << id << " | " << ptr->name << " | " << ptr->edition << " | " << ptr->arch << endl;
+ return true;
}
void resolvable_query_test(const string &dir)
@@ -62,8 +63,8 @@
MIL << "packages writen to store" << endl;
}
- ResolvableQuery query(tmpdir.path(), &result);
- query.query("lib");
+ ResolvableQuery query(tmpdir.path() );
+ query.query(10, &result);
}
test_suite*
Modified: trunk/libzypp/zypp/data/ResolvableData.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/data/ResolvableData.h?rev=5554&r1=5553&r2=5554&view=diff
==============================================================================
--- trunk/libzypp/zypp/data/ResolvableData.h (original)
+++ trunk/libzypp/zypp/data/ResolvableData.h Tue May 15 18:33:47 2007
@@ -323,6 +323,9 @@
/** Upstream home page URL.*/
std::string url;
+ /** operating system **/
+ std::string operatingSystem;
+
/** Pre install script. */
std::string prein;
/** Post install script. */
Modified: trunk/libzypp/zypp/data/ResolvableDataConsumer.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/data/ResolvableDataConsumer.h?rev=5554&r1=5553&r2=5554&view=diff
==============================================================================
--- trunk/libzypp/zypp/data/ResolvableDataConsumer.h (original)
+++ trunk/libzypp/zypp/data/ResolvableDataConsumer.h Tue May 15 18:33:47 2007
@@ -11,7 +11,7 @@
#define ZYPP_ResolvableDataConsumer_H
-
+#include "zypp/data/RecordId.h"
#include "zypp/data/ResolvableData.h"
@@ -28,7 +28,7 @@
ResolvableDataConsumer();
virtual ~ResolvableDataConsumer();
- virtual void consumePackage( const data::Package &package) = 0;
+ virtual void consumePackage( const data::RecordId &catalog_id, const data::Package &package) = 0;
virtual void consumePackage( const data::Pattern &package) = 0;
virtual void consumePackage( const data::Patch &package) = 0;
virtual void consumePackage( const data::Script &package) = 0;
Modified: trunk/libzypp/zypp2/cache/CacheStore.cpp
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp2/cache/CacheStore.cpp?rev=5554&r1=5553&r2=5554&view=diff
==============================================================================
--- trunk/libzypp/zypp2/cache/CacheStore.cpp (original)
+++ trunk/libzypp/zypp2/cache/CacheStore.cpp Tue May 15 18:33:47 2007
@@ -73,6 +73,9 @@
sqlite3_command_ptr append_resolvable_cmd;
sqlite3_command_ptr append_text_attribute_cmd;
+ sqlite3_command_ptr append_num_attribute_cmd;
+
+ sqlite3_command_ptr set_shared_flag_cmd;
map name_cache;
map< pair, RecordId> type_cache;
@@ -123,7 +126,10 @@
_pimpl->select_type_cmd.reset( new sqlite3_command( _pimpl->con, "select id from types where class=:class and name=:name;" ));
_pimpl->insert_type_cmd.reset( new sqlite3_command( _pimpl->con, "insert into types (class,name) values (:class,:name);" ));
+ _pimpl->set_shared_flag_cmd.reset( new sqlite3_command( _pimpl->con, "update resolvables set shared_id=:shared_id where id=:resolvable_id;" ));
+
_pimpl->append_text_attribute_cmd.reset( new sqlite3_command( _pimpl->con, "insert into text_attributes ( weak_resolvable_id, lang_id, attr_id, text ) values ( :rid, :lang_id, :attr_id, :text );" ));
+ _pimpl->append_num_attribute_cmd.reset( new sqlite3_command( _pimpl->con, "insert into numeric_attributes ( weak_resolvable_id, attr_id, value ) values ( :rid, :attr_id, :value );" ));
//_pimpl->insert_dependency_entry_cmd.reset( new sqlite3_command( _pimpl->con, "insert into capabilities ( resolvable_id, dependency_type, refers_kind ) values ( :resolvable_id, :dependency_type, :refers_kind );" ));
_pimpl->append_file_dependency_cmd.reset( new sqlite3_command( _pimpl->con, "insert into file_capabilities ( resolvable_id, dependency_type, refers_kind, file_id ) values ( :resolvable_id, :dependency_type, :refers_kind, :file_id );" ));
@@ -152,9 +158,65 @@
MIL << "name cache hits: " << _pimpl->name_cache_hits << " | cache size: " << _pimpl->name_cache.size() << endl;
}
-void CacheStore::consumePackage( const data::Package &package )
+void CacheStore::consumePackage( const RecordId &catalog_id, data::Package_Ptr package )
+{
+ RecordId pkgid = appendResolvable( catalog_id, ResTraits<Package>::kind, NVRA( package->name, package->edition, package->arch ), package->deps );
+ consumeResObject( pkgid, package );
+
+ appendStringAttribute( pkgid, "Package", "checksum", package->repositoryLocation.fileChecksum.checksum() );
+ appendStringAttribute( pkgid, "Package", "buildhost", package->buildhost );
+ appendStringAttribute( pkgid, "Package", "distribution", package->distribution );
+ appendStringAttribute( pkgid, "Package", "license", package->license );
+ appendStringAttribute( pkgid, "Package", "group", package->packager );
+ appendStringAttribute( pkgid, "Package", "url", package->url );
+ appendStringAttribute( pkgid, "Package", "operatingSystem", package->operatingSystem );
+ appendStringAttribute( pkgid, "Package", "prein", package->prein );
+ appendStringAttribute( pkgid, "Package", "postin", package->postin );
+ appendStringAttribute( pkgid, "Package", "preun", package->preun );
+ appendStringAttribute( pkgid, "Package", "postun", package->postun );
+
+ //FIXME save authors and keyword (lists) for packages
+
+ appendStringAttribute( pkgid, "Package", "location", package->repositoryLocation.filePath.asString() );
+}
+
+void CacheStore::consumePatch( const data::RecordId &catalog_id, data::Patch_Ptr patch)
+{
+ RecordId id = appendResolvable( catalog_id, ResTraits<Patch>::kind, NVRA( patch->name, patch->edition, patch->arch ), patch->deps );
+ consumeResObject( id, patch );
+
+}
+
+void CacheStore::consumeMessage( const data::RecordId &catalog_id, data::Message_Ptr message )
+{
+ RecordId id = appendResolvable( catalog_id, ResTraits<Message>::kind, NVRA( message->name, message->edition, message->arch ), message->deps );
+ consumeResObject( id, message );
+}
+
+void CacheStore::consumeScript( const data::RecordId &catalog_id, data::Script_Ptr script )
+{
+ RecordId id = appendResolvable( catalog_id, ResTraits<Script>::kind, NVRA( script->name, script->edition, script->arch ), script->deps );
+ consumeResObject( id, script );
+}
+
+void CacheStore::consumePattern( const data::RecordId &catalog_id, data::Pattern_Ptr pattern )
+{
+ RecordId id = appendResolvable( catalog_id, ResTraits<Pattern>::kind, NVRA( pattern->name, pattern->edition, pattern->arch ), pattern->deps );
+ consumeResObject( id, pattern );
+}
+
+void CacheStore::consumeProduct( const data::RecordId &catalog_id, data::Product_Ptr product )
+{
+ RecordId id = appendResolvable( catalog_id, ResTraits<Product>::kind, NVRA( product->name, product->edition, product->arch ), product->deps );
+ consumeResObject( id, product );
+}
+
+void CacheStore::consumeResObject( const data::RecordId &rid, data::ResObject_Ptr res )
{
- //RecordId pkgid = appendResolvable( ResTraits<Package>::kind, NVRA( package.name, package.edition, package.arch ), package.deps );
+ appendTranslatedStringAttribute( rid, "ResObject", "description", res->description );
+ appendTranslatedStringAttribute( rid, "ResObject", "summary", res->summary );
+ appendNumericAttribute( rid, "ResObject", "installedSize", res->installedSize );
+ appendNumericAttribute( rid, "ResObject", "buildTime", res->buildTime );
}
RecordId CacheStore::appendResolvable( const RecordId &catalog_id,
@@ -527,6 +589,42 @@
return static_cast<RecordId>(id);
}
+void CacheStore::setSharedData( const data::RecordId &resolvable_id,
+ const data::RecordId &shared_id )
+{
+ _pimpl->set_shared_flag_cmd->bind(":resolvable_id", resolvable_id);
+
+ if ( shared_id == data::noRecordId )
+ _pimpl->set_shared_flag_cmd->bind(":shared_id");
+ else
+ _pimpl->set_shared_flag_cmd->bind(":shared_id", shared_id);
+
+ _pimpl->set_shared_flag_cmd->executenonquery();
+}
+
+void CacheStore::appendNumericAttribute( const data::RecordId &resolvable_id,
+ const std::string &klass,
+ const std::string &name,
+ int value )
+{
+ RecordId type_id = lookupOrAppendType( klass, name );
+ appendNumericAttribute( resolvable_id, type_id, value );
+}
+
+void CacheStore::appendNumericAttribute( const RecordId &resolvable_id,
+ const RecordId &type_id,
+ int value )
+{
+ // weak resolvable_id
+ _pimpl->append_num_attribute_cmd->bind(":rid", resolvable_id );
+ _pimpl->append_num_attribute_cmd->bind(":attr_id", type_id );
+
+ _pimpl->append_num_attribute_cmd->bind(":value", value );
+
+ _pimpl->append_num_attribute_cmd->executenonquery();
+}
+
+
void CacheStore::appendTranslatedStringAttribute( const data::RecordId &resolvable_id,
const std::string &klass,
const std::string &name,
@@ -576,41 +674,13 @@
// weak resolvable_id
_pimpl->append_text_attribute_cmd->bind(":rid", resolvable_id );
_pimpl->append_text_attribute_cmd->bind(":lang_id", lang_id );
- _pimpl->append_text_attribute_cmd->bind(":type_id", type_id );
+ _pimpl->append_text_attribute_cmd->bind(":attr_id", type_id );
- _pimpl->append_text_attribute_cmd->bind(":value", value );
+ _pimpl->append_text_attribute_cmd->bind(":text", value );
_pimpl->append_text_attribute_cmd->executenonquery();
}
-// RecordId CacheStore::insertResObject( const Resolvable::Kind &kind, const data::ResObject &res )
-// {
-// _insert_resolvable_cmd->bind(1, res.name.c_str(), -1);
-// _insert_resolvable_cmd->bind(2, res.edition.version().c_str(), -1);
-// _insert_resolvable_cmd->bind(3, res.edition.release().c_str(), -1);
-// _insert_resolvable_cmd->bind(4, static_cast<int>( res.edition.epoch() ));
-// _insert_resolvable_cmd->bind(5, zypp_arch2db_arch(res.arch));
-// _insert_resolvable_cmd->bind(6, db_kind2zypp_kind(kind));
-// _insert_resolvable_cmd->bind(7, res.summary.text().c_str(), -1);
-// _insert_resolvable_cmd->bind(8, res.description.text().c_str(), -1);
-// _insert_resolvable_cmd->bind(9, res.insnotify.c_str(), -1);
-// _insert_resolvable_cmd->bind(10, res.delnotify.c_str(), -1);
-// _insert_resolvable_cmd->bind(11, res.license_to_confirm.c_str(), -1);
-// _insert_resolvable_cmd->bind(12, res.vendor.c_str(), -1);
-// _insert_resolvable_cmd->bind(13, res.size ); // FIX cast?
-// _insert_resolvable_cmd->bind(14, res.archive_size ); // FIX cast?
-// _insert_resolvable_cmd->bind(15, res.source.c_str(), -1);
-//
-// _insert_resolvable_cmd->bind(16, res.source_media_nr);
-// _insert_resolvable_cmd->bind(17, static_cast<int>(res.install_only));
-// _insert_resolvable_cmd->bind(18, static_cast<int>(res.build_time) ); // FIX cast?
-// _insert_resolvable_cmd->bind(19, static_cast<int>(res.install_time) ); // FIX cast?
-// _insert_resolvable_cmd->executenonquery();
-//
-// return static_cast<RecordId>( _con->insertid() );
-// }
-
-
}
}
Modified: trunk/libzypp/zypp2/cache/CacheStore.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp2/cache/CacheStore.h?rev=5554&r1=5553&r2=5554&view=diff
==============================================================================
--- trunk/libzypp/zypp2/cache/CacheStore.h (original)
+++ trunk/libzypp/zypp2/cache/CacheStore.h Tue May 15 18:33:47 2007
@@ -55,13 +55,60 @@
CacheStore( const Pathname &dbdir );
/**
- * Implements the ResolvableConsumer consumePackage interface
- * Consumer a package and inserts it into the database.
- * Don't use this method yet
+ * Implementation of the \ref ResolvableConsumer interface
+ *
+ * Consume a package, inserting it in the cache, under
+ * \param catalog_id ownership.
+ * \param package Package data
+ */
+ virtual void consumePackage( const data::RecordId &catalog_id, data::Package_Ptr package);
+
+ /**
+ * Implementation of the \ref ResolvableConsumer interface
+ *
+ * Consume a patch, inserting it in the cache, under
+ * \param catalog_id ownership.
+ * \param patch Patch data
+ */
+ virtual void consumePatch( const data::RecordId &catalog_id, data::Patch_Ptr patch);
+
+ /**
+ * Implementation of the \ref ResolvableConsumer interface
+ *
+ * Consume a message, inserting it in the cache, under
+ * \param catalog_id ownership.
+ * \param message Message data
+ */
+ virtual void consumeMessage( const data::RecordId &catalog_id, data::Message_Ptr);
+
+ /**
+ * Implementation of the \ref ResolvableConsumer interface
+ *
+ * Consume a script, inserting it in the cache, under
+ * \param catalog_id ownership.
+ * \param script Script data
+ */
+ virtual void consumeScript( const data::RecordId &catalog_id, data::Script_Ptr);
+
+ /**
+ * Implementation of the \ref ResolvableConsumer interface
+ *
+ * Consume a pattern, inserting it in the cache, under
+ * \param catalog_id ownership.
+ * \param pattern Pattern data
*/
- virtual void consumePackage( const data::Package &package);
+ virtual void consumePattern( const data::RecordId &catalog_id, data::Pattern_Ptr pattern );
/**
+ * Implementation of the \ref ResolvableConsumer interface
+ *
+ * Consume a product, inserting it in the cache, under
+ * \param catalog_id ownership.
+ * \param pattern Pattern data
+ */
+ virtual void consumeProduct( const data::RecordId &catalog_id, data::Product_Ptr product );
+
+ /**
* Appends a resolvable to the store.
*
* You have to specify with \a kind of resolvable are you inserting
@@ -245,7 +292,10 @@
const std::string &name );
/**
- * Returns the record id of a catalog (Source) \a path
+ * Returns the record id of a catalog (Source)
+ *
+ * \param url Url of the catalog
+ * \param path path of the catalog (relative to url)
*
* \note If the catalog entry does not exist, it will
* be created and the new inserted entry's id will
@@ -253,8 +303,38 @@
*/
data::RecordId lookupOrAppendCatalog( const Url &url,
const Pathname &path );
+
+ /**
+ * Set the resolvable shared data flag pointing to
+ * another resolvable.
+ *
+ * This is a hint for cache readers. If any attribute
+ * of a resolvable is empty, is because it is shared
+ * with another resolvable.
+ *
+ * \param resolvable_id Id of the resolvable. Must exists
+ * \param shared_id The resolvable providing the data
+ * This one is a weak reference, the reader should just
+ * try to look the data there as a hint.
+ * use \ref data::noRecordId to reset the value.
+ *
+ */
+ void setSharedData( const data::RecordId &resolvable_id,
+ const data::RecordId &shared_id );
/**
+ * Append a numeric attribute to a resolvable
+ * \param resolvable_id Resovable Id, owner of the attribute
+ * \param klass Type class i.e "Package" "lang" "kind"
+ * \param name Type name i.e : "size" "media_number"
+ * \param value numeric value
+ */
+ void appendNumericAttribute( const data::RecordId &resolvable_id,
+ const std::string &klass,
+ const std::string &name,
+ int value );
+
+ /**
* Append a translated string value to a resolvable
* \param resolvable_id Resovable Id, owner of the attribute
* \param klass Type class i.e "Package" "lang" "kind"
@@ -366,6 +446,21 @@
const data::RecordId &lang_id,
const data::RecordId &type_id,
const std::string &value );
+
+ /**
+ * Append a numeric attribute to a resolvable
+ * \param resolvable_id Resovable Id, owner of the attribute
+ * \param type_id attribute id
+ * \param value numeric value
+ */
+ void appendNumericAttribute( const data::RecordId &resolvable_id,
+ const data::RecordId &type_id,
+ int value );
+
+
+ // this functions are used by ResolvableConsumer interface functions
+ // to avoid some duplication across types.
+ void consumeResObject( const data::RecordId &rid, data::ResObject_Ptr res );
private:
/** Implementation. */
Modified: trunk/libzypp/zypp2/cache/ResolvableQuery.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp2/cache/ResolvableQuery.cc?rev=5554&r1=5553&r2=5554&view=diff
==============================================================================
--- trunk/libzypp/zypp2/cache/ResolvableQuery.cc (original)
+++ trunk/libzypp/zypp2/cache/ResolvableQuery.cc Tue May 15 18:33:47 2007
@@ -14,7 +14,7 @@
Impl( const Pathname &dbdir)
: _dbdir(dbdir)
{
- _fields = "id, name, version, release, epoch, arch, kind, insnotify, delnotify, license_to_confirm, vendor, installed_size, archive_size, install_only, build_time, install_time, catalog_id";
+ _fields = "id, name, version, release, epoch, arch, kind, installed_size, archive_size, install_only, build_time, install_time, catalog_id";
}
~Impl()
@@ -29,6 +29,8 @@
ptr->edition = Edition( reader.getstring(2), reader.getstring(3), reader.getint(4));
ptr->arch = db_arch2zypp_arch( static_castdb::Arch(reader.getint(5)));
+ // TODO get the rest of the data
+
return ptr;
}
@@ -64,24 +66,174 @@
con.executenonquery("COMMIT;");
}
+ std::string queryStringAttribute( const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name )
+ {
+ sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
+ return queryStringAttributeTranslationInternal( con, record_id, Locale(), klass, name);
+ }
+
+ std::string queryStringAttributeTranslation( const data::RecordId &record_id,
+ const Locale &locale,
+ const std::string &klass,
+ const std::string &name )
+ {
+ sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
+ return queryStringAttributeTranslationInternal( con, record_id, locale, klass, name );
+ }
+
+ TranslatedText queryTranslatedStringAttribute( const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name )
+ {
+ sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
+ return queryTranslatedStringAttributeInternal( con, record_id, klass, name );
+ }
+
+ int queryNumericAttribute( const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name )
+ {
+ sqlite3_connection con((_dbdir + "zypp.db").asString().c_str());
+ return queryNumericAttributeInternal( con, record_id, klass, name);
+ }
+
+private:
+
+ int queryNumericAttributeInternal( sqlite3_connection &con,
+ const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name )
+ {
+ con.executenonquery("BEGIN;");
+ 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;");
+
+ cmd.bind(":rid", record_id);
+
+ cmd.bind(":tclass", klass);
+ cmd.bind(":tname", name);
+
+ return cmd.executeint();
+ }
+
+ TranslatedText queryTranslatedStringAttributeInternal( sqlite3_connection &con,
+ const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name )
+ {
+ //con.executenonquery("PRAGMA cache_size=8000;");
+ con.executenonquery("BEGIN;");
+ 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;");
+
+ cmd.bind(":rid", record_id);
+ cmd.bind(":lclass", "lang");
+
+ cmd.bind(":tclass", klass);
+ cmd.bind(":tname", name);
+
+ TranslatedText result;
+ sqlite3_reader reader = cmd.executereader();
+ while(reader.read())
+ {
+ result.setText( reader.getstring(0), Locale( reader.getstring(1) ) );
+ }
+ return result;
+ }
+
+ std::string queryStringAttributeInternal( sqlite3_connection &con,
+ const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name )
+ {
+ return queryStringAttributeTranslationInternal( con, record_id, Locale(), klass, name);
+ }
+
+ std::string queryStringAttributeTranslationInternal( sqlite3_connection &con,
+ const data::RecordId &record_id,
+ const Locale &locale,
+ const std::string &klass,
+ const std::string &name )
+ {
+ //con.executenonquery("PRAGMA cache_size=8000;");
+ con.executenonquery("BEGIN;");
+ 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;");
+
+ cmd.bind(":rid", record_id);
+ cmd.bind(":lclass", "lang");
+ if (locale == Locale() )
+ cmd.bind(":lname", "none");
+ else
+ cmd.bind(":lname", locale.code());
+
+ cmd.bind(":tclass", klass);
+ cmd.bind(":tname", name);
+
+ return cmd.executestring();
+ }
+
Pathname _dbdir;
string _fields;
};
-
+
+//////////////////////////////////////////////////////////////////////////////
+// FORWARD TO IMPLEMENTATION
+//////////////////////////////////////////////////////////////////////////////
+
ResolvableQuery::ResolvableQuery( const Pathname &dbdir)
: _pimpl(new Impl(dbdir))
{
}
-
+
+//////////////////////////////////////////////////////////////////////////////
+
void ResolvableQuery::query( const data::RecordId &id, ProcessResolvable fnc )
{
_pimpl->query(id, fnc);
}
-
+
+//////////////////////////////////////////////////////////////////////////////
+
void ResolvableQuery::query( const std::string &s, ProcessResolvable fnc )
{
_pimpl->query(s, fnc);
}
-
+
+//////////////////////////////////////////////////////////////////////////////
+
+int ResolvableQuery::queryNumericAttribute( const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name )
+{
+ _pimpl->queryNumericAttribute(record_id, klass, name);
+}
+
+std::string ResolvableQuery::queryStringAttribute( const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name )
+{
+ return _pimpl->queryStringAttribute(record_id, klass, name);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+std::string ResolvableQuery::queryStringAttributeTranslation( const data::RecordId &record_id,
+ const Locale &locale,
+ const std::string &klass,
+ const std::string &name )
+{
+ return _pimpl->queryStringAttributeTranslation(record_id, locale, klass, name);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+TranslatedText ResolvableQuery::queryTranslatedStringAttribute( const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name )
+{
+ return _pimpl->queryTranslatedStringAttribute(record_id, klass, name);
+}
+
+//////////////////////////////////////////////////////////////////////////////
} } // namespace zypp::cache
Modified: trunk/libzypp/zypp2/cache/ResolvableQuery.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp2/cache/ResolvableQuery.h?rev=5554&r1=5553&r2=5554&view=diff
==============================================================================
--- trunk/libzypp/zypp2/cache/ResolvableQuery.h (original)
+++ trunk/libzypp/zypp2/cache/ResolvableQuery.h Tue May 15 18:33:47 2007
@@ -46,11 +46,66 @@
void query( const std::string &text,
ProcessResolvable fnc );
- /*void queryAttribute( const std::string &text,
- const std::string &klass
- const std::string
- ProcessResolvable fnc );
- */
+ /**
+ * Queries a specifc attribute for a resolvable
+ *
+ * \param record_id Resolvable cache id
+ * \param klass Attribute Class
+ * \param name Attribute Name
+ *
+ * \return The attribute or 0 if
+ * no record is found.
+ */
+ int queryNumericAttribute( const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name );
+
+ /**
+ * Queries a specifc attribute for a resolvable
+ *
+ * \param record_id Resolvable cache id
+ * \param klass Attribute Class
+ * \param name Attribute Name
+ *
+ * \return The attribute or a empty string if
+ * no record is found.
+ */
+ std::string queryStringAttribute( const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name );
+
+ /**
+ * Queries a specifc attribute translation
+ * for a resolvable.
+ *
+ * \param record_id Resolvable cache id
+ * \param locale Locale of the translation
+ * \param klass Attribute Class
+ * \param name Attribute Name
+ *
+ * \return The attribute or a empty string if
+ * no record is found.
+ */
+ std::string queryStringAttributeTranslation( const data::RecordId &record_id,
+ const Locale &locale,
+ const std::string &klass,
+ const std::string &name );
+
+ /**
+ * Queries all translations for a specific attribute
+ * in a resolvable.
+ *
+ * \param record_id Resolvable cache id
+ * \param klass Attribute Class
+ * \param name Attribute Name
+ *
+ * \return all attribute translations or a empty
+ * \ref TranslatedString if no record is found.
+ */
+ TranslatedText queryTranslatedStringAttribute( const data::RecordId &record_id,
+ const std::string &klass,
+ const std::string &name );
+
private:
/** Implementation. */
class Impl;
Modified: trunk/libzypp/zypp2/cache/schema/schema.sql
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp2/cache/schema/schema.sql?rev=5554&r1=5553&r2=5554&view=diff
==============================================================================
--- trunk/libzypp/zypp2/cache/schema/schema.sql (original)
+++ trunk/libzypp/zypp2/cache/schema/schema.sql Tue May 15 18:33:47 2007
@@ -4,33 +4,20 @@
-- cat schema.sql | grep "^CREATE" | awk '{print "DROP " $2 " IF EXISTS " $3 ";"}' | sort -r
------------------------------------------------
-DROP VIEW IF EXISTS scripts;
-DROP VIEW IF EXISTS products;
-DROP VIEW IF EXISTS patterns;
-DROP VIEW IF EXISTS patches;
-DROP VIEW IF EXISTS packages;
-DROP VIEW IF EXISTS messages;
DROP TRIGGER IF EXISTS remove_resolvables;
DROP TRIGGER IF EXISTS remove_patch_packages_baseversions;
DROP TABLE IF EXISTS types;
-DROP TABLE IF EXISTS text_attributes_set;
DROP TABLE IF EXISTS text_attributes;
DROP TABLE IF EXISTS split_capabilities;
-DROP TABLE IF EXISTS script_ttext_attributes;
-DROP TABLE IF EXISTS script_details;
DROP TABLE IF EXISTS resolvables_catalogs;
DROP TABLE IF EXISTS resolvables;
-DROP TABLE IF EXISTS product_details;
-DROP TABLE IF EXISTS pattern_details;
DROP TABLE IF EXISTS patch_packages_baseversions;
DROP TABLE IF EXISTS patch_packages;
-DROP TABLE IF EXISTS patch_details;
-DROP TABLE IF EXISTS package_details;
DROP TABLE IF EXISTS other_capabilities;
+DROP TABLE IF EXISTS numeric_attributes;
DROP TABLE IF EXISTS names;
DROP TABLE IF EXISTS named_capabilities;
DROP TABLE IF EXISTS modalias_capabilities;
-DROP TABLE IF EXISTS message_details;
DROP TABLE IF EXISTS locks;
DROP TABLE IF EXISTS hal_capabilities;
DROP TABLE IF EXISTS files;
@@ -40,7 +27,9 @@
DROP TABLE IF EXISTS delta_packages;
DROP TABLE IF EXISTS db_info;
DROP TABLE IF EXISTS catalogs;
-DROP INDEX IF EXISTS package_details_resolvable_id;
+DROP INDEX IF EXISTS types_class_name_index;
+DROP INDEX IF EXISTS text_attributes_index;
+DROP INDEX IF EXISTS numeric_attributes_index;
DROP INDEX IF EXISTS named_capabilities_name;
------------------------------------------------
@@ -61,6 +50,7 @@
, class TEXT NOT NULL
, name TEXT NOT NULL
);
+CREATE INDEX types_class_name_index ON types(class, name);
------------------------------------------------
-- Knew catalogs. They existed some day.
@@ -116,6 +106,17 @@
, attr_id INTEGER REFERENCES types(id)
, text TEXT
);
+CREATE INDEX text_attributes_index ON text_attributes(weak_resolvable_id, lang_id, attr_id);
+
+-- Resolvables numeric attributes
+CREATE TABLE numeric_attributes (
+ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
+ , weak_resolvable_id INTEGER NOT NULL
+ , attr_id INTEGER REFERENCES types(id)
+ , value INTEGER NOT NULL
+);
+CREATE INDEX numeric_attributes_index ON numeric_attributes(weak_resolvable_id, attr_id);
+
CREATE TABLE resolvables (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
@@ -126,7 +127,7 @@
, arch INTEGER REFERENCES types(id)
, kind INTEGER REFERENCES types(id)
, catalog_id INTEGER REFERENCES catalogs(id)
- , installed_size INTEGER
+ , installed_size INTEGER
, archive_size INTEGER
, install_only INTEGER
, build_time INTEGER
@@ -135,79 +136,6 @@
);
------------------------------------------------
--- Resolvables kind details
-------------------------------------------------
-
-CREATE TABLE message_details (
- resolvable_id INTEGER REFERENCES resolvables(id)
- , text TEXT
-);
-
-CREATE TABLE patch_details (
- id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
- , resolvable_id INTEGER REFERENCES resolvables(id)
- , patch_id TEXT
- , timestamp INTEGER
- , category TEXT
- , reboot_needed INTEGER
- , affects_package_manager INTEGER
-
-);
-
-CREATE TABLE pattern_details (
- id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
- , resolvable_id INTEGER REFERENCES resolvables(id)
- , user_default INTEGER
- , user_visible INTEGER
- , pattern_category TEXT
- , icon TEXT
- , script TEXT
- , pattern_order TEXT
-
-);
-
-CREATE TABLE product_details (
- id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
- , resolvable_id INTEGER REFERENCES resolvables(id)
-);
-
-
-CREATE TABLE script_details (
- id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
- , resolvable_id INTEGER REFERENCES resolvables(id)
-);
-
--- scripts translated strings
-CREATE TABLE script_ttext_attributes (
- id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
- , lang_code INTEGER
-);
-
-
-CREATE TABLE package_details (
- id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
- , resolvable_id INTEGER REFERENCES resolvables(id)
- , checksum TEXT
- , changelog TEXT
- , buildhost TEXT
- , distribution TEXT
- , license TEXT
- , packager TEXT
- , package_group TEXT
- , url TEXT
- , os TEXT
- , prein TEXT
- , postin TEXT
- , preun TEXT
- , postun TEXT
- , source_size INTEGER
- , authors TEXT
- , filenames TEXT
- , location TEXT
-);
-CREATE INDEX package_details_resolvable_id ON package_details (resolvable_id);
-
-------------------------------------------------
-- Do we need those here?
------------------------------------------------
@@ -226,29 +154,6 @@
);
-CREATE VIEW messages
- AS SELECT * FROM resolvables, message_details
- WHERE resolvables.id = message_details.resolvable_id;
-
-CREATE VIEW packages
- AS SELECT * FROM resolvables, package_details
- WHERE resolvables.id = package_details.resolvable_id;
-
-CREATE VIEW patches
- AS SELECT * FROM resolvables, patch_details
- WHERE resolvables.id = patch_details.resolvable_id;
-
-CREATE VIEW patterns AS SELECT * FROM resolvables, pattern_details
- WHERE resolvables.id = pattern_details.resolvable_id;
-
-CREATE VIEW products AS
- SELECT * FROM resolvables, product_details
- WHERE resolvables.id = product_details.resolvable_id;
-
-CREATE VIEW scripts AS
- SELECT * FROM resolvables, script_details
- WHERE resolvables.id = script_details.resolvable_id;
-
CREATE TABLE delta_packages (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
, media_nr INTEGER
--
To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-commit+help@opensuse.org