WIP patch for seperate files for filelists and package details
authorJames Bowes <jbowes@redhat.com>
Sun Jun 15 18:16:20 2008 -0400 (2008-06-15)
changeset 229cae6308aa5b1
parent 228 8b9849d1e5b0
child 258 29d5002bd17f
WIP patch for seperate files for filelists and package details
main.c
razor.c
razor.h
     1.1 --- a/main.c	Sun Jun 15 11:21:24 2008 -0400
     1.2 +++ b/main.c	Sun Jun 15 18:16:20 2008 -0400
     1.3 @@ -140,6 +140,7 @@
     1.4  	struct razor_set *set;
     1.5  
     1.6  	set = razor_set_open(repo_filename);
     1.7 +	razor_set_open_files(set, "system-files.repo");
     1.8  	if (set == NULL)
     1.9  		return 1;
    1.10  	razor_set_list_files(set, argv[0]);
    1.11 @@ -157,6 +158,7 @@
    1.12  	const char *name, *version, *arch;
    1.13  
    1.14  	set = razor_set_open(repo_filename);
    1.15 +	razor_set_open_files(set, "system-files.repo");
    1.16  	if (set == NULL)
    1.17  		return 1;
    1.18  
    1.19 @@ -177,6 +179,7 @@
    1.20  	struct razor_set *set;
    1.21  
    1.22  	set = razor_set_open(repo_filename);
    1.23 +	razor_set_open_files(set, "system-files.repo");
    1.24  	if (set == NULL)
    1.25  		return 1;
    1.26  	razor_set_list_package_files(set, argv[0]);
    1.27 @@ -338,7 +341,9 @@
    1.28  	set = razor_set_create_from_yum();
    1.29  	if (set == NULL)
    1.30  		return 1;
    1.31 -	razor_set_write(set, rawhide_repo_filename);
    1.32 +	razor_set_write(set, rawhide_repo_filename, RAZOR_REPO_FILE_MAIN);
    1.33 +	razor_set_write(set, "rawhide-details.repo", RAZOR_REPO_FILE_DETAILS);
    1.34 +	razor_set_write(set, "rawhide-files.repo", RAZOR_REPO_FILE_FILES);
    1.35  	razor_set_destroy(set);
    1.36  	printf("wrote %s\n", rawhide_repo_filename);
    1.37  
    1.38 @@ -353,7 +358,9 @@
    1.39  	set = razor_set_create_from_rpmdb();
    1.40  	if (set == NULL)
    1.41  		return 1;
    1.42 -	razor_set_write(set, repo_filename);
    1.43 +	razor_set_write(set, repo_filename, RAZOR_REPO_FILE_MAIN);
    1.44 +	razor_set_write(set, "system-details.repo", RAZOR_REPO_FILE_DETAILS);
    1.45 +	razor_set_write(set, "system-files.repo", RAZOR_REPO_FILE_FILES);
    1.46  	razor_set_destroy(set);
    1.47  	printf("wrote %s\n", repo_filename);
    1.48  
    1.49 @@ -445,7 +452,7 @@
    1.50  		return 1;
    1.51  
    1.52  	set = razor_transaction_finish(trans);
    1.53 -	razor_set_write(set, updated_repo_filename);
    1.54 +	razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN);
    1.55  	razor_set_destroy(set);
    1.56  	razor_set_destroy(upstream);
    1.57  	printf("wrote system-updated.repo\n");
    1.58 @@ -477,7 +484,7 @@
    1.59  		return 1;
    1.60  
    1.61  	set = razor_transaction_finish(trans);
    1.62 -	razor_set_write(set, updated_repo_filename);
    1.63 +	razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN);
    1.64  	razor_set_destroy(set);
    1.65  	printf("wrote system-updated.repo\n");
    1.66  
    1.67 @@ -564,7 +571,7 @@
    1.68  
    1.69  	set = razor_importer_finish(importer);
    1.70  
    1.71 -	razor_set_write(set, repo_filename);
    1.72 +	razor_set_write(set, repo_filename, RAZOR_REPO_FILE_MAIN);
    1.73  	razor_set_destroy(set);
    1.74  	printf("wrote %s\n", repo_filename);
    1.75  
    1.76 @@ -695,7 +702,7 @@
    1.77  
    1.78  	next = razor_transaction_finish(trans);
    1.79  
    1.80 -	razor_set_write_to_fd(next, fd);
    1.81 +	razor_set_write_to_fd(next, fd, RAZOR_REPO_FILE_MAIN);
    1.82  	printf("wrote %s\n", new_path);
    1.83  
    1.84  	if (mkdir("rpms", 0777) && errno != EEXIST) {
    1.85 @@ -758,7 +765,7 @@
    1.86  	set = razor_set_create();
    1.87  	snprintf(path, sizeof path, "%s%s/%s",
    1.88  		 root, razor_root_path, system_repo_filename);
    1.89 -	if (razor_set_write(set, path) < 0) {
    1.90 +	if (razor_set_write(set, path, RAZOR_REPO_FILE_MAIN) < 0) {
    1.91  		fprintf(stderr, "could not write initial package set\n");
    1.92  		return -1;
    1.93  	}
    1.94 @@ -820,6 +827,7 @@
    1.95  	const char *summary, *description, *url, *license;
    1.96  
    1.97  	set = razor_set_open(repo_filename);
    1.98 +	razor_set_open_details(set, "system-details.repo");
    1.99  	pi = razor_package_iterator_create(set);
   1.100  	while (razor_package_iterator_next(pi, &package,
   1.101  					   &name, &version, &arch)) {
     2.1 --- a/razor.c	Sun Jun 15 11:21:24 2008 -0400
     2.2 +++ b/razor.c	Sun Jun 15 18:16:20 2008 -0400
     2.3 @@ -49,18 +49,22 @@
     2.4  	struct razor_set_section sections[0];
     2.5  };
     2.6  
     2.7 -#define RAZOR_MAGIC 0x7a7a7a7a
     2.8 +#define RAZOR_MAGIC 		0x7a7a7a7a
     2.9 +#define RAZOR_DETAILS_MAGIC 	0x7a7a7a7b
    2.10 +#define RAZOR_FILES_MAGIC 	0x7a7a7a7c
    2.11  #define RAZOR_VERSION 1
    2.12  
    2.13  #define RAZOR_STRING_POOL		0
    2.14  #define RAZOR_PACKAGES			1
    2.15  #define RAZOR_PROPERTIES		2
    2.16 -#define RAZOR_FILES			3
    2.17 -#define RAZOR_PACKAGE_POOL		4
    2.18 -#define RAZOR_PROPERTY_POOL		5
    2.19 -#define RAZOR_FILE_POOL			6
    2.20 -#define RAZOR_FILE_STRING_POOL		7
    2.21 -#define RAZOR_DETAILS_STRING_POOL	8
    2.22 +#define RAZOR_PACKAGE_POOL		3
    2.23 +#define RAZOR_PROPERTY_POOL		4
    2.24 +
    2.25 +#define RAZOR_DETAILS_STRING_POOL	0
    2.26 +
    2.27 +#define RAZOR_FILES			0
    2.28 +#define RAZOR_FILE_POOL			1
    2.29 +#define RAZOR_FILE_STRING_POOL		2
    2.30  
    2.31  struct razor_package {
    2.32  	uint name  : 24;
    2.33 @@ -104,6 +108,8 @@
    2.34  	struct array file_string_pool;
    2.35  	struct array details_string_pool;
    2.36  	struct razor_set_header *header;
    2.37 +	struct razor_set_header *details_header;
    2.38 +	struct razor_set_header *files_header;
    2.39  };
    2.40  
    2.41  struct import_entry {
    2.42 @@ -144,11 +150,17 @@
    2.43  	{ RAZOR_STRING_POOL,		offsetof(struct razor_set, string_pool) },
    2.44  	{ RAZOR_PACKAGES,		offsetof(struct razor_set, packages) },
    2.45  	{ RAZOR_PROPERTIES,		offsetof(struct razor_set, properties) },
    2.46 -	{ RAZOR_FILES,			offsetof(struct razor_set, files) },
    2.47  	{ RAZOR_PACKAGE_POOL,		offsetof(struct razor_set, package_pool) },
    2.48  	{ RAZOR_PROPERTY_POOL,		offsetof(struct razor_set, property_pool) },
    2.49 +};
    2.50 +
    2.51 +struct razor_set_section razor_files_sections[] = {
    2.52 +	{ RAZOR_FILES,			offsetof(struct razor_set, files) },
    2.53  	{ RAZOR_FILE_POOL,		offsetof(struct razor_set, file_pool) },
    2.54  	{ RAZOR_FILE_STRING_POOL,	offsetof(struct razor_set, file_string_pool) },
    2.55 +};
    2.56 +
    2.57 +struct razor_set_section razor_details_sections[] = {
    2.58  	{ RAZOR_DETAILS_STRING_POOL,	offsetof(struct razor_set, details_string_pool) },
    2.59  };
    2.60  
    2.61 @@ -229,11 +241,93 @@
    2.62  		}
    2.63  	}
    2.64  
    2.65 +	if (set->details_header) {
    2.66 +		for (i = 0; set->details_header->sections[i].type; i++)
    2.67 +			;
    2.68 +		size = set->details_header->sections[i].type;
    2.69 +		munmap(set->details_header, size);
    2.70 +	} else {
    2.71 +		for (i = 0; i < ARRAY_SIZE(razor_details_sections); i++) {
    2.72 +			a = (void *) set + razor_details_sections[i].offset;
    2.73 +			free(a->data);
    2.74 +		}
    2.75 +	}
    2.76 +
    2.77 +	if (set->files_header) {
    2.78 +		for (i = 0; set->files_header->sections[i].type; i++)
    2.79 +			;
    2.80 +		size = set->files_header->sections[i].type;
    2.81 +		munmap(set->files_header, size);
    2.82 +	} else {
    2.83 +		for (i = 0; i < ARRAY_SIZE(razor_files_sections); i++) {
    2.84 +			a = (void *) set + razor_files_sections[i].offset;
    2.85 +			free(a->data);
    2.86 +		}
    2.87 +	}
    2.88 +
    2.89  	free(set);
    2.90  }
    2.91  
    2.92 -int
    2.93 -razor_set_write_to_fd(struct razor_set *set, int fd)
    2.94 +void
    2.95 +razor_set_open_details(struct razor_set *set, const char *filename)
    2.96 +{
    2.97 +	struct razor_set_section *s;
    2.98 +	struct stat stat;
    2.99 +	struct array *array;
   2.100 +	int fd;
   2.101 +
   2.102 +	fd = open(filename, O_RDONLY);
   2.103 +	if (fstat(fd, &stat) < 0)
   2.104 +		return;
   2.105 +	set->details_header = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
   2.106 +	if (set->details_header == MAP_FAILED)
   2.107 +		return;
   2.108 +
   2.109 +	for (s = set->details_header->sections; ~s->type; s++) {
   2.110 +		if (s->type >= ARRAY_SIZE(razor_details_sections))
   2.111 +			continue;
   2.112 +		if (s->type != razor_details_sections[s->type].type)
   2.113 +			continue;
   2.114 +		array = (void *) set + razor_details_sections[s->type].offset;
   2.115 +		array->data = (void *) set->details_header + s->offset;
   2.116 +		array->size = s->size;
   2.117 +		array->alloc = s->size;
   2.118 +	}
   2.119 +	close(fd);
   2.120 +}
   2.121 +
   2.122 +void
   2.123 +razor_set_open_files(struct razor_set *set, const char *filename)
   2.124 +{
   2.125 +	struct razor_set_section *s;
   2.126 +	struct stat stat;
   2.127 +	struct array *array;
   2.128 +	int fd;
   2.129 +
   2.130 +	fd = open(filename, O_RDONLY);
   2.131 +	if (fstat(fd, &stat) < 0)
   2.132 +		return;
   2.133 +	set->files_header = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
   2.134 +	if (set->files_header == MAP_FAILED)
   2.135 +		return;
   2.136 +
   2.137 +	for (s = set->files_header->sections; ~s->type; s++) {
   2.138 +		if (s->type >= ARRAY_SIZE(razor_files_sections))
   2.139 +			continue;
   2.140 +		if (s->type != razor_files_sections[s->type].type)
   2.141 +			continue;
   2.142 +		array = (void *) set + razor_files_sections[s->type].offset;
   2.143 +		array->data = (void *) set->files_header + s->offset;
   2.144 +		array->size = s->size;
   2.145 +		array->alloc = s->size;
   2.146 +	}
   2.147 +	close(fd);
   2.148 +}
   2.149 +
   2.150 +static int
   2.151 +razor_set_write_sections_to_fd(struct razor_set *set, int fd, int magic,
   2.152 +			       struct razor_set_section *sections,
   2.153 +			       size_t array_size)
   2.154  {
   2.155  	char data[4096];
   2.156  	struct razor_set_header *header = (struct razor_set_header *) data;
   2.157 @@ -242,14 +336,14 @@
   2.158  	int i;
   2.159  
   2.160  	memset(data, 0, sizeof data);
   2.161 -	header->magic = RAZOR_MAGIC;
   2.162 +	header->magic = magic;
   2.163  	header->version = RAZOR_VERSION;
   2.164  	offset = sizeof data;
   2.165  
   2.166 -	for (i = 0; i < ARRAY_SIZE(razor_sections); i++) {
   2.167 -		if (razor_sections[i].type != i)
   2.168 +	for (i = 0; i < array_size; i++) {
   2.169 +		if (sections[i].type != i)
   2.170  			continue;
   2.171 -		a = (void *) set + razor_sections[i].offset;
   2.172 +		a = (void *) set + sections[i].offset;
   2.173  		header->sections[i].type = i;
   2.174  		header->sections[i].offset = offset;
   2.175  		header->sections[i].size = a->size;
   2.176 @@ -262,10 +356,10 @@
   2.177  
   2.178  	razor_write(fd, data, sizeof data);
   2.179  	memset(data, 0, sizeof data);
   2.180 -	for (i = 0; i < ARRAY_SIZE(razor_sections); i++) {
   2.181 -		if (razor_sections[i].type != i)
   2.182 +	for (i = 0; i < array_size; i++) {
   2.183 +		if (sections[i].type != i)
   2.184  			continue;
   2.185 -		a = (void *) set + razor_sections[i].offset;
   2.186 +		a = (void *) set + sections[i].offset;
   2.187  		razor_write(fd, a->data, a->size);
   2.188  		razor_write(fd, data, ALIGN(a->size, 4096) - a->size);
   2.189  	}
   2.190 @@ -274,7 +368,31 @@
   2.191  }
   2.192  
   2.193  int
   2.194 -razor_set_write(struct razor_set *set, const char *filename)
   2.195 +razor_set_write_to_fd(struct razor_set *set, int fd,
   2.196 +		      enum razor_repo_file_type type)
   2.197 +{
   2.198 +	switch (type) {
   2.199 +	case RAZOR_REPO_FILE_MAIN:
   2.200 +		return razor_set_write_sections_to_fd(set, fd, RAZOR_MAGIC,
   2.201 +						      razor_sections,
   2.202 +						      ARRAY_SIZE(razor_sections));
   2.203 +
   2.204 +	case RAZOR_REPO_FILE_DETAILS:
   2.205 +		return razor_set_write_sections_to_fd(set, fd, RAZOR_DETAILS_MAGIC,
   2.206 +						      razor_details_sections,
   2.207 +						      ARRAY_SIZE(razor_details_sections));
   2.208 +	case RAZOR_REPO_FILE_FILES:
   2.209 +		return razor_set_write_sections_to_fd(set, fd, RAZOR_FILES_MAGIC,
   2.210 +						      razor_files_sections,
   2.211 +						      ARRAY_SIZE(razor_files_sections));
   2.212 +	default:
   2.213 +		return -1;
   2.214 +	}
   2.215 +}
   2.216 +
   2.217 +int
   2.218 +razor_set_write(struct razor_set *set, const char *filename,
   2.219 +		enum razor_repo_file_type type)
   2.220  {
   2.221  	int fd, status;
   2.222  
   2.223 @@ -282,7 +400,7 @@
   2.224  	if (fd < 0)
   2.225  		return -1;
   2.226  
   2.227 -	status = razor_set_write_to_fd(set, fd);
   2.228 +	status = razor_set_write_to_fd(set, fd, type);
   2.229  	if (status) {
   2.230  	    close(fd);
   2.231  	    return status;
     3.1 --- a/razor.h	Sun Jun 15 11:21:24 2008 -0400
     3.2 +++ b/razor.h	Sun Jun 15 18:16:20 2008 -0400
     3.3 @@ -26,6 +26,12 @@
     3.4  struct razor_package;
     3.5  struct razor_property;
     3.6  
     3.7 +enum razor_repo_file_type {
     3.8 +	RAZOR_REPO_FILE_MAIN,
     3.9 +	RAZOR_REPO_FILE_DETAILS,
    3.10 +	RAZOR_REPO_FILE_FILES
    3.11 +};
    3.12 +
    3.13  enum razor_property_type {
    3.14  	RAZOR_PROPERTY_REQUIRES,
    3.15  	RAZOR_PROPERTY_PROVIDES,
    3.16 @@ -45,8 +51,13 @@
    3.17  struct razor_set *razor_set_create(void);
    3.18  struct razor_set *razor_set_open(const char *filename);
    3.19  void razor_set_destroy(struct razor_set *set);
    3.20 -int razor_set_write_to_fd(struct razor_set *set, int fd);
    3.21 -int razor_set_write(struct razor_set *set, const char *filename);
    3.22 +int razor_set_write_to_fd(struct razor_set *set, int fd,
    3.23 +			  enum razor_repo_file_type type);
    3.24 +int razor_set_write(struct razor_set *set, const char *filename,
    3.25 +		    enum razor_repo_file_type type);
    3.26 +
    3.27 +void razor_set_open_details(struct razor_set *set, const char *filename);
    3.28 +void razor_set_open_files(struct razor_set *set, const char *filename);
    3.29  
    3.30  struct razor_package *
    3.31  razor_set_get_package(struct razor_set *set, const char *package);