From: Jan Rękorajski Date: Wed, 19 Sep 2012 12:21:37 +0000 (+0200) Subject: - replaced hackish trigger with a simple program that tests if BDB X-Git-Tag: auto/th/rpm-5.4.10-0.20 X-Git-Url: http://git.pld-linux.org/?p=packages%2Frpm.git;a=commitdiff_plain;h=91ee86a9ffd2451553d65a0e1b419aafb07d38d9 - replaced hackish trigger with a simple program that tests if BDB version has changed directly in posttrans - rel 0.20 --- diff --git a/rpm.spec b/rpm.spec index 72a8783..b614db3 100644 --- a/rpm.spec +++ b/rpm.spec @@ -43,7 +43,7 @@ Summary(ru.UTF-8): Менеджер пакетов от RPM Summary(uk.UTF-8): Менеджер пакетів від RPM Name: rpm Version: 5.4.10 -Release: 0.19 +Release: 0.20 License: LGPL Group: Base # http://rpm5.org/files/rpm/rpm-5.4/rpm-5.4.10-0.20120706.src.rpm @@ -78,6 +78,7 @@ Source22: rpm.noautoreq Source23: rpm.noautoreqdep Source24: rpm.noautoreqfiles Source25: %{name}-php-requires.php +Source26: rpmdb_checkversion.c Patch0: %{name}-branch.patch Patch1: %{name}-man_pl.patch Patch2: %{name}-popt-aliases.patch @@ -846,6 +847,8 @@ install %{SOURCE11} scripts/perl.prov.in # generate Group translations to *.po awk -f %{SOURCE6} %{SOURCE1} +install %{SOURCE26} tools/rpmdb_checkversion.c + %build %{__libtoolize} #%{__autopoint} @@ -902,6 +905,8 @@ sed -i \ %{?with_apidocs:%{__make} apidocs} +%{__cc} %{rpmcflags} tools/rpmdb_checkversion.c -o tools/rpmdb_checkversion -ldb + %install rm -rf $RPM_BUILD_ROOT install -d $RPM_BUILD_ROOT{/bin,/%{_lib},/etc/sysconfig,%{_sysconfdir}/rpm} \ @@ -1062,6 +1067,8 @@ touch $RPM_BUILD_ROOT%{_sysconfdir}/rpm/sysinfo/Obsoletename touch $RPM_BUILD_ROOT%{_sysconfdir}/rpm/sysinfo/Providename touch $RPM_BUILD_ROOT%{_sysconfdir}/rpm/sysinfo/Requirename +install tools/rpmdb_checkversion $RPM_BUILD_ROOT%{_rpmlibdir}/bin + # create macro loading wrappers for backward compatibility for m in gstreamer java mono perl php python; do echo "%%{load:%{_rpmlibdir}/macros.d/$m}" >$RPM_BUILD_ROOT%{_rpmlibdir}/macros.$m @@ -1114,14 +1121,11 @@ if [ -f %{_sysconfdir}/rpm/sysinfo ]; then fi %posttrans -if [ -e /var/lib/rpm/__convert_needed ]; then - %{_rpmlibdir}/bin/dbconvert --rebuilddb - %{__rm} -f /var/lib/rpm/__convert_needed +if [ -x %{_rpmlibdir}/bin/rpmdb_checkversion ] && \ + ! %{_rpmlibdir}/bin/rpmdb_checkversion -h /var/lib/rpm -d /var/lib/rpm ; then + [ -x %{_rpmlibdir}/bin/dbconvert ] && %{_rpmlibdir}/bin/dbconvert --rebuilddb fi -%triggerpostun -- %{name} < 5.4.0-1 -:>/var/lib/rpm/__convert_needed - %triggerpostun -- %{name} < 4.4.9-44 %{_rpmlibdir}/hrmib-cache @@ -1177,6 +1181,7 @@ find %{_rpmlibdir} -name '*-linux' -type l | xargs rm -f %dir %{_rpmlibdir}/bin %attr(755,root,root) %{_rpmlibdir}/bin/dbconvert +%attr(755,root,root) %{_rpmlibdir}/bin/rpmdb_checkversion %files base %defattr(644,root,root,755) diff --git a/rpmdb_checkversion.c b/rpmdb_checkversion.c new file mode 100644 index 0000000..f85a4a7 --- /dev/null +++ b/rpmdb_checkversion.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include + +const char *progname = "rpmdb_checkversion"; /* Program name. */ + +/* + * A very simple program to check for a Berkeley DB environment mismatch. + */ +int +main(int argc, char *argv[]) +{ + extern char *optarg; + extern int optind; + const char *data_dir, *home; + int ch, quiet; + DB_ENV *dbenv; + int ret; + + /* + * All of the shared database files live in home, but + * data files will live in data_dir. + */ + quiet = 0; + home = "/var/lib/rpm"; + data_dir = "/var/lib/rpm"; + while ((ch = getopt(argc, argv, "h:d:q")) != EOF) + switch (ch) { + case 'h': + home = optarg; + break; + case 'd': + data_dir = optarg; + break; + case 'q': + quiet = 1; + break; + case '?': + default: + (void)fprintf(stderr, "usage: %s [-h home] [-d data_dir]\n", progname); + return (0); + } + argc -= optind; + argv += optind; + + if (argc != 0) { + (void)fprintf(stderr, "usage: %s [-h home] [-d data_dir]\n", progname); + return (0); + } + + /* + * Create an environment object and initialize it for error + * reporting. + */ + if ((ret = db_env_create(&dbenv, 0)) != 0) { + if (!quiet) + fprintf(stderr, "%s: %s\n", progname, db_strerror(ret)); + return (0); + } + if (quiet) { + dbenv->set_errfile(dbenv, NULL); + } else { + dbenv->set_errfile(dbenv, stderr); + } + dbenv->set_errpfx(dbenv, progname); + + /* + * We want to specify the shared memory buffer pool cachesize, + * but everything else is the default. + */ + if ((ret = dbenv->set_cachesize(dbenv, 0, 64 * 1024, 0)) != 0) { + dbenv->err(dbenv, ret, "set_cachesize"); + dbenv->close(dbenv, 0); + return (0); + } + + /* Databases are in a subdirectory. */ + (void)dbenv->set_data_dir(dbenv, data_dir); + + /* Open the environment with full transactional support. */ + ret = dbenv->open(dbenv, home, DB_INIT_MPOOL, 0644); + /* Close the environment handle. */ + dbenv->close(dbenv, 0); + + if (ret == DB_VERSION_MISMATCH) { + return (1); + } + + return (0); +}