Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=36e46fc5c5f7245acb4b9fb71c09ebe925d22952

commit 36e46fc5c5f7245acb4b9fb71c09ebe925d22952
Author: Michel Hermier <herm...@frugalware.org>
Date:   Sat Nov 9 23:09:48 2013 +0100

libpacman: Split out _pacman_db_readpkg of _pacman_db_scan.

diff --git a/lib/libpacman/be_files.c b/lib/libpacman/be_files.c
index bc78a84..dfcb8ac 100644
--- a/lib/libpacman/be_files.c
+++ b/lib/libpacman/be_files.c
@@ -60,6 +60,69 @@ static inline int islocal(pmdb_t *db)
return strcmp(db->treename, "local") == 0;
}

+pmpkg_t *_pacman_db_readpkg(pmdb_t *db, unsigned int inforeq)
+{
+       struct dirent *ent = NULL;
+       struct stat sbuf;
+       char path[PATH_MAX];
+       pmpkg_t *pkg;
+       struct archive_entry *entry = NULL;
+       int isdir = 0;
+
+       ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, NULL));
+
+       while(!isdir) {
+               if (islocal(db)) {
+                       ent = readdir(db->handle);
+                       if(ent == NULL) {
+                               return(NULL);
+                       }
+                       if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, 
"..")) {
+                               isdir = 0;
+                               continue;
+                       }
+                       /* stat the entry, make sure it's a directory */
+                       snprintf(path, PATH_MAX, "%s/%s", db->path, 
ent->d_name);
+                       if(!stat(path, &sbuf) && S_ISDIR(sbuf.st_mode)) {
+                               isdir = 1;
+                       }
+               } else {
+                       if (!db->handle)
+                               _pacman_db_rewind(db);
+                       if (!db->handle || archive_read_next_header(db->handle, 
&entry) != ARCHIVE_OK) {
+                               return NULL;
+                       }
+                       // make sure it's a directory
+                       const char *pathname = archive_entry_pathname(entry);
+                       if (pathname[strlen(pathname)-1] == '/')
+                               isdir = 1;
+               }
+       }
+
+       pkg = _pacman_pkg_new(NULL, NULL);
+       if(pkg == NULL) {
+               return(NULL);
+       }
+       char *dname;
+       if (islocal(db)) {
+               dname = strdup(ent->d_name);
+       } else {
+               dname = strdup(archive_entry_pathname(entry));
+               dname[strlen(dname)-1] = '\0'; // drop trailing slash
+       }
+       if(_pacman_pkg_splitname(dname, pkg->name, pkg->version, 0) == -1) {
+               _pacman_log(PM_LOG_ERROR, _("invalid name for dabatase entry 
'%s'"), dname);
+               FREE(dname);
+               return(NULL);
+       }
+       FREE(dname);
+       if(_pacman_db_read(db, inforeq, pkg) == -1) {
+               FREEPKG(pkg);
+       }
+
+       return(pkg);
+}
+
pmpkg_t *_pacman_db_scan(pmdb_t *db, const char *target, unsigned int inforeq)
{
struct dirent *ent = NULL;
@@ -69,14 +132,9 @@ pmpkg_t *_pacman_db_scan(pmdb_t *db, const char *target, 
unsigned int inforeq)
char *ptr = NULL;
int found = 0;
pmpkg_t *pkg;
-
-       char dbpath[PATH_MAX];
-       snprintf(dbpath, PATH_MAX, "%s" PM_EXT_DB, db->path);
struct archive_entry *entry = NULL;

-       if(db == NULL) {
-               RET_ERR(PM_ERR_DB_NULL, NULL);
-       }
+       ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, NULL));

if(target != NULL) {
// Search from start
@@ -130,35 +188,7 @@ pmpkg_t *_pacman_db_scan(pmdb_t *db, const char *target, 
unsigned int inforeq)
return(NULL);
}
} else {
-               /* normal iteration */
-               int isdir = 0;
-               while(!isdir) {
-                       if (islocal(db)) {
-                               ent = readdir(db->handle);
-                               if(ent == NULL) {
-                                       return(NULL);
-                               }
-                               if(!strcmp(ent->d_name, ".") || 
!strcmp(ent->d_name, "..")) {
-                                       isdir = 0;
-                                       continue;
-                               }
-                               /* stat the entry, make sure it's a directory */
-                               snprintf(path, PATH_MAX, "%s/%s", db->path, 
ent->d_name);
-                               if(!stat(path, &sbuf) && S_ISDIR(sbuf.st_mode)) 
{
-                                       isdir = 1;
-                               }
-                       } else {
-                               if (!db->handle)
-                                       _pacman_db_rewind(db);
-                               if (!db->handle || 
archive_read_next_header(db->handle, &entry) != ARCHIVE_OK) {
-                                       return NULL;
-                               }
-                               // make sure it's a directory
-                               const char *pathname = 
archive_entry_pathname(entry);
-                               if (pathname[strlen(pathname)-1] == '/')
-                                       isdir = 1;
-                       }
-               }
+               return _pacman_db_readpkg(db, inforeq);
}

pkg = _pacman_pkg_new(NULL, NULL);
diff --git a/lib/libpacman/cache.c b/lib/libpacman/cache.c
index cb192c6..5f4ff65 100644
--- a/lib/libpacman/cache.c
+++ b/lib/libpacman/cache.c
@@ -64,7 +64,7 @@ int _pacman_db_load_pkgcache(pmdb_t *db)
inforeq, db->treename);

_pacman_db_rewind(db);
-       while((info = _pacman_db_scan(db, NULL, inforeq)) != NULL) {
+       while((info = _pacman_db_readpkg(db, inforeq)) != NULL) {
info->origin = PKG_FROM_CACHE;
info->data = db;
/* add to the collective */
diff --git a/lib/libpacman/db.h b/lib/libpacman/db.h
index 36fb991..57b10d3 100644
--- a/lib/libpacman/db.h
+++ b/lib/libpacman/db.h
@@ -74,6 +74,7 @@ pmlist_t *_pacman_db_test(pmdb_t *db);
int _pacman_db_open(pmdb_t *db);
int _pacman_db_close(pmdb_t *db);
int _pacman_db_rewind(pmdb_t *db);
+pmpkg_t *_pacman_db_readpkg(pmdb_t *db, unsigned int inforeq);
pmpkg_t *_pacman_db_scan(pmdb_t *db, const char *target, unsigned int inforeq);
int _pacman_db_read(pmdb_t *db, unsigned int inforeq, pmpkg_t *info);
int _pacman_db_write(pmdb_t *db, pmpkg_t *info, unsigned int inforeq);
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to