CapabilityQuery working!, now lets go for the Resolvable one...
authorDuncan Mac-Vicar P <dmacvicar@suse.de>
Mon, 26 Mar 2007 13:45:55 +0000 (13:45 +0000)
committerDuncan Mac-Vicar P <dmacvicar@suse.de>
Mon, 26 Mar 2007 13:45:55 +0000 (13:45 +0000)
zypp2/CMakeLists.txt
zypp2/cache/CacheCommon.h
zypp2/cache/CacheInitializer.cpp
zypp2/cache/CacheInitializer.h
zypp2/cache/CacheQuery.cc
zypp2/cache/CacheQuery.h
zypp2/cache/CacheStore.cpp
zypp2/cache/DatabaseTypes.cc [new file with mode: 0644]
zypp2/cache/DatabaseTypes.h
zypp2/cache/schema/schema.sql

index 8a4c2cf..38b6ee6 100644 (file)
@@ -28,6 +28,7 @@ SET( zypp2_cache_SRCS
   cache/CacheQuery.cc
   cache/CacheStore.cpp
   cache/Utils.cpp
+  cache/DatabaseTypes.cc
 )
 
 SET( zypp2_cache_HEADERS
@@ -36,6 +37,7 @@ SET( zypp2_cache_HEADERS
   cache/CacheStore.h
   cache/CacheQuery.h
   cache/Utils.h
+  cache/DatabaseTypes.h
 )
 
 #INSTALL(  FILES
index b12846c..b239544 100644 (file)
@@ -23,7 +23,6 @@ namespace zypp
 {
 namespace cache
 {
-
 namespace db
 {
   
index 6f0a396..30c1580 100644 (file)
@@ -95,7 +95,7 @@ bool CacheInitializer::tablesCreated() const
   Measure timer("Check tables exist");
   unsigned int count = _pimpl->con->executeint("select count(*) from sqlite_master where type='table';");
   timer.elapsed();
-  return ( count == 1 );
+  return ( count == 26 );
 }
 
 void CacheInitializer::createTables()
index b4c5e4c..3109f3b 100644 (file)
@@ -27,13 +27,11 @@ namespace zypp
   namespace cache
   { /////////////////////////////////////////////////////////////////
 
-    DEFINE_PTR_TYPE(CacheInitializer);
-
     ///////////////////////////////////////////////////////////////////
     //
     // CLASS NAME : CacheInitializer
     //
-    class CacheInitializer : public base::ReferenceCounted, private base::NonCopyable
+    class CacheInitializer
     {
       friend std::ostream & operator<<( std::ostream & str, const CacheInitializer & obj );
 
index 29ba72f..f2aef17 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "zypp/base/Logger.h"
 
+#include "zypp2/cache/DatabaseTypes.h"
 #include "zypp2/cache/CacheInitializer.h"
 #include "zypp2/cache/CacheQuery.h"
 
@@ -21,31 +22,60 @@ using namespace zypp::capability;
 using namespace zypp::cache;
 using namespace sqlite3x;
 
+typedef shared_ptr<sqlite3_command> sqlite3_command_ptr;
+typedef shared_ptr<sqlite3_reader> sqlite3_reader_ptr;
+
+struct DatabaseContext
+{
+  sqlite3_connection con;
+  sqlite3_command_ptr select_vercap_cmd;
+  Pathname dbdir;
+};
+
+typedef shared_ptr<DatabaseContext> DatabaseContext_Ptr;
+
 class CapabilityQuery::Impl
 {
   public:
-  Impl( sqlite3_connection &con )
-    : _con(con), _read(false)
+  Impl( DatabaseContext_Ptr p_context, const zypp::Dep &deptype, const data::RecordId &resolvable_id  )
+    : context(p_context), _read(false), _deptype(deptype), _resolvable_id(resolvable_id)
   {}
   
-  sqlite3_connection &_con;
-  sqlite3_reader _reader;
+  ~Impl()
+  {
+    MIL << endl;
+  }
+  
+  DatabaseContext_Ptr context;
+  sqlite3_reader_ptr _reader;
   bool _read;
+  zypp::Dep _deptype;
+  data::RecordId _resolvable_id;
 };
 
-CapabilityQuery::CapabilityQuery( Impl *impl )
+CapabilityQuery::CapabilityQuery( Impl *impl)
   : _pimpl( impl)
 {
-    sqlite3_command cmd(_pimpl->_con, "select * from capabilities where resolvable_id=:id;");
     //cmd.bind(":id", id);
-  
-    sqlite3_reader reader = cmd.executereader();
+    _pimpl->context->select_vercap_cmd->bind(":rid", _pimpl->_resolvable_id);
+    _pimpl->context->select_vercap_cmd->bind(":dtype", static_cast<int>( zypp_deptype2db_deptype(_pimpl->_deptype) ) );
+    _pimpl->_reader.reset( new sqlite3_reader(_pimpl->context->select_vercap_cmd->executereader()));
+    MIL << "Done setup query" << endl;
     read();
+    MIL << "Done first read" << endl;
+}
+
+CapabilityQuery::~CapabilityQuery()
+{
+  //MIL << endl;
+  // it has to be disposed before the commands
+  _pimpl->_reader.reset();
 }
 
 bool CapabilityQuery::read()
 {
-  return ( _pimpl->_read = _pimpl->_reader.read() );
+  //MIL << endl;
+  return ( _pimpl->_read = _pimpl->_reader->read() );
 }
   
 bool CapabilityQuery::valid() const
@@ -53,41 +83,57 @@ bool CapabilityQuery::valid() const
   return _pimpl->_read;
 }
 
+CapabilityImpl::Ptr CapabilityQuery::value()
+{
+  Resolvable::Kind refer = db_kind2zypp_kind( static_cast<db::Kind>(_pimpl->_reader->getint(0)) );
+  //Resolvable::Kind refer = ResTraits<Package>::kind;
+  zypp::Rel rel = db_rel2zypp_rel( static_cast<db::Rel>(_pimpl->_reader->getint(5)) );
+  //zypp::Rel rel = Rel::EQ;
+  capability::VersionedCap *vcap = new capability::VersionedCap( refer, _pimpl->_reader->getstring(1), /* rel */ rel, Edition( _pimpl->_reader->getstring(2), _pimpl->_reader->getstring(3), _pimpl->_reader->getint(4) ) );
+  return capability::VersionedCap::Ptr(vcap);
+}
+
 struct CacheQuery::Impl
 {
-  Impl()
-  {}
+  Impl( const Pathname &pdbdir )
+  {
+    cache::CacheInitializer initializer(pdbdir, "zypp.db");
+    if ( initializer.justInitialized() )
+    {
+      MIL << "database " << (pdbdir + "zypp.db") << " was just created" << endl;
+    }
+    
+    context.reset(new DatabaseContext);
+    context->dbdir = pdbdir;
+    
+    try
+    {
+      context->con.open( (pdbdir + "zypp.db").asString().c_str());
+      //_insert_resolvable_cmd = new sqlite3_command( *_con, INSERT_RESOLVABLE_QUERY );                                    
+      //_insert_package_cmd = new sqlite3_command( *_con, INSERT_PACKAGE_QUERY );
+      context->select_vercap_cmd.reset( new sqlite3_command( context->con, "select c.refers_kind, n.name, v.version, v.release, v.epoch, v.relation from names n, capabilities c, versioned_capabilities v  where v.name_id=n.id and c.id=v.dependency_id and c.resolvable_id=:rid and c.dependency_type=:dtype;"));
+    }
+    catch(exception &ex)
+    {
+      //ZYPP_CAUGHT(ex);
+      ZYPP_THROW(Exception(ex.what()));
+    }
+  }
   
-  sqlite3_connection con;
+  DatabaseContext_Ptr context;
 };
 
 CacheQuery::CacheQuery( const Pathname &dbdir )
-    : _pimpl( new Impl() )
+    : _pimpl( new Impl(dbdir) )
 {
-  cache::CacheInitializer initializer(dbdir, "zypp.db");
-  if ( initializer.justInitialized() )
-  {
-    MIL << "database " << (dbdir + "zypp.db") << " was just created" << endl;
-  }
-  
-  try
-  {
-    _pimpl->con.open( (dbdir + "zypp.db").asString().c_str());
-    //_insert_resolvable_cmd = new sqlite3_command( *_con, INSERT_RESOLVABLE_QUERY );                                    
-    //_insert_package_cmd = new sqlite3_command( *_con, INSERT_PACKAGE_QUERY );
-  }
-  catch(exception &ex)
-  {
-    //ZYPP_CAUGHT(ex);
-    ZYPP_THROW(Exception(ex.what()));
-  }
 }
 
-CapabilityQuery CacheQuery::createCapabilityQuery()
+CapabilityQuery CacheQuery::createCapabilityQuery( const zypp::Dep &deptype, const data::RecordId &resolvable_id  )
 {
-  return CapabilityQuery(new CapabilityQuery::Impl(_pimpl->con));
+  return CapabilityQuery( new CapabilityQuery::Impl( _pimpl->context, deptype, resolvable_id) );
 }
 
 CacheQuery::~CacheQuery()
 {
-}
\ No newline at end of file
+}
+
index 5e00707..cf27181 100644 (file)
@@ -34,15 +34,54 @@ namespace zypp
   namespace cache
   { /////////////////////////////////////////////////////////////////
  
+   /**
+    * Allows to iterate around the capabilities in
+    * the cache.
+    * Use \ref CacheQuery to create this query.
+    *
+    * \code
+    * CacheQuery query(dbdir);
+    * CapabilityQuery capquery = query.createCapabilityQuery( zypp::Dep::REQUIRES, 1 );
+    * cout << capquery.value() << endl;
+    * while ( capquery.read() )
+    * {
+    *   // value is a CapablityImpl::Ptr
+    *   cout << capquery.value() << endl;
+    * }
+    * \endcode
+    */
     struct CapabilityQuery
     {
     public:
-      class Impl;
-      CapabilityQuery( Impl * );
+     /**
+      * reads the next item for the query
+      * returns false if there are no
+      * more results
+      */
       bool read();
+      /**
+      * true if the last \ref read()
+      * had a new result
+      */
       bool valid() const;
-    private:
+      /**
+      * Return a \ref CapabilityImpl::Ptr
+      * from the current result.
+      */
+      capability::CapabilityImpl::Ptr value();
+      
       /** Implementation. */
+      class Impl;
+     /**
+      * Constructor
+      */
+      CapabilityQuery( Impl *impl );
+     /**
+      * Destructor
+      */
+      ~CapabilityQuery();
+    private:
+      
       /** Pointer to implementation. */
       RW_pointer<Impl> _pimpl;
     };
@@ -53,16 +92,17 @@ namespace zypp
     class CacheQuery
     {
     public:
+       /** Implementation. */
+      class Impl;
       CacheQuery( const Pathname &dbdir );
       ~CacheQuery();
-      CapabilityQuery createCapabilityQuery();
+      CapabilityQuery createCapabilityQuery( const zypp::Dep &deptype, const data::RecordId &id  );
     private:
-      /** Implementation. */
-      class Impl;
       /** Pointer to implementation. */
       RW_pointer<Impl> _pimpl;
     };
     
   } // ns cache
 } // ns zypp
-#endif
\ No newline at end of file
+#endif
+
index a6c6ebb..a498f12 100644 (file)
@@ -271,6 +271,8 @@ data::RecordId CacheStore::appendDependencyEntry( const data::RecordId &resolvab
   
   _pimpl->insert_dependency_entry_cmd->executenonquery();
   //delete cmd;
+  long long id = _pimpl->con.insertid();
+  return static_cast<data::RecordId>(id);
 }
 
 data::RecordId CacheStore::lookupOrAppendFile( const Pathname &path )
diff --git a/zypp2/cache/DatabaseTypes.cc b/zypp2/cache/DatabaseTypes.cc
new file mode 100644 (file)
index 0000000..13f03ac
--- /dev/null
@@ -0,0 +1,272 @@
+#include "zypp2/cache/DatabaseTypes.h"
+
+using namespace std;
+using namespace zypp;
+using namespace zypp::cache;
+
+namespace zypp
+{
+namespace cache
+{
+
+static struct archrc
+{
+  char *arch;
+  db::Arch rc;
+}
+archtable[] = {
+                { "noarch",    db::ARCH_NOARCH },
+                { "i386",      db::ARCH_I386 },
+                { "i486",      db::ARCH_I486 },
+                { "i586",      db::ARCH_I586 },
+                { "i686",      db::ARCH_I686 },
+                { "x86_64",    db::ARCH_X86_64 },
+                { "ia32e",     db::ARCH_IA32E },
+                { "athlon",    db::ARCH_ATHLON },
+                { "ppc",       db::ARCH_PPC },
+                { "ppc64",     db::ARCH_PPC64 },
+                { "s390",      db::ARCH_S390 },
+                { "s390x",     db::ARCH_S390X },
+                { "ia64",      db::ARCH_IA64 },
+                { "sparc",     db::ARCH_SPARC },
+                { "sparc64",   db::ARCH_SPARC64 },
+                { NULL,                db::ARCH_UNKNOWN }
+              };
+
+//----------------------------------------------------------------------------
+
+// Convert ZYPP relation operator to ZMD RCResolvableRelation
+
+db::Rel
+zypp_rel2db_rel( zypp::Rel op)
+{
+
+  /* This enum is here so that gdb can give us pretty strings */
+
+  switch (op.inSwitch())
+  {
+  case Rel::EQ_e:
+    return db::REL_EQUAL;
+    break;
+  case Rel::NE_e:
+    return db::REL_NOT_EQUAL;
+    break;
+  case Rel::LT_e:
+    return db::REL_LESS;
+    break;
+  case Rel::LE_e:
+    return db::REL_LESS_EQUAL;
+    break;
+  case Rel::GT_e:
+    return db::REL_GREATER;
+    break;
+  case Rel::GE_e:
+    return db::REL_GREATER_EQUAL;
+    break;
+  case Rel::ANY_e:
+    return db::REL_ANY;
+    break;
+  case Rel::NONE_e:
+    return db::REL_NONE;
+    break;
+  }
+  return db::REL_INVALID;
+}
+
+
+Rel
+db_rel2zypp_rel (db::Rel rel)
+{
+  switch (rel)
+  {
+  case db::REL_INVALID:
+    return Rel::NONE;
+    break;
+  case db::REL_ANY:
+    return Rel::ANY;
+    break;
+  case db::REL_EQUAL:
+    return Rel::EQ;
+    break;
+  case db::REL_LESS:
+    return Rel::LT;
+    break;
+  case db::REL_LESS_EQUAL:
+    return Rel::LE;
+    break;
+  case db::REL_GREATER:
+    return Rel::GT;
+    break;
+  case db::REL_GREATER_EQUAL:
+    return Rel::GE;
+    break;
+  case db::REL_NOT_EQUAL:
+    return Rel::NE;
+    break;
+  case db::REL_NONE:
+    return Rel::ANY;
+    break;
+  }
+  return Rel::NONE;
+}
+
+//----------------------------------------------------------------------------
+
+// convert ZYPP architecture string to ZMD int
+
+db::Arch
+zypp_arch2db_arch(const Arch & arch)
+{
+  string arch_str = arch.asString();
+  struct archrc *aptr = archtable;
+  while (aptr->arch != NULL)
+  {
+    if (arch_str == aptr->arch)
+      break;
+    aptr++;
+  }
+
+  return aptr->rc;
+}
+
+Arch
+db_arch2zypp_arch (db::Arch rc)
+{
+  if (rc == db::ARCH_UNKNOWN)
+    return Arch();
+
+  struct archrc *aptr = archtable;
+  while (aptr->arch != NULL)
+  {
+    if (aptr->rc == rc)
+    {
+      return Arch (aptr->arch);
+    }
+    aptr++;
+  }
+  WAR << "DbAccess::Rc2Arch(" << rc << ") unknown" << endl;
+  return Arch ();
+}
+
+
+// remove Authors from description Text
+string desc2str (const Text t)
+{
+  static string s;             // static so we can use sqlite STATIC below
+  s.clear();
+  string::size_type authors = t.find ("Authors:");             // strip off 'Authors:'
+
+  if (authors == string::npos)
+  {    // if no "Authors", point to end of string
+    authors = t.size();
+  }
+
+  // now remove trailing whitespace
+
+  do
+  {
+    --authors;
+  }
+  while (t[authors] == ' ' || t[authors] == '\n');
+  s = string( t, 0, authors+1 );
+
+  return s;
+}
+
+//----------------------------------------------------------------------------
+// convert ZYPP Resolvable kind to ZMD db::Kind
+
+db::Kind
+zypp_kind2db_kind( Resolvable::Kind kind )
+{
+  if (kind == ResTraits<Package>::kind)         return db::KIND_PACKAGE;
+  else if (kind == ResTraits<Script>::kind)     return db::KIND_SCRIPT;
+  else if (kind == ResTraits<Message>::kind)    return db::KIND_MESSAGE;
+  else if (kind == ResTraits<Patch>::kind)      return db::KIND_PATCH;
+  else if (kind == ResTraits<Selection>::kind) return db::KIND_SELECTION;
+  else if (kind == ResTraits<Pattern>::kind)    return db::KIND_PATTERN;
+  else if (kind == ResTraits<Product>::kind)    return db::KIND_PRODUCT;
+  else if (kind == ResTraits<Language>::kind)   return db::KIND_LANGUAGE;
+  else if (kind == ResTraits<Atom>::kind)       return db::KIND_ATOM;
+  else if (kind == ResTraits<SrcPackage>::kind) return db::KIND_SRC;
+  else if (kind == ResTraits<SystemResObject>::kind) return db::KIND_SYSTEM;
+
+  WAR << "Unknown resolvable kind " << kind << endl;
+  return db::KIND_UNKNOWN;
+}
+
+//----------------------------------------------------------------------------
+// convert ZYPP Resolvable kind to ZMD db::Kind
+
+Resolvable::Kind
+db_kind2zypp_kind( db::Kind kind )
+{
+  switch ( kind )
+  {
+    case db::KIND_PACKAGE:
+      return ResTraits<Package>::kind;
+    case db::KIND_SCRIPT:
+      return ResTraits<Script>::kind;
+    case db::KIND_MESSAGE:
+      return ResTraits<Message>::kind;
+    case db::KIND_PATCH:
+      return ResTraits<Selection>::kind;
+    case db::KIND_PATTERN:
+      return ResTraits<Pattern>::kind;
+    case db::KIND_PRODUCT:
+      return ResTraits<Product>::kind;
+    case db::KIND_LANGUAGE:
+      return ResTraits<Language>::kind;
+    case db::KIND_ATOM:
+      return ResTraits<Atom>::kind;
+    case db::KIND_SRC:
+      return ResTraits<SrcPackage>::kind;
+    case db::KIND_SYSTEM:
+      return ResTraits<SystemResObject>::kind;
+  }
+  // unreached
+}
+
+
+db::DependencyType
+zypp_deptype2db_deptype( zypp::Dep deptype )
+{
+  switch ( deptype.inSwitch() )
+  {
+    case zypp::Dep::PROVIDES_e: return db::DEP_TYPE_PROVIDE;
+    case zypp::Dep::CONFLICTS_e: return db::DEP_TYPE_CONFLICT;
+    case zypp::Dep::OBSOLETES_e: return db::DEP_TYPE_OBSOLETE;
+    case zypp::Dep::FRESHENS_e: return db::DEP_TYPE_FRESHEN;
+    case zypp::Dep::REQUIRES_e: return db::DEP_TYPE_REQUIRE;
+    case zypp::Dep::PREREQUIRES_e: return db::DEP_TYPE_PREREQUIRE;
+    case zypp::Dep::RECOMMENDS_e: return db::DEP_TYPE_RECOMMEND;
+    case zypp::Dep::SUGGESTS_e: return db::DEP_TYPE_SUGGEST;
+    case zypp::Dep::SUPPLEMENTS_e: return db::DEP_TYPE_SUPPLEMENT;
+    case zypp::Dep::ENHANCES_e: return db::DEP_TYPE_ENHANCE;
+    default:
+    return db::DEP_TYPE_UNKNOWN;
+   }
+   
+}
+
+zypp::Dep
+db_deptype2zypp_deptype( db::DependencyType deptype )
+{
+  switch ( deptype )
+  {
+    case db::DEP_TYPE_PROVIDE: return zypp::Dep::PROVIDES; break;
+    case db::DEP_TYPE_CONFLICT: return zypp::Dep::CONFLICTS; break;
+    case db::DEP_TYPE_OBSOLETE: return zypp::Dep::OBSOLETES; break;
+    case db::DEP_TYPE_FRESHEN: return zypp::Dep::FRESHENS; break;
+    case db::DEP_TYPE_REQUIRE: return zypp::Dep::REQUIRES; break;
+    case db::DEP_TYPE_PREREQUIRE: return zypp::Dep::PREREQUIRES; break;
+    case db::DEP_TYPE_RECOMMEND: return zypp::Dep::RECOMMENDS; break;
+    case db::DEP_TYPE_SUGGEST: return zypp::Dep::SUGGESTS; break;
+    case db::DEP_TYPE_SUPPLEMENT: return zypp::Dep::SUPPLEMENTS; break;
+    case db::DEP_TYPE_ENHANCE: return zypp::Dep::ENHANCES; break;
+   }
+}
+
+} // ns cache
+} // ns zypp
+
index 00d9e0a..74065d0 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef ZYPP_CACHE_DB_TYPES_H
+#define ZYPP_CACHE_DB_TYPES_H
+
 #include "zypp2/cache/CacheCommon.h"
 #include "zypp/NeedAType.h"
 #include "zypp/Resolvable.h"
 #include "zypp/Arch.h"
 #include "zypp/Rel.h"
 
-using namespace std;
-using namespace zypp;
-using namespace zypp::cache;
-
-static struct archrc
-{
-  char *arch;
-  db::Arch rc;
-}
-archtable[] = {
-                { "noarch",    db::ARCH_NOARCH },
-                { "i386",      db::ARCH_I386 },
-                { "i486",      db::ARCH_I486 },
-                { "i586",      db::ARCH_I586 },
-                { "i686",      db::ARCH_I686 },
-                { "x86_64",    db::ARCH_X86_64 },
-                { "ia32e",     db::ARCH_IA32E },
-                { "athlon",    db::ARCH_ATHLON },
-                { "ppc",       db::ARCH_PPC },
-                { "ppc64",     db::ARCH_PPC64 },
-                { "s390",      db::ARCH_S390 },
-                { "s390x",     db::ARCH_S390X },
-                { "ia64",      db::ARCH_IA64 },
-                { "sparc",     db::ARCH_SPARC },
-                { "sparc64",   db::ARCH_SPARC64 },
-                { NULL,                db::ARCH_UNKNOWN }
-              };
-
-//----------------------------------------------------------------------------
-
-// Convert ZYPP relation operator to ZMD RCResolvableRelation
-
-db::Rel
-zypp_rel2db_rel( zypp::Rel op)
-{
-
-  /* This enum is here so that gdb can give us pretty strings */
-
-  switch (op.inSwitch())
-  {
-  case Rel::EQ_e:
-    return db::REL_EQUAL;
-    break;
-  case Rel::NE_e:
-    return db::REL_NOT_EQUAL;
-    break;
-  case Rel::LT_e:
-    return db::REL_LESS;
-    break;
-  case Rel::LE_e:
-    return db::REL_LESS_EQUAL;
-    break;
-  case Rel::GT_e:
-    return db::REL_GREATER;
-    break;
-  case Rel::GE_e:
-    return db::REL_GREATER_EQUAL;
-    break;
-  case Rel::ANY_e:
-    return db::REL_ANY;
-    break;
-  case Rel::NONE_e:
-    return db::REL_NONE;
-    break;
-  }
-  return db::REL_INVALID;
-}
-
-
-Rel
-db_rel2zypp_rel (db::Rel rel)
-{
-  switch (rel)
-  {
-  case db::REL_INVALID:
-    return Rel::NONE;
-    break;
-  case db::REL_ANY:
-    return Rel::ANY;
-    break;
-  case db::REL_EQUAL:
-    return Rel::EQ;
-    break;
-  case db::REL_LESS:
-    return Rel::LT;
-    break;
-  case db::REL_LESS_EQUAL:
-    return Rel::LE;
-    break;
-  case db::REL_GREATER:
-    return Rel::GT;
-    break;
-  case db::REL_GREATER_EQUAL:
-    return Rel::GE;
-    break;
-  case db::REL_NOT_EQUAL:
-    return Rel::NE;
-    break;
-  case db::REL_NONE:
-    return Rel::ANY;
-    break;
-  }
-  return Rel::NONE;
-}
-
-//----------------------------------------------------------------------------
-
-// convert ZYPP architecture string to ZMD int
-
-db::Arch
-zypp_arch2db_arch(const Arch & arch)
-{
-  string arch_str = arch.asString();
-  struct archrc *aptr = archtable;
-  while (aptr->arch != NULL)
-  {
-    if (arch_str == aptr->arch)
-      break;
-    aptr++;
-  }
-
-  return aptr->rc;
-}
-
-Arch
-db_arch2zypp_arch (db::Arch rc)
+namespace zypp
 {
-  if (rc == db::ARCH_UNKNOWN)
-    return Arch();
-
-  struct archrc *aptr = archtable;
-  while (aptr->arch != NULL)
+  namespace cache
   {
-    if (aptr->rc == rc)
-    {
-      return Arch (aptr->arch);
-    }
-    aptr++;
+    db::Rel zypp_rel2db_rel( zypp::Rel op);
+    zypp::Rel db_rel2zypp_rel ( db::Rel rel);
+    
+    db::Arch zypp_arch2db_arch(const zypp::Arch & arch);
+    zypp::Arch db_arch2zypp_arch ( db::Arch rc);
+    
+    std::string desc2str (const zypp::Text t);
+    
+    db::Kind zypp_kind2db_kind( zypp::Resolvable::Kind kind );
+    zypp::Resolvable::Kind db_kind2zypp_kind( db::Kind kind );
+    
+    db::DependencyType zypp_deptype2db_deptype( zypp::Dep deptype );
+    zypp::Dep db_deptype2zypp_deptype( db::DependencyType deptype );
   }
-  WAR << "DbAccess::Rc2Arch(" << rc << ") unknown" << endl;
-  return Arch ();
 }
 
+#endif
 
-// remove Authors from description Text
-string desc2str (const Text t)
-{
-  static string s;             // static so we can use sqlite STATIC below
-  s.clear();
-  string::size_type authors = t.find ("Authors:");             // strip off 'Authors:'
-
-  if (authors == string::npos)
-  {    // if no "Authors", point to end of string
-    authors = t.size();
-  }
-
-  // now remove trailing whitespace
-
-  do
-  {
-    --authors;
-  }
-  while (t[authors] == ' ' || t[authors] == '\n');
-  s = string( t, 0, authors+1 );
-
-  return s;
-}
-
-//----------------------------------------------------------------------------
-// convert ZYPP Resolvable kind to ZMD db::Kind
-
-db::Kind
-zypp_kind2db_kind( Resolvable::Kind kind )
-{
-  if (kind == ResTraits<Package>::kind)         return db::KIND_PACKAGE;
-  else if (kind == ResTraits<Script>::kind)     return db::KIND_SCRIPT;
-  else if (kind == ResTraits<Message>::kind)    return db::KIND_MESSAGE;
-  else if (kind == ResTraits<Patch>::kind)      return db::KIND_PATCH;
-  else if (kind == ResTraits<Selection>::kind) return db::KIND_SELECTION;
-  else if (kind == ResTraits<Pattern>::kind)    return db::KIND_PATTERN;
-  else if (kind == ResTraits<Product>::kind)    return db::KIND_PRODUCT;
-  else if (kind == ResTraits<Language>::kind)   return db::KIND_LANGUAGE;
-  else if (kind == ResTraits<Atom>::kind)       return db::KIND_ATOM;
-  else if (kind == ResTraits<SrcPackage>::kind) return db::KIND_SRC;
-  else if (kind == ResTraits<SystemResObject>::kind) return db::KIND_SYSTEM;
-
-  WAR << "Unknown resolvable kind " << kind << endl;
-  return db::KIND_UNKNOWN;
-}
-
-db::DependencyType
-zypp_deptype2db_deptype( zypp::Dep deptype )
-{
-  switch ( deptype.inSwitch() )
-  {
-    case zypp::Dep::PROVIDES_e: return db::DEP_TYPE_PROVIDE;
-    case zypp::Dep::CONFLICTS_e: return db::DEP_TYPE_CONFLICT;
-    case zypp::Dep::OBSOLETES_e: return db::DEP_TYPE_OBSOLETE;
-    case zypp::Dep::FRESHENS_e: return db::DEP_TYPE_FRESHEN;
-    case zypp::Dep::REQUIRES_e: return db::DEP_TYPE_REQUIRE;
-    case zypp::Dep::PREREQUIRES_e: return db::DEP_TYPE_PREREQUIRE;
-    case zypp::Dep::RECOMMENDS_e: return db::DEP_TYPE_RECOMMEND;
-    case zypp::Dep::SUGGESTS_e: return db::DEP_TYPE_SUGGEST;
-    case zypp::Dep::SUPPLEMENTS_e: return db::DEP_TYPE_SUPPLEMENT;
-    case zypp::Dep::ENHANCES_e: return db::DEP_TYPE_ENHANCE;
-    default:
-    return db::DEP_TYPE_UNKNOWN;
-   }
-   
-}
-
-zypp::Dep
-db_deptype2zypp_deptype( db::DependencyType deptype )
-{
-  switch ( deptype )
-  {
-    case db::DEP_TYPE_PROVIDE: return zypp::Dep::PROVIDES; break;
-    case db::DEP_TYPE_CONFLICT: return zypp::Dep::CONFLICTS; break;
-    case db::DEP_TYPE_OBSOLETE: return zypp::Dep::OBSOLETES; break;
-    case db::DEP_TYPE_FRESHEN: return zypp::Dep::FRESHENS; break;
-    case db::DEP_TYPE_REQUIRE: return zypp::Dep::REQUIRES; break;
-    case db::DEP_TYPE_PREREQUIRE: return zypp::Dep::PREREQUIRES; break;
-    case db::DEP_TYPE_RECOMMEND: return zypp::Dep::RECOMMENDS; break;
-    case db::DEP_TYPE_SUGGEST: return zypp::Dep::SUGGESTS; break;
-    case db::DEP_TYPE_SUPPLEMENT: return zypp::Dep::SUPPLEMENTS; break;
-    case db::DEP_TYPE_ENHANCE: return zypp::Dep::ENHANCES; break;
-   }
-}
\ No newline at end of file
index d59d9f1..e9150c2 100644 (file)
@@ -31,6 +31,7 @@ DROP TABLE IF EXISTS locks;
 DROP TABLE IF EXISTS files;
 DROP TABLE IF EXISTS file_names;
 DROP TABLE IF EXISTS file_capabilities;
+DROP TABLE IF EXISTS split_capabilities;
 DROP TABLE IF EXISTS dir_names;
 DROP TABLE IF EXISTS delta_packages;
 DROP TABLE IF EXISTS db_info;
@@ -38,6 +39,7 @@ DROP TABLE IF EXISTS catalogs;
 DROP TABLE IF EXISTS capabilities;
 DROP INDEX IF EXISTS package_details_resolvable_id;
 DROP INDEX IF EXISTS capability_resolvable;
+DROP INDEX IF EXISTS versioned_capabilities_dependency_id;
 
 ------------------------------------------------
 -- version metadata, probably not needed, there
@@ -254,7 +256,6 @@ CREATE VIEW scripts AS
 
 CREATE TABLE delta_packages (
     id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
-  , package_id INTEGER REFERENCES packages(id)
   , media_nr INTEGER
   , location TEXT
   , checksum TEXT
@@ -271,7 +272,6 @@ CREATE TABLE delta_packages (
 
 CREATE TABLE patch_packages (
     id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
-  , package_id INTEGER REFERENCES packages(id)
   , media_nr INTEGER
   , location TEXT
   , checksum TEXT
@@ -325,6 +325,7 @@ CREATE TABLE versioned_capabilities (
   , epoch INTEGER
   , relation INTEGER
 );
+CREATE INDEX versioned_capabilities_dependency_id ON versioned_capabilities (dependency_id);
 
 CREATE TABLE named_capabilities (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL