]> git.pld-linux.org Git - packages/rpm.git/commitdiff
- replaced hackish trigger with a simple program that tests if BDB auto/th/rpm-5.4.10-0.20
authorJan Rękorajski <baggins@pld-linux.org>
Wed, 19 Sep 2012 12:21:37 +0000 (14:21 +0200)
committerJan Rękorajski <baggins@pld-linux.org>
Wed, 19 Sep 2012 12:21:37 +0000 (14:21 +0200)
  version has changed directly in posttrans
- rel 0.20

rpm.spec
rpmdb_checkversion.c [new file with mode: 0644]

index 72a878306e4af7ce2936c84a191015f810e8af15..b614db31cb6e1f0a341d3e544a7f099ae8bb74c4 100644 (file)
--- 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 (file)
index 0000000..f85a4a7
--- /dev/null
@@ -0,0 +1,93 @@
+#include <sys/types.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <db.h>
+
+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);
+}
This page took 0.250807 seconds and 4 git commands to generate.