From: James Bowes Date: Sun, 15 Jun 2008 22:16:20 +0000 (-0400) Subject: WIP patch for seperate files for filelists and package details X-Git-Tag: 0.1~113^2~1 X-Git-Url: http://project.juiblex.co.uk/git/?a=commitdiff_plain;h=08973b4c9c22a4dcbed220daa38fcf510ba9146d;p=razor.git WIP patch for seperate files for filelists and package details --- diff --git a/main.c b/main.c index 060c335..5eed6d4 100644 --- a/main.c +++ b/main.c @@ -140,6 +140,7 @@ command_list_files(int argc, const char *argv[]) struct razor_set *set; set = razor_set_open(repo_filename); + razor_set_open_files(set, "system-files.repo"); if (set == NULL) return 1; razor_set_list_files(set, argv[0]); @@ -157,6 +158,7 @@ command_list_file_packages(int argc, const char *argv[]) const char *name, *version, *arch; set = razor_set_open(repo_filename); + razor_set_open_files(set, "system-files.repo"); if (set == NULL) return 1; @@ -177,6 +179,7 @@ command_list_package_files(int argc, const char *argv[]) struct razor_set *set; set = razor_set_open(repo_filename); + razor_set_open_files(set, "system-files.repo"); if (set == NULL) return 1; razor_set_list_package_files(set, argv[0]); @@ -338,7 +341,9 @@ command_import_yum(int argc, const char *argv[]) set = razor_set_create_from_yum(); if (set == NULL) return 1; - razor_set_write(set, rawhide_repo_filename); + razor_set_write(set, rawhide_repo_filename, RAZOR_REPO_FILE_MAIN); + razor_set_write(set, "rawhide-details.repo", RAZOR_REPO_FILE_DETAILS); + razor_set_write(set, "rawhide-files.repo", RAZOR_REPO_FILE_FILES); razor_set_destroy(set); printf("wrote %s\n", rawhide_repo_filename); @@ -353,7 +358,9 @@ command_import_rpmdb(int argc, const char *argv[]) set = razor_set_create_from_rpmdb(); if (set == NULL) return 1; - razor_set_write(set, repo_filename); + razor_set_write(set, repo_filename, RAZOR_REPO_FILE_MAIN); + razor_set_write(set, "system-details.repo", RAZOR_REPO_FILE_DETAILS); + razor_set_write(set, "system-files.repo", RAZOR_REPO_FILE_FILES); razor_set_destroy(set); printf("wrote %s\n", repo_filename); @@ -445,7 +452,7 @@ command_update(int argc, const char *argv[]) return 1; set = razor_transaction_finish(trans); - razor_set_write(set, updated_repo_filename); + razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN); razor_set_destroy(set); razor_set_destroy(upstream); printf("wrote system-updated.repo\n"); @@ -477,7 +484,7 @@ command_remove(int argc, const char *argv[]) return 1; set = razor_transaction_finish(trans); - razor_set_write(set, updated_repo_filename); + razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN); razor_set_destroy(set); printf("wrote system-updated.repo\n"); @@ -564,7 +571,7 @@ command_import_rpms(int argc, const char *argv[]) set = razor_importer_finish(importer); - razor_set_write(set, repo_filename); + razor_set_write(set, repo_filename, RAZOR_REPO_FILE_MAIN); razor_set_destroy(set); printf("wrote %s\n", repo_filename); @@ -695,7 +702,7 @@ command_install(int argc, const char *argv[]) next = razor_transaction_finish(trans); - razor_set_write_to_fd(next, fd); + razor_set_write_to_fd(next, fd, RAZOR_REPO_FILE_MAIN); printf("wrote %s\n", new_path); if (mkdir("rpms", 0777) && errno != EEXIST) { @@ -758,7 +765,7 @@ command_init(int argc, const char *argv[]) set = razor_set_create(); snprintf(path, sizeof path, "%s%s/%s", root, razor_root_path, system_repo_filename); - if (razor_set_write(set, path) < 0) { + if (razor_set_write(set, path, RAZOR_REPO_FILE_MAIN) < 0) { fprintf(stderr, "could not write initial package set\n"); return -1; } @@ -820,6 +827,7 @@ command_info(int argc, const char *argv[]) const char *summary, *description, *url, *license; set = razor_set_open(repo_filename); + razor_set_open_details(set, "system-details.repo"); pi = razor_package_iterator_create(set); while (razor_package_iterator_next(pi, &package, &name, &version, &arch)) { diff --git a/razor.c b/razor.c index 0fd9780..43611b4 100644 --- a/razor.c +++ b/razor.c @@ -49,18 +49,22 @@ struct razor_set_header { struct razor_set_section sections[0]; }; -#define RAZOR_MAGIC 0x7a7a7a7a +#define RAZOR_MAGIC 0x7a7a7a7a +#define RAZOR_DETAILS_MAGIC 0x7a7a7a7b +#define RAZOR_FILES_MAGIC 0x7a7a7a7c #define RAZOR_VERSION 1 #define RAZOR_STRING_POOL 0 #define RAZOR_PACKAGES 1 #define RAZOR_PROPERTIES 2 -#define RAZOR_FILES 3 -#define RAZOR_PACKAGE_POOL 4 -#define RAZOR_PROPERTY_POOL 5 -#define RAZOR_FILE_POOL 6 -#define RAZOR_FILE_STRING_POOL 7 -#define RAZOR_DETAILS_STRING_POOL 8 +#define RAZOR_PACKAGE_POOL 3 +#define RAZOR_PROPERTY_POOL 4 + +#define RAZOR_DETAILS_STRING_POOL 0 + +#define RAZOR_FILES 0 +#define RAZOR_FILE_POOL 1 +#define RAZOR_FILE_STRING_POOL 2 struct razor_package { uint name : 24; @@ -104,6 +108,8 @@ struct razor_set { struct array file_string_pool; struct array details_string_pool; struct razor_set_header *header; + struct razor_set_header *details_header; + struct razor_set_header *files_header; }; struct import_entry { @@ -144,11 +150,17 @@ struct razor_set_section razor_sections[] = { { RAZOR_STRING_POOL, offsetof(struct razor_set, string_pool) }, { RAZOR_PACKAGES, offsetof(struct razor_set, packages) }, { RAZOR_PROPERTIES, offsetof(struct razor_set, properties) }, - { RAZOR_FILES, offsetof(struct razor_set, files) }, { RAZOR_PACKAGE_POOL, offsetof(struct razor_set, package_pool) }, { RAZOR_PROPERTY_POOL, offsetof(struct razor_set, property_pool) }, +}; + +struct razor_set_section razor_files_sections[] = { + { RAZOR_FILES, offsetof(struct razor_set, files) }, { RAZOR_FILE_POOL, offsetof(struct razor_set, file_pool) }, { RAZOR_FILE_STRING_POOL, offsetof(struct razor_set, file_string_pool) }, +}; + +struct razor_set_section razor_details_sections[] = { { RAZOR_DETAILS_STRING_POOL, offsetof(struct razor_set, details_string_pool) }, }; @@ -229,11 +241,93 @@ razor_set_destroy(struct razor_set *set) } } + if (set->details_header) { + for (i = 0; set->details_header->sections[i].type; i++) + ; + size = set->details_header->sections[i].type; + munmap(set->details_header, size); + } else { + for (i = 0; i < ARRAY_SIZE(razor_details_sections); i++) { + a = (void *) set + razor_details_sections[i].offset; + free(a->data); + } + } + + if (set->files_header) { + for (i = 0; set->files_header->sections[i].type; i++) + ; + size = set->files_header->sections[i].type; + munmap(set->files_header, size); + } else { + for (i = 0; i < ARRAY_SIZE(razor_files_sections); i++) { + a = (void *) set + razor_files_sections[i].offset; + free(a->data); + } + } + free(set); } -int -razor_set_write_to_fd(struct razor_set *set, int fd) +void +razor_set_open_details(struct razor_set *set, const char *filename) +{ + struct razor_set_section *s; + struct stat stat; + struct array *array; + int fd; + + fd = open(filename, O_RDONLY); + if (fstat(fd, &stat) < 0) + return; + set->details_header = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (set->details_header == MAP_FAILED) + return; + + for (s = set->details_header->sections; ~s->type; s++) { + if (s->type >= ARRAY_SIZE(razor_details_sections)) + continue; + if (s->type != razor_details_sections[s->type].type) + continue; + array = (void *) set + razor_details_sections[s->type].offset; + array->data = (void *) set->details_header + s->offset; + array->size = s->size; + array->alloc = s->size; + } + close(fd); +} + +void +razor_set_open_files(struct razor_set *set, const char *filename) +{ + struct razor_set_section *s; + struct stat stat; + struct array *array; + int fd; + + fd = open(filename, O_RDONLY); + if (fstat(fd, &stat) < 0) + return; + set->files_header = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (set->files_header == MAP_FAILED) + return; + + for (s = set->files_header->sections; ~s->type; s++) { + if (s->type >= ARRAY_SIZE(razor_files_sections)) + continue; + if (s->type != razor_files_sections[s->type].type) + continue; + array = (void *) set + razor_files_sections[s->type].offset; + array->data = (void *) set->files_header + s->offset; + array->size = s->size; + array->alloc = s->size; + } + close(fd); +} + +static int +razor_set_write_sections_to_fd(struct razor_set *set, int fd, int magic, + struct razor_set_section *sections, + size_t array_size) { char data[4096]; struct razor_set_header *header = (struct razor_set_header *) data; @@ -242,14 +336,14 @@ razor_set_write_to_fd(struct razor_set *set, int fd) int i; memset(data, 0, sizeof data); - header->magic = RAZOR_MAGIC; + header->magic = magic; header->version = RAZOR_VERSION; offset = sizeof data; - for (i = 0; i < ARRAY_SIZE(razor_sections); i++) { - if (razor_sections[i].type != i) + for (i = 0; i < array_size; i++) { + if (sections[i].type != i) continue; - a = (void *) set + razor_sections[i].offset; + a = (void *) set + sections[i].offset; header->sections[i].type = i; header->sections[i].offset = offset; header->sections[i].size = a->size; @@ -262,10 +356,10 @@ razor_set_write_to_fd(struct razor_set *set, int fd) razor_write(fd, data, sizeof data); memset(data, 0, sizeof data); - for (i = 0; i < ARRAY_SIZE(razor_sections); i++) { - if (razor_sections[i].type != i) + for (i = 0; i < array_size; i++) { + if (sections[i].type != i) continue; - a = (void *) set + razor_sections[i].offset; + a = (void *) set + sections[i].offset; razor_write(fd, a->data, a->size); razor_write(fd, data, ALIGN(a->size, 4096) - a->size); } @@ -274,7 +368,31 @@ razor_set_write_to_fd(struct razor_set *set, int fd) } int -razor_set_write(struct razor_set *set, const char *filename) +razor_set_write_to_fd(struct razor_set *set, int fd, + enum razor_repo_file_type type) +{ + switch (type) { + case RAZOR_REPO_FILE_MAIN: + return razor_set_write_sections_to_fd(set, fd, RAZOR_MAGIC, + razor_sections, + ARRAY_SIZE(razor_sections)); + + case RAZOR_REPO_FILE_DETAILS: + return razor_set_write_sections_to_fd(set, fd, RAZOR_DETAILS_MAGIC, + razor_details_sections, + ARRAY_SIZE(razor_details_sections)); + case RAZOR_REPO_FILE_FILES: + return razor_set_write_sections_to_fd(set, fd, RAZOR_FILES_MAGIC, + razor_files_sections, + ARRAY_SIZE(razor_files_sections)); + default: + return -1; + } +} + +int +razor_set_write(struct razor_set *set, const char *filename, + enum razor_repo_file_type type) { int fd, status; @@ -282,7 +400,7 @@ razor_set_write(struct razor_set *set, const char *filename) if (fd < 0) return -1; - status = razor_set_write_to_fd(set, fd); + status = razor_set_write_to_fd(set, fd, type); if (status) { close(fd); return status; diff --git a/razor.h b/razor.h index 036285f..c1dbb54 100644 --- a/razor.h +++ b/razor.h @@ -26,6 +26,12 @@ struct razor_set; struct razor_package; struct razor_property; +enum razor_repo_file_type { + RAZOR_REPO_FILE_MAIN, + RAZOR_REPO_FILE_DETAILS, + RAZOR_REPO_FILE_FILES +}; + enum razor_property_type { RAZOR_PROPERTY_REQUIRES, RAZOR_PROPERTY_PROVIDES, @@ -45,8 +51,13 @@ extern const char * const razor_version_relations[]; struct razor_set *razor_set_create(void); struct razor_set *razor_set_open(const char *filename); void razor_set_destroy(struct razor_set *set); -int razor_set_write_to_fd(struct razor_set *set, int fd); -int razor_set_write(struct razor_set *set, const char *filename); +int razor_set_write_to_fd(struct razor_set *set, int fd, + enum razor_repo_file_type type); +int razor_set_write(struct razor_set *set, const char *filename, + enum razor_repo_file_type type); + +void razor_set_open_details(struct razor_set *set, const char *filename); +void razor_set_open_files(struct razor_set *set, const char *filename); struct razor_package * razor_set_get_package(struct razor_set *set, const char *package);