convert db1 -> db2 on-disk format using --rebuilddb.
authorjbj <devnull@localhost>
Thu, 23 Mar 2000 20:58:01 +0000 (20:58 +0000)
committerjbj <devnull@localhost>
Thu, 23 Mar 2000 20:58:01 +0000 (20:58 +0000)
CVS patchset: 3637
CVS date: 2000/03/23 20:58:01

CHANGES
lib/db2.c
lib/db2.h
lib/dbindex.c
lib/rebuilddb.c
po/rpm.pot

diff --git a/CHANGES b/CHANGES
index 7b5af42..9a43285 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,7 @@
        - configure.in fiddles for BSD systems (Patrick Schoo).
        - API: change dbi to pass by reference, not value.
        - cram all of db1, db_185, and db2 interfaces into rpmlib.
+       - convert db1 -> db2 on-disk format using --rebuilddb.
 
 3.0.3 -> 3.0.4
        - use compressed filenames on install side.
index fa5e01f..037133a 100644 (file)
--- a/lib/db2.c
+++ b/lib/db2.c
@@ -1,7 +1,8 @@
 #include "system.h"
 
-#include <db.h>
+static int _debug = 0;
 
+#include <db.h>
 
 #include <rpmlib.h>
 
@@ -49,7 +50,8 @@ static int db_init(dbiIndex dbi, const char *home, int dbflags,
     if (rc)
        goto errxit;
 
-    dbinfo->db_pagesize = 1024;
+    /* XXX W2DO? */
+    dbinfo->db_pagesize = 32 * 1024;
 
     if (dbenvp)
        *dbenvp = dbenv;
@@ -85,10 +87,15 @@ int db2open(dbiIndex dbi)
                ((dbi->dbi_flags & O_CREAT) ? DB_CREATE : 0));
 
     rc = db_init(dbi, dbhome, dbflags, &dbenv, &dbinfo);
+if (_debug)
+fprintf(stderr, "*** db%d db_init rc %d errno %d\n", dbi->dbi_major, rc, errno);
 
-    if (rc == 0)
+    if (rc == 0) {
        rc = db_open(dbi->dbi_file, dbi_to_dbtype(dbi->dbi_type), dbflags,
                        dbi->dbi_perms, dbenv, dbinfo, &db);
+if (_debug)
+fprintf(stderr, "*** db%d db_open rc %d errno %d\n", dbi->dbi_major, rc, errno);
+    }
 
     dbi->dbi_db = db;
     dbi->dbi_dbenv = dbenv;
@@ -112,7 +119,7 @@ int db2open(dbiIndex dbi)
 
 int db2close(dbiIndex dbi, unsigned int flags) {
     DB * db = GetDB(dbi);
-    int rc;
+    int rc, xx;
 
 #if defined(__USE_DB2)
     DB_ENV * dbenv = (DB_ENV *)dbi->dbi_dbenv;
@@ -120,11 +127,15 @@ int db2close(dbiIndex dbi, unsigned int flags) {
     DBC * dbcursor = (DBC *)dbi->dbi_dbcursor;
 
     if (dbcursor) {
-       (void)dbcursor->c_close(dbcursor);
+       xx = dbcursor->c_close(dbcursor);
+if (_debug)
+fprintf(stderr, "*** db%d db->c_close rc %d errno %d\n", dbi->dbi_major, xx, errno);
        dbi->dbi_dbcursor = NULL;
     }
 
     rc = db->close(db, 0);
+if (_debug)
+fprintf(stderr, "*** db%d db->close rc %d errno %d\n", dbi->dbi_major, rc, errno);
     dbi->dbi_db = NULL;
 
     if (dbinfo) {
@@ -132,7 +143,9 @@ int db2close(dbiIndex dbi, unsigned int flags) {
        dbi->dbi_dbinfo = NULL;
     }
     if (dbenv) {
-       (void) db_appexit(dbenv);
+       xx = db_appexit(dbenv);
+if (_debug)
+fprintf(stderr, "*** db%d db_appexit rc %d errno %d\n", dbi->dbi_major, xx, errno);
        free(dbenv);
        dbi->dbi_dbenv = NULL;
     }
@@ -142,13 +155,23 @@ int db2close(dbiIndex dbi, unsigned int flags) {
 
     switch (rc) {
     default:
-    case RET_ERROR:    /* -1 */
        rc = -1;
        break;
-    case RET_SPECIAL:  /* 1 */
+    case DB_INCOMPLETE:
+    case DB_KEYEMPTY:
+    case DB_KEYEXIST:
+    case DB_LOCK_DEADLOCK:
+    case DB_LOCK_NOTGRANTED:
+    case DB_LOCK_NOTHELD:
+    case DB_NOTFOUND:
+    case DB_DELETED:
+    case DB_NEEDSPLIT:
+    case DB_REGISTERED:
+    case DB_SWAPBYTES:
+    case DB_TXN_CKP:
        rc = 1;
        break;
-    case RET_SUCCESS:  /* 0 */
+    case 0:
        rc = 0;
        break;
     }
@@ -162,19 +185,31 @@ int db2sync(dbiIndex dbi, unsigned int flags) {
 
 #if defined(__USE_DB2)
     rc = db->sync(db, flags);
+if (_debug)
+fprintf(stderr, "*** db%d db->sync rc %d errno %d\n", dbi->dbi_major, rc, errno);
 #else
     rc = db->sync(db, flags);
 #endif
 
     switch (rc) {
     default:
-    case RET_ERROR:    /* -1 */
        rc = -1;
        break;
-    case RET_SPECIAL:  /* 1 */
+    case DB_INCOMPLETE:
+    case DB_KEYEMPTY:
+    case DB_KEYEXIST:
+    case DB_LOCK_DEADLOCK:
+    case DB_LOCK_NOTGRANTED:
+    case DB_LOCK_NOTHELD:
+    case DB_NOTFOUND:
+    case DB_DELETED:
+    case DB_NEEDSPLIT:
+    case DB_REGISTERED:
+    case DB_SWAPBYTES:
+    case DB_TXN_CKP:
        rc = 1;
        break;
-    case RET_SUCCESS:  /* 0 */
+    case 0:
        rc = 0;
        break;
     }
@@ -185,7 +220,7 @@ int db2sync(dbiIndex dbi, unsigned int flags) {
 int db2GetFirstKey(dbiIndex dbi, const char ** keyp) {
     DBT key, data;
     DB * db;
-    int rc;
+    int rc, xx;
 
     if (dbi == NULL || dbi->dbi_db == NULL)
        return 1;
@@ -200,10 +235,18 @@ int db2GetFirstKey(dbiIndex dbi, const char ** keyp) {
 #if defined(__USE_DB2)
     {  DBC * dbcursor = NULL;
        rc = db->cursor(db, NULL, &dbcursor);
-       if (rc == 0)
+if (_debug)
+fprintf(stderr, "*** db%d db->cursor rc %d errno %d\n", dbi->dbi_major, rc, errno);
+       if (rc == 0) {
            rc = dbcursor->c_get(dbcursor, &key, &data, DB_FIRST);
-       if (dbcursor)
-           (void)dbcursor->c_close(dbcursor);
+if (_debug)
+fprintf(stderr, "*** db%d dbcursor->c_get rc %d errno %d\n", dbi->dbi_major, rc, errno);
+       }
+       if (dbcursor) {
+           xx = dbcursor->c_close(dbcursor);
+if (_debug)
+fprintf(stderr, "*** db%d dbcursor->c_close rc %d errno %d\n", dbi->dbi_major, xx, errno);
+       }
     }
 #else
     rc = db->seq(db, &key, &data, R_FIRST);
@@ -211,11 +254,21 @@ int db2GetFirstKey(dbiIndex dbi, const char ** keyp) {
 
     switch (rc) {
     default:
-    case RET_ERROR:    /* -1 */
-    case RET_SPECIAL:  /* 1 */
+    case DB_INCOMPLETE:
+    case DB_KEYEMPTY:
+    case DB_KEYEXIST:
+    case DB_LOCK_DEADLOCK:
+    case DB_LOCK_NOTGRANTED:
+    case DB_LOCK_NOTHELD:
+    case DB_NOTFOUND:
+    case DB_DELETED:
+    case DB_NEEDSPLIT:
+    case DB_REGISTERED:
+    case DB_SWAPBYTES:
+    case DB_TXN_CKP:
        rc = 1;
        break;
-    case RET_SUCCESS:  /* 0 */
+    case 0:
        rc = 0;
        if (keyp) {
            char *k = xmalloc(key.size + 1);
@@ -245,19 +298,31 @@ int db2SearchIndex(dbiIndex dbi, const char * str, dbiIndexSet * set) {
 
 #if defined(__USE_DB2)
     rc = db->get(db, NULL, &key, &data, 0);
+if (_debug)
+fprintf(stderr, "*** db%d db->get rc %d errno %d\n", dbi->dbi_major, rc, errno);
 #else
     rc = db->get(db, &key, &data, 0);
 #endif
 
     switch (rc) {
     default:
-    case RET_ERROR:    /* -1 */
        rc = -1;
        break;
-    case RET_SPECIAL:  /* 1 */
+    case DB_INCOMPLETE:
+    case DB_KEYEMPTY:
+    case DB_KEYEXIST:
+    case DB_LOCK_DEADLOCK:
+    case DB_LOCK_NOTGRANTED:
+    case DB_LOCK_NOTHELD:
+    case DB_NOTFOUND:
+    case DB_DELETED:
+    case DB_NEEDSPLIT:
+    case DB_REGISTERED:
+    case DB_SWAPBYTES:
+    case DB_TXN_CKP:
        rc = 1;
        break;
-    case RET_SUCCESS:  /* 0 */
+    case 0:
        rc = 0;
        if (set) {
            *set = dbiCreateIndexSet();
@@ -289,17 +354,29 @@ int db2UpdateIndex(dbiIndex dbi, const char * str, dbiIndexSet set) {
 
 #if defined(__USE_DB2)
        rc = db->put(db, NULL, &key, &data, 0);
+if (_debug)
+fprintf(stderr, "*** db%d db->put rc %d errno %d\n", dbi->dbi_major, rc, errno);
 #else
        rc = db->put(db, &key, &data, 0);
 #endif
 
        switch (rc) {
        default:
-       case RET_ERROR:         /* -1 */
-       case RET_SPECIAL:       /* 1 */
+       case DB_INCOMPLETE:
+       case DB_KEYEMPTY:
+       case DB_KEYEXIST:
+       case DB_LOCK_DEADLOCK:
+       case DB_LOCK_NOTGRANTED:
+       case DB_LOCK_NOTHELD:
+       case DB_NOTFOUND:
+       case DB_DELETED:
+       case DB_NEEDSPLIT:
+       case DB_REGISTERED:
+       case DB_SWAPBYTES:
+       case DB_TXN_CKP:
            rc = 1;
            break;
-       case RET_SUCCESS:       /* 0 */
+       case 0: /* 0 */
            rc = 0;
            break;
        }
@@ -307,17 +384,29 @@ int db2UpdateIndex(dbiIndex dbi, const char * str, dbiIndexSet set) {
 
 #if defined(__USE_DB2)
        rc = db->del(db, NULL, &key, 0);
+if (_debug)
+fprintf(stderr, "*** db%d db->del rc %d errno %d\n", dbi->dbi_major, rc, errno);
 #else
        rc = db->del(db, &key, 0);
 #endif
 
        switch (rc) {
        default:
-       case RET_ERROR:         /* -1 */
-       case RET_SPECIAL:       /* 1 */
+       case DB_INCOMPLETE:
+       case DB_KEYEMPTY:
+       case DB_KEYEXIST:
+       case DB_LOCK_DEADLOCK:
+       case DB_LOCK_NOTGRANTED:
+       case DB_LOCK_NOTHELD:
+       case DB_NOTFOUND:
+       case DB_DELETED:
+       case DB_NEEDSPLIT:
+       case DB_REGISTERED:
+       case DB_SWAPBYTES:
+       case DB_TXN_CKP:
            rc = 1;
            break;
-       case RET_SUCCESS:       /* 0 */
+       case 0:
            rc = 0;
            break;
        }
index eeaff45..978371b 100644 (file)
--- a/lib/db2.h
+++ b/lib/db2.h
@@ -5,10 +5,6 @@
  * Access RPM indices using Berkeley db-2.x API.
  */
 
-#define        RET_ERROR       1
-#define        RET_SUCCESS     0
-#define        RET_SPECIAL     -1
-
 #ifdef __cplusplus
 extern "C" {
 #endif
index 3a49711..8430054 100644 (file)
@@ -1,5 +1,7 @@
 #include "system.h"
 
+static int _debug = 0;
+
 #include <rpmlib.h>
 #include <rpmurl.h>
 
@@ -53,10 +55,31 @@ static void freeDBI( /*@only@*/ /*@null@*/ dbiIndex dbi) {
     }
 }
 
+int prefer_dbi_major = 2;      /* XXX shared with rebuilddb.c */
+int use_dbi_major = -1;
+
+typedef int (*_dbopen) (dbiIndex dbi);
+
+static _dbopen mydbopens[] = {
+#if HAVE_DB1_DB_H
+    db0open,
+#else
+    NULL,
+#endif
+#if HAVE_DB_185_H
+    db1open,
+#else
+    NULL,
+#endif
+    db2open,
+    NULL,
+    NULL
+};
+
 dbiIndex dbiOpenIndex(const char * urlfn, int flags, int perms, DBI_TYPE type) {
     dbiIndex dbi;
     const char * filename;
-    int rc;
+    int rc = 0;
 
     (void) urlPath(urlfn, &filename);
     if (*filename == '\0') {
@@ -70,17 +93,51 @@ dbiIndex dbiOpenIndex(const char * urlfn, int flags, int perms, DBI_TYPE type) {
     dbi->dbi_perms = perms;
     dbi->dbi_type = type;
     dbi->dbi_openinfo = NULL;
-    dbi->dbi_major = 1;
+    dbi->dbi_major = use_dbi_major;
+
+    switch (dbi->dbi_major) {
+    case 3:
+    case 2:
+    case 1:
+    case 0:
+       errno = 0;
+       rc = (*(mydbopens[dbi->dbi_major])) (dbi);
+       if (rc == 0)
+           break;
+       /*@fallthrough@*/
+    case -1:
+       dbi->dbi_major = 4;
+       while (dbi->dbi_major-- > 0) {
+           if (mydbopens[dbi->dbi_major] == NULL)
+               continue;
+           errno = 0;
+           rc = (*(mydbopens[dbi->dbi_major])) (dbi);
+if (_debug)
+fprintf(stderr, "*** loop db%d rc %d errno %d %s\n", dbi->dbi_major, rc, errno, strerror(errno));
+           if (rc == 0)
+               break;
+           if (rc == 1 && dbi->dbi_major == 2) {
+               fprintf(stderr, "*** FIXME: <message about how to convert db>\n");
+               fprintf(stderr, _("\n\
+--> Please run \"rpm --rebuilddb\" as root to convert your database from\n\
+    db1 to db2 on-disk format.\n\
+\n\
+"));
+               dbi->dbi_major--;       /* XXX don't bother with db_185 */
+           }
+       }
+       use_dbi_major = dbi->dbi_major;
+       break;
+    }
 
-    rc = db0open(dbi);
+    if (rc == 0)
+       return dbi;
 
-    if (rc) {
-       freeDBI(dbi);
-       rpmError(RPMERR_DBOPEN, _("cannot open file %s: %s"), urlfn,
+    rpmError(RPMERR_DBOPEN, _("cannot open file %s: %s"), urlfn,
                              strerror(errno));
-       return NULL;
-    }
-    return dbi;
+
+    freeDBI(dbi);
+    return NULL;
 }
 
 int dbiCloseIndex(dbiIndex dbi) {
index e909419..de646bb 100644 (file)
@@ -5,6 +5,9 @@
 
 #include "rpmdb.h"
 
+extern int prefer_dbi_major;   /* XXX shared with rebuilddb.c */
+extern int use_dbi_major;
+
 /** */
 int rpmdbRebuild(const char * rootdir)
 {
@@ -66,14 +69,18 @@ int rpmdbRebuild(const char * rootdir)
        goto exit;
     }
 
-    rpmMessage(RPMMESS_DEBUG, _("opening old database\n"));
+    use_dbi_major = prefer_dbi_major;
+    rpmMessage(RPMMESS_DEBUG, _("opening old database with dbi_major %d\n"),
+               use_dbi_major);
     if (openDatabase(rootdir, dbpath, &olddb, O_RDONLY, 0644, 
                     RPMDB_FLAG_MINIMAL)) {
        rc = 1;
        goto exit;
     }
 
-    rpmMessage(RPMMESS_DEBUG, _("opening new database\n"));
+    use_dbi_major = prefer_dbi_major;
+    rpmMessage(RPMMESS_DEBUG, _("opening new database with dbi_major %d\n"),
+               use_dbi_major);
     if (openDatabase(rootdir, newdbpath, &newdb, O_RDWR | O_CREAT, 0644, 0)) {
        rc = 1;
        goto exit;
index c5d2bf5..7079229 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-03-23 09:14-0500\n"
+"POT-Creation-Date: 2000-03-23 15:52-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1986,27 +1986,35 @@ msgstr ""
 msgid " failed - "
 msgstr ""
 
-#: lib/dbindex.c:63
+#: lib/dbindex.c:86
 #, c-format
 msgid "bad db file %s"
 msgstr ""
 
-#: lib/dbindex.c:79
+#: lib/dbindex.c:121
+msgid ""
+"\n"
+"--> Please run \"rpm --rebuilddb\" as root to convert your database from\n"
+"    db1 to db2 on-disk format.\n"
+"\n"
+msgstr ""
+
+#: lib/dbindex.c:136
 #, c-format
 msgid "cannot open file %s: %s"
 msgstr ""
 
-#: lib/dbindex.c:162
+#: lib/dbindex.c:219
 #, c-format
 msgid "error getting record %s from %s"
 msgstr ""
 
-#: lib/dbindex.c:187
+#: lib/dbindex.c:244
 #, c-format
 msgid "error storing record %s into %s"
 msgstr ""
 
-#: lib/dbindex.c:192
+#: lib/dbindex.c:249
 #, c-format
 msgid "error removing record %s into %s"
 msgstr ""
@@ -2705,72 +2713,74 @@ msgstr ""
 msgid "display a verbose file listing"
 msgstr ""
 
-#: lib/rebuilddb.c:26 lib/rpmdb.c:251
+#: lib/rebuilddb.c:29 lib/rpmdb.c:251
 msgid "no dbpath has been set"
 msgstr ""
 
-#: lib/rebuilddb.c:51
+#: lib/rebuilddb.c:54
 #, c-format
 msgid "rebuilding database %s into %s\n"
 msgstr ""
 
-#: lib/rebuilddb.c:55
+#: lib/rebuilddb.c:58
 #, c-format
 msgid "temporary database %s already exists"
 msgstr ""
 
-#: lib/rebuilddb.c:61
+#: lib/rebuilddb.c:64
 #, c-format
 msgid "creating directory: %s\n"
 msgstr ""
 
-#: lib/rebuilddb.c:63
+#: lib/rebuilddb.c:66
 #, c-format
 msgid "error creating directory %s: %s"
 msgstr ""
 
-#: lib/rebuilddb.c:69
-msgid "opening old database\n"
+#: lib/rebuilddb.c:73
+#, c-format
+msgid "opening old database with dbi_major %d\n"
 msgstr ""
 
-#: lib/rebuilddb.c:76
-msgid "opening new database\n"
+#: lib/rebuilddb.c:82
+#, c-format
+msgid "opening new database with dbi_major %d\n"
 msgstr ""
 
-#: lib/rebuilddb.c:86
+#: lib/rebuilddb.c:93
 #, c-format
 msgid "record number %d in database is bad -- skipping it"
 msgstr ""
 
-#: lib/rebuilddb.c:104
+#: lib/rebuilddb.c:111
 #, c-format
 msgid "duplicated database entry: %s-%s-%s -- skipping."
 msgstr ""
 
-#: lib/rebuilddb.c:116
+#: lib/rebuilddb.c:123
 #, c-format
 msgid "cannot add record originally at %d"
 msgstr ""
 
-#: lib/rebuilddb.c:122
+#: lib/rebuilddb.c:129
 #, c-format
 msgid "record number %d in database is bad -- skipping."
 msgstr ""
 
-#: lib/rebuilddb.c:135
+#: lib/rebuilddb.c:142
 msgid "failed to rebuild database; original database remains in place\n"
 msgstr ""
 
-#: lib/rebuilddb.c:143
+#: lib/rebuilddb.c:150
 msgid "failed to replace old database with new database!\n"
 msgstr ""
 
-#: lib/rebuilddb.c:145
+#: lib/rebuilddb.c:152
 #, c-format
 msgid "replaces files in %s with files from %s to recover"
 msgstr ""
 
-#: lib/rebuilddb.c:151
+#: lib/rebuilddb.c:158
 #, c-format
 msgid "failed to remove directory %s: %s\n"
 msgstr ""