src/import-rpmdb.c
author Kristian H?gsberg <krh@redhat.com>
Fri Jun 20 23:13:09 2008 -0400 (2008-06-20)
changeset 257 0c3db660514d
parent 247 63444a10fb8e
child 259 5b0601d184ed
permissions -rw-r--r--
When uniquifying properties, also sort them on the owning package.

This ensures that whenever two packages provide or (or require, obsolete
or conflict) the same property, they appear in the same order in the
propertys list of packages.
rhughes@241
     1
/*
rhughes@241
     2
 * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
rhughes@241
     3
 * Copyright (C) 2008  Red Hat, Inc
rhughes@241
     4
 *
rhughes@241
     5
 * This program is free software; you can redistribute it and/or modify
rhughes@241
     6
 * it under the terms of the GNU General Public License as published by
rhughes@241
     7
 * the Free Software Foundation; either version 2 of the License, or
rhughes@241
     8
 * (at your option) any later version.
rhughes@241
     9
 *
rhughes@241
    10
 * This program is distributed in the hope that it will be useful,
rhughes@241
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rhughes@241
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
rhughes@241
    13
 * GNU General Public License for more details.
rhughes@241
    14
 *
rhughes@241
    15
 * You should have received a copy of the GNU General Public License along
rhughes@241
    16
 * with this program; if not, write to the Free Software Foundation, Inc.,
rhughes@241
    17
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
rhughes@241
    18
 */
rhughes@241
    19
rhughes@241
    20
#include <stdio.h>
rhughes@241
    21
#include <stddef.h>
rhughes@241
    22
#include <string.h>
rhughes@241
    23
#include <fcntl.h>
rhughes@241
    24
#include <rpm/rpmlib.h>
rhughes@241
    25
#include <rpm/rpmdb.h>
rhughes@241
    26
rhughes@241
    27
#include "razor.h"
rhughes@241
    28
rhughes@241
    29
union rpm_entry {
rhughes@241
    30
	void *p;
rhughes@241
    31
	char *string;
rhughes@241
    32
	char **list;
rhughes@241
    33
	uint_32 *flags;
rhughes@241
    34
	uint_32 integer;
rhughes@241
    35
};
rhughes@241
    36
krh@247
    37
static uint32_t
krh@247
    38
rpm_to_razor_flags(uint32_t flags)
rhughes@241
    39
{
krh@247
    40
	uint32_t razor_flags;
rhughes@241
    41
krh@247
    42
	razor_flags = 0;
krh@247
    43
	if (flags & RPMSENSE_LESS)
krh@247
    44
		razor_flags |= RAZOR_PROPERTY_LESS;
krh@247
    45
	if (flags & RPMSENSE_EQUAL)
krh@247
    46
		razor_flags |= RAZOR_PROPERTY_EQUAL;
krh@247
    47
	if (flags & RPMSENSE_GREATER)
krh@247
    48
		razor_flags |= RAZOR_PROPERTY_GREATER;
krh@247
    49
krh@247
    50
	if (flags & RPMSENSE_SCRIPT_PRE)
krh@247
    51
		razor_flags |= RAZOR_PROPERTY_PRE;
krh@247
    52
	if (flags & RPMSENSE_SCRIPT_POST)
krh@247
    53
		razor_flags |= RAZOR_PROPERTY_POST;
krh@247
    54
	if (flags & RPMSENSE_SCRIPT_PREUN)
krh@247
    55
		razor_flags |= RAZOR_PROPERTY_PREUN;
krh@247
    56
	if (flags & RPMSENSE_SCRIPT_POSTUN)
krh@247
    57
		razor_flags |= RAZOR_PROPERTY_POSTUN;
krh@247
    58
krh@247
    59
	return razor_flags;
rhughes@241
    60
}
rhughes@241
    61
rhughes@241
    62
static void
rhughes@241
    63
add_properties(struct razor_importer *importer,
krh@247
    64
	       uint32_t type_flags,
rhughes@241
    65
	       Header h, int_32 name_tag, int_32 version_tag, int_32 flags_tag)
rhughes@241
    66
{
rhughes@241
    67
	union rpm_entry names, versions, flags;
rhughes@241
    68
	int_32 i, type, count;
rhughes@241
    69
rhughes@241
    70
	headerGetEntry(h, name_tag, &type, &names.p, &count);
rhughes@241
    71
	headerGetEntry(h, version_tag, &type, &versions.p, &count);
rhughes@241
    72
	headerGetEntry(h, flags_tag, &type, &flags.p, &count);
rhughes@241
    73
rhughes@241
    74
	for (i = 0; i < count; i++)
rhughes@241
    75
		razor_importer_add_property(importer,
rhughes@241
    76
					    names.list[i],
krh@247
    77
					    rpm_to_razor_flags (flags.flags[i]) | type_flags,
krh@247
    78
					    versions.list[i]);
rhughes@241
    79
}
rhughes@241
    80
rhughes@241
    81
struct razor_set *
rhughes@241
    82
razor_set_create_from_rpmdb(void)
rhughes@241
    83
{
rhughes@241
    84
	struct razor_importer *importer;
rhughes@241
    85
	rpmdbMatchIterator iter;
rhughes@241
    86
	Header h;
rhughes@241
    87
	int_32 type, count, i;
rhughes@241
    88
	union rpm_entry name, epoch, version, release, arch;
rhughes@241
    89
	union rpm_entry basenames, dirnames, dirindexes;
rhughes@241
    90
	char filename[PATH_MAX], evr[128], buf[16];
rhughes@241
    91
	rpmdb db;
rhughes@241
    92
rhughes@241
    93
	rpmReadConfigFiles(NULL, NULL);
rhughes@241
    94
rhughes@241
    95
	if (rpmdbOpen("", &db, O_RDONLY, 0644) != 0) {
rhughes@241
    96
		fprintf(stderr, "cannot open rpm database\n");
rhughes@241
    97
		exit(1);
rhughes@241
    98
	}
rhughes@241
    99
krh@249
   100
	importer = razor_importer_create();
rhughes@241
   101
rhughes@241
   102
	iter = rpmdbInitIterator(db, 0, NULL, 0);
rhughes@241
   103
	while (h = rpmdbNextIterator(iter), h != NULL) {
rhughes@241
   104
		headerGetEntry(h, RPMTAG_NAME, &type, &name.p, &count);
rhughes@241
   105
		headerGetEntry(h, RPMTAG_EPOCH, &type, &epoch.p, &count);
rhughes@241
   106
		headerGetEntry(h, RPMTAG_VERSION, &type, &version.p, &count);
rhughes@241
   107
		headerGetEntry(h, RPMTAG_RELEASE, &type, &release.p, &count);
rhughes@241
   108
		headerGetEntry(h, RPMTAG_ARCH, &type, &arch.p, &count);
rhughes@241
   109
rhughes@241
   110
		if (epoch.flags != NULL) {
rhughes@241
   111
			snprintf(buf, sizeof buf, "%u", *epoch.flags);
rhughes@241
   112
			razor_build_evr(evr, sizeof evr,
rhughes@241
   113
					buf, version.string, release.string);
rhughes@241
   114
		} else {
rhughes@241
   115
			razor_build_evr(evr, sizeof evr,
rhughes@241
   116
					NULL, version.string, release.string);
rhughes@241
   117
		}
rhughes@241
   118
rhughes@241
   119
		razor_importer_begin_package(importer,
rhughes@241
   120
					     name.string, evr, arch.string);
rhughes@241
   121
rhughes@241
   122
		add_properties(importer, RAZOR_PROPERTY_REQUIRES, h,
rhughes@241
   123
			       RPMTAG_REQUIRENAME,
rhughes@241
   124
			       RPMTAG_REQUIREVERSION,
rhughes@241
   125
			       RPMTAG_REQUIREFLAGS);
rhughes@241
   126
rhughes@241
   127
		add_properties(importer, RAZOR_PROPERTY_PROVIDES, h,
rhughes@241
   128
			       RPMTAG_PROVIDENAME,
rhughes@241
   129
			       RPMTAG_PROVIDEVERSION,
rhughes@241
   130
			       RPMTAG_PROVIDEFLAGS);
rhughes@241
   131
rhughes@241
   132
		add_properties(importer, RAZOR_PROPERTY_OBSOLETES, h,
rhughes@241
   133
			       RPMTAG_OBSOLETENAME,
rhughes@241
   134
			       RPMTAG_OBSOLETEVERSION,
rhughes@241
   135
			       RPMTAG_OBSOLETEFLAGS);
rhughes@241
   136
rhughes@241
   137
		add_properties(importer, RAZOR_PROPERTY_CONFLICTS, h,
rhughes@241
   138
			       RPMTAG_CONFLICTNAME,
rhughes@241
   139
			       RPMTAG_CONFLICTVERSION,
rhughes@241
   140
			       RPMTAG_CONFLICTFLAGS);
rhughes@241
   141
rhughes@241
   142
		headerGetEntry(h, RPMTAG_BASENAMES, &type,
rhughes@241
   143
			       &basenames.p, &count);
rhughes@241
   144
		headerGetEntry(h, RPMTAG_DIRNAMES, &type,
rhughes@241
   145
			       &dirnames.p, &count);
rhughes@241
   146
		headerGetEntry(h, RPMTAG_DIRINDEXES, &type,
rhughes@241
   147
			       &dirindexes.p, &count);
rhughes@241
   148
		for (i = 0; i < count; i++) {
rhughes@241
   149
			snprintf(filename, sizeof filename, "%s%s",
rhughes@241
   150
				 dirnames.list[dirindexes.flags[i]],
rhughes@241
   151
				 basenames.list[i]);
rhughes@241
   152
			razor_importer_add_file(importer, filename);
rhughes@241
   153
		}
rhughes@241
   154
rhughes@241
   155
		razor_importer_finish_package(importer);
rhughes@241
   156
	}
rhughes@241
   157
rhughes@241
   158
	rpmdbClose(db);
rhughes@241
   159
rhughes@241
   160
	return razor_importer_finish(importer);
rhughes@241
   161
}