Use strings to identify section types in the on-disk repo format.
Previously, a given razor file type had a fixed number of sections in a
fixed order, identified by an integer type. Now, sections are identified
by a named string (stored in a string pool after the section lists).
This will allow for razor files to contain arbitrary sections.
For bonus points, also drop the 4k section alignment and change the
magic byte string to "RZDB".
committer: Kristian H?gsberg <krh@redhat.com>
2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 #include "razor-internal.h"
29 static struct razor_package_iterator *
30 razor_package_iterator_create_with_index(struct razor_set *set,
33 struct razor_package_iterator *pi;
35 pi = zalloc(sizeof *pi);
42 static struct razor_package_iterator *
43 razor_package_iterator_create_empty(struct razor_set *set)
45 struct razor_package_iterator *pi;
46 return zalloc(sizeof *pi);
49 RAZOR_EXPORT struct razor_package_iterator *
50 razor_package_iterator_create(struct razor_set *set)
52 struct razor_package_iterator *pi;
56 pi = zalloc(sizeof *pi);
58 pi->end = set->packages.data + set->packages.size;
59 pi->package = set->packages.data;
65 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
66 struct razor_set *set,
67 struct razor_property *property)
71 assert (property != NULL);
73 memset(pi, 0, sizeof *pi);
75 pi->index = list_first(&property->packages, &set->package_pool);
78 RAZOR_EXPORT struct razor_package_iterator *
79 razor_package_iterator_create_for_property(struct razor_set *set,
80 struct razor_property *property)
85 assert (property != NULL);
87 index = list_first(&property->packages, &set->package_pool);
88 return razor_package_iterator_create_with_index(set, index);
91 RAZOR_EXPORT struct razor_package_iterator *
92 razor_package_iterator_create_for_file(struct razor_set *set,
95 struct razor_entry *entry;
99 assert (filename != NULL);
101 entry = razor_set_find_entry(set, set->files.data, filename);
103 return razor_package_iterator_create_empty(set);
105 index = list_first(&entry->packages, &set->package_pool);
106 return razor_package_iterator_create_with_index(set, index);
110 * razor_package_iterator_next:
111 * @pi: a %razor_package_iterator
112 * @package: a %razor_package
114 * Gets the next iteratr along with any vararg data.
115 * The vararg must be terminated with %RAZOR_DETAIL_LAST.
117 * Example: razor_package_iterator_next (pi, package,
118 * RAZOR_DETAIL_NAME, &name,
119 * RAZOR_DETAIL_LAST);
122 razor_package_iterator_next(struct razor_package_iterator *pi,
123 struct razor_package **package, ...)
127 struct razor_package *p, *packages;
134 } else if (pi->index) {
135 packages = pi->set->packages.data;
136 p = &packages[pi->index->data];
137 pi->index = list_next(pi->index);
149 va_start(args, NULL);
150 razor_package_get_details_varg (pi->set, p, args);
157 razor_package_iterator_destroy(struct razor_package_iterator *pi)
167 RAZOR_EXPORT struct razor_property_iterator *
168 razor_property_iterator_create(struct razor_set *set,
169 struct razor_package *package)
171 struct razor_property_iterator *pi;
173 assert (set != NULL);
175 pi = zalloc(sizeof *pi);
179 pi->index = list_first(&package->properties,
180 &set->property_pool);
182 pi->property = set->properties.data;
183 pi->end = set->properties.data + set->properties.size;
190 razor_property_iterator_next(struct razor_property_iterator *pi,
191 struct razor_property **property,
194 const char **version)
198 struct razor_property *p, *properties;
205 } else if (pi->index) {
206 properties = pi->set->properties.data;
207 p = &properties[pi->index->data];
208 pi->index = list_next(pi->index);
214 pool = pi->set->string_pool.data;
216 *name = &pool[p->name];
218 *version = &pool[p->version];
227 razor_property_iterator_destroy(struct razor_property_iterator *pi)
232 struct razor_package_query {
233 struct razor_set *set;
238 RAZOR_EXPORT struct razor_package_query *
239 razor_package_query_create(struct razor_set *set)
241 struct razor_package_query *pq;
244 assert (set != NULL);
246 pq = zalloc(sizeof *pq);
248 count = set->packages.size / sizeof(struct razor_package);
249 pq->vector = zalloc(count * sizeof(char));
255 razor_package_query_add_package(struct razor_package_query *pq,
256 struct razor_package *p)
258 struct razor_package *packages;
263 packages = pq->set->packages.data;
264 pq->count += pq->vector[p - packages] ^ 1;
265 pq->vector[p - packages] = 1;
269 razor_package_query_add_iterator(struct razor_package_query *pq,
270 struct razor_package_iterator *pi)
272 struct razor_package *packages, *p;
277 packages = pq->set->packages.data;
278 while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST)) {
279 pq->count += pq->vector[p - packages] ^ 1;
280 pq->vector[p - packages] = 1;
284 RAZOR_EXPORT struct razor_package_iterator *
285 razor_package_query_finish(struct razor_package_query *pq)
287 struct razor_package_iterator *pi;
288 struct razor_set *set;
296 index = zalloc(pq->count * sizeof *index);
300 for (i = 0, j = 0; j < pq->count; i++) {
305 if (j == pq->count - 1)
306 index[j].flags = 0x80;
313 pi = razor_package_iterator_create_with_index(set, index);