- add method to find a package by name from rpmdb
authorpmatilai <pmatilai>
Tue, 18 Apr 2006 21:33:34 +0000 (21:33 +0000)
committerpmatilai <pmatilai>
Tue, 18 Apr 2006 21:33:34 +0000 (21:33 +0000)
- use rpmdb handler methods for getting to distroverpkg
- clean up the logic for setting distroversion

apt-pkg/init.cc
apt-pkg/pkgsystem.h
apt-pkg/rpm/rpmhandler.cc
apt-pkg/rpm/rpmhandler.h
apt-pkg/rpm/rpmsystem.cc
apt-pkg/rpm/rpmsystem.h

index 4c75b83..27e3722 100644 (file)
@@ -157,13 +157,11 @@ bool pkgInitSystem(Configuration &Cnf,pkgSystem *&Sys)
         return _error->Error(_("Unable to determine a suitable system type"));
    }
 
-   // LORG:2006-02-06
-   if (Cnf.Find("APT::DistroVersion", "").empty()) {
-       Cnf.Set("APT::DistroVersion", Sys->DistroVer(Cnf));
-   }
-
    // CNC:2003-03-15
    bool Ret = Sys->Initialize(Cnf);
+   // LORG:2006-02-06
+   Cnf.CndSet("APT::DistroVersion", Sys->DistroVer());
+
 #ifdef WITH_LUA
    _lua->RunScripts("Scripts::Init");
 #endif
index a296e69..7c4c782 100644 (file)
@@ -99,7 +99,7 @@ class pkgSystem
    virtual signed Score(Configuration const &/*Cnf*/) {return 0;};
 
    // LORG:2006-02-06 Distro version from package system
-   virtual string DistroVer(Configuration const &/*Cnf*/) {return "";};
+   virtual string DistroVer() {return "";};
    
    // CNC:2002-07-03
    // Do environment specific pre-processing over the Index Files
index b6f8e7f..ea774bb 100644 (file)
@@ -829,6 +829,20 @@ bool RPMDBHandler::Jump(unsigned int Offset)
    return true;
 }
 
+bool RPMDBHandler::JumpByName(string PkgName)
+{
+   if (RpmIter == NULL) return false;
+   rpmdbFreeIterator(RpmIter);
+#if RPM_VERSION >= 0x040100
+   RpmIter = rpmtsInitIterator(Handler, (rpmTag)RPMDBI_LABEL, PkgName.c_str(), 0);
+#else
+   RpmIter = rpmdbInitIterator(Handler, RPMDBI_LABEL, PkgName.c_str(), 0);
+#endif
+
+   HeaderP = rpmdbNextIterator(RpmIter);
+   return (HeaderP != NULL);
+}
+
 void RPMDBHandler::Rewind()
 {
 #if RPM_VERSION >= 0x040000
index e5d6504..a86f93e 100644 (file)
@@ -183,6 +183,9 @@ class RPMDBHandler : public RPMHandler
    virtual time_t Mtime() {return DbFileMtime;}
    virtual bool OrderedOffset() {return false;};
 
+   // used by rpmSystem::DistroVer()
+   bool JumpByName(string PkgName);
+
    RPMDBHandler(bool WriteLock=false);
    virtual ~RPMDBHandler();
 };
index e0d30de..d28882f 100644 (file)
@@ -246,52 +246,20 @@ signed rpmSystem::Score(Configuration const &Cnf)
    return Score;
 }
 
-string rpmSystem::DistroVer(Configuration const &Cnf)
+string rpmSystem::DistroVer()
 {
-   string DistroVerPkg = _config->Find("Apt::DistroVerPkg");
-   string DistroVersion;
-
-   if (DistroVerPkg.empty())
-      return DistroVersion;
-
-#if RPM_VERSION >= 0x040100
-   rpmts ts;
-   ts = rpmtsCreate();
-   rpmtsSetVSFlags(ts, (rpmVSFlags_e)-1);
-   rpmtsSetRootDir(ts, NULL);
-   if (rpmtsOpenDB(ts, O_RDONLY))
-      return DistroVersion;
-#else
-   rpmdb DB;
-   string RootDir = _config->Find("RPM::RootDir");
-   const char *RootDirStr = RootDir.empty() ? NULL : RootDir.c_str();
-   if (rpmdbOpen(RootDirStr, &DB, O_RDONLY, 0644))
-      return DistroVersion;
-#endif
-
-   rpmdbMatchIterator iter;
-#if RPM_VERSION >= 0x040100
-   iter = rpmtsInitIterator(ts, (rpmTag)RPMDBI_LABEL, DistroVerPkg.c_str(), 0);
-#else
-   iter = rpmdbInitIterator(DB, RPMDBI_LABEL, DistroVerPkg.c_str(), 0);
-#endif
-   Header hdr;
-   while ((hdr = rpmdbNextIterator(iter)) != NULL) {
-      void *version;
-      int type, count;
-
-      if (headerGetEntry(hdr, RPMTAG_VERSION, &type, &version, &count)) {
-         DistroVersion = (char *)version;
-         headerFreeData(&version, (rpmTagType)type);
-         break;
-      }
+   string DistroVerPkg = _config->Find("APT::DistroVerPkg", "");
+   if (DistroVerPkg.empty() || LockRead() == false)
+      return "";
+
+   string DistroVersion = "";
+   if (RpmDB->JumpByName(DistroVerPkg) == true) {
+      DistroVersion = RpmDB->Version();
+   } else {
+      _error->Error(_("Unable to determine version for package %s"),
+                     DistroVerPkg.c_str());
    }
-   rpmdbFreeIterator(iter);
-#if RPM_VERSION >= 0x040100
-   rpmtsFree(ts);
-#else
-   rpmdbClose(DB);
-#endif
+   UnLock(true);
 
    return DistroVersion;
 }
index 358b7c4..28bff2d 100644 (file)
@@ -59,7 +59,7 @@ class rpmSystem : public pkgSystem
    virtual bool Initialize(Configuration &Cnf);
    virtual bool ArchiveSupported(const char *Type);
    virtual signed Score(Configuration const &Cnf);
-   virtual string DistroVer(Configuration const &Cnf);
+   virtual string DistroVer();
    virtual bool AddStatusFiles(vector<pkgIndexFile *> &List);
    virtual bool AddSourceFiles(vector<pkgIndexFile *> &List);
    virtual bool FindIndex(pkgCache::PkgFileIterator File,