summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAllan McRae <allan@archlinux.org>2015-07-14 22:00:38 +1000
committerAllan McRae <allan@archlinux.org>2015-07-15 10:57:30 +1000
commit289fdf0d1d9c88f0c8a6502cc311599c63a04723 (patch)
treed7cdcc73f83ad47ca62dfbf3c2aef4e636fef2ba /lib
parentf6c55b3c3f395839c0973c36b7a7e05984636a61 (diff)
downloadpacman-289fdf0d1d9c88f0c8a6502cc311599c63a04723.tar.xz
Read file lists from databases
If a sync database contains a "files" file, the file list will be read. Currently, there is no known demand for the file list to be lazy loaded by any libalpm frontend, so these files are read whenever present. Lazy loading can be implemented when a demand exists. Signed-off-by: Allan McRae <allan@archlinux.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/libalpm/be_sync.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index a4ba0f79..621321d1 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -40,6 +40,7 @@
#include "delta.h"
#include "deps.h"
#include "dload.h"
+#include "filelist.h"
static char *get_sync_dir(alpm_handle_t *handle)
{
@@ -438,6 +439,7 @@ static size_t estimate_package_count(struct stat *st, struct archive *archive)
/* assume it is at least somewhat compressed */
per_package = 500;
}
+
return (size_t)((st->st_size / per_package) + 1);
}
@@ -470,6 +472,12 @@ static int sync_db_populate(alpm_db_t *db)
}
est_count = estimate_package_count(&buf, archive);
+ /* currently only .files dbs contain file lists - make flexible when required*/
+ if(strcmp(db->handle->dbext, ".files") == 0) {
+ /* files databases are about four times larger on average */
+ est_count /= 4;
+ }
+
db->pkgcache = _alpm_pkghash_create(est_count);
if(db->pkgcache == NULL) {
db->handle->pm_errno = ALPM_ERR_MEMORY;
@@ -600,6 +608,7 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
}
if(strcmp(filename, "desc") == 0 || strcmp(filename, "depends") == 0
+ || strcmp(filename, "files") == 0
|| (strcmp(filename, "deltas") == 0 && db->handle->deltaratio > 0.0) ) {
int ret;
while((ret = _alpm_archive_fgets(archive, &buf)) == ARCHIVE_OK) {
@@ -685,6 +694,33 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
pkg->deltas = alpm_list_add(pkg->deltas,
_alpm_delta_parse(db->handle, line));
}
+ } else if(strcmp(line, "%FILES%") == 0) {
+ /* TODO: this could lazy load if there is future demand */
+ size_t files_count = 0, files_size = 0;
+ alpm_file_t *files = NULL;
+
+ while(1) {
+ if(_alpm_archive_fgets(archive, &buf) != ARCHIVE_OK) {
+ goto error;
+ }
+ line = buf.line;
+ if(_alpm_strip_newline(line, buf.real_line_size) == 0) {
+ break;
+ }
+
+ if(!_alpm_greedy_grow((void **)&files, &files_size,
+ (files_count ? (files_count + 1) * sizeof(alpm_file_t) : 8 * sizeof(alpm_file_t)))) {
+ goto error;
+ }
+ STRDUP(files[files_count].name, line, goto error);
+ files_count++;
+ }
+ /* attempt to hand back any memory we don't need */
+ files = realloc(files, sizeof(alpm_file_t) * files_count);
+ /* make sure the list is sorted */
+ qsort(files, files_count, sizeof(alpm_file_t), _alpm_files_cmp);
+ pkg->files.count = files_count;
+ pkg->files.files = files;
}
}
if(ret != ARCHIVE_EOF) {
@@ -693,8 +729,6 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
*likely_pkg = pkg;
} else if(strcmp(filename, "deltas") == 0) {
/* skip reading delta files if UseDelta is unset */
- } else if(strcmp(filename, "files") == 0) {
- /* currently do nothing with this file */
} else {
/* unknown database file */
_alpm_log(db->handle, ALPM_LOG_DEBUG, "unknown database file: %s\n", filename);