WIP patch for seperate files for filelists and package details
authorJames Bowes <jbowes@redhat.com>
Sun, 15 Jun 2008 22:16:20 +0000 (18:16 -0400)
committerJames Bowes <jbowes@redhat.com>
Sun, 15 Jun 2008 22:16:20 +0000 (18:16 -0400)
main.c
razor.c
razor.h

diff --git a/main.c b/main.c
index 060c335..5eed6d4 100644 (file)
--- 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 (file)
--- 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 (file)
--- 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);