Add a --salvagedb option to the rpmdb tool

This commit is contained in:
Michael Schroeder 2020-02-03 14:20:19 +01:00 committed by Panu Matilainen
parent 6489957449
commit 243041f5fb
6 changed files with 30 additions and 7 deletions

View File

@ -10,6 +10,7 @@ enum rpmdbFlags {
RPMDB_FLAG_JUSTCHECK = (1 << 0), RPMDB_FLAG_JUSTCHECK = (1 << 0),
RPMDB_FLAG_REBUILD = (1 << 1), RPMDB_FLAG_REBUILD = (1 << 1),
RPMDB_FLAG_VERIFYONLY = (1 << 2), RPMDB_FLAG_VERIFYONLY = (1 << 2),
RPMDB_FLAG_SALVAGE = (1 << 3),
}; };
typedef enum dbCtrlOp_e { typedef enum dbCtrlOp_e {

View File

@ -128,8 +128,11 @@ static int ndb_Open(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int flags)
rpmpkgdb pkgdb = 0; rpmpkgdb pkgdb = 0;
char *path = rstrscat(NULL, dbhome, "/", rdb->db_ops->path, NULL); char *path = rstrscat(NULL, dbhome, "/", rdb->db_ops->path, NULL);
rpmlog(RPMLOG_DEBUG, "opening db index %s mode=0x%x\n", path, rdb->db_mode); rpmlog(RPMLOG_DEBUG, "opening db index %s mode=0x%x\n", path, rdb->db_mode);
rc = rpmpkgOpen(&pkgdb, path, oflags, 0666); if ((rdb->db_flags & RPMDB_FLAG_SALVAGE) == 0)
if (rc && errno == ENOENT) { rc = rpmpkgOpen(&pkgdb, path, oflags, 0666);
else
rc = rpmpkgSalvage(&pkgdb, path);
if (rc && errno == ENOENT && (rdb->db_flags & RPMDB_FLAG_SALVAGE) == 0) {
oflags = O_RDWR|O_CREAT; oflags = O_RDWR|O_CREAT;
dbi->dbi_flags |= DBI_CREATED; dbi->dbi_flags |= DBI_CREATED;
rc = rpmpkgOpen(&pkgdb, path, oflags, 0666); rc = rpmpkgOpen(&pkgdb, path, oflags, 0666);

View File

@ -2479,7 +2479,8 @@ static int rpmdbSetPermissions(char * src, char * dest)
} }
int rpmdbRebuild(const char * prefix, rpmts ts, int rpmdbRebuild(const char * prefix, rpmts ts,
rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg)) rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg),
int rebuildflags)
{ {
rpmdb olddb; rpmdb olddb;
char * dbpath = NULL; char * dbpath = NULL;
@ -2519,7 +2520,9 @@ int rpmdbRebuild(const char * prefix, rpmts ts,
} }
if (openDatabase(prefix, dbpath, &olddb, if (openDatabase(prefix, dbpath, &olddb,
O_RDONLY, 0644, RPMDB_FLAG_REBUILD)) { O_RDONLY, 0644, RPMDB_FLAG_REBUILD |
(rebuildflags & RPMDB_REBUILD_FLAG_SALVAGE ?
RPMDB_FLAG_SALVAGE : 0))) {
rc = 1; rc = 1;
goto exit; goto exit;
} }

View File

@ -23,6 +23,10 @@ extern "C" {
#undef HTKEYTYPE #undef HTKEYTYPE
#undef HTDATATYPE #undef HTDATATYPE
enum rpmdbRebuildFlags_e {
RPMDB_REBUILD_FLAG_SALVAGE = (1 << 0),
};
/** \ingroup rpmdb /** \ingroup rpmdb
* Reference a database instance. * Reference a database instance.
* @param db rpm database * @param db rpm database
@ -63,11 +67,13 @@ int rpmdbClose (rpmdb db);
* @param prefix path to top of install tree * @param prefix path to top of install tree
* @param ts transaction set (or NULL) * @param ts transaction set (or NULL)
* @param (*hdrchk) headerCheck() vector (or NULL) * @param (*hdrchk) headerCheck() vector (or NULL)
* @param rebuildflags flags
* @return 0 on success * @return 0 on success
*/ */
RPM_GNUC_INTERNAL RPM_GNUC_INTERNAL
int rpmdbRebuild(const char * prefix, rpmts ts, int rpmdbRebuild(const char * prefix, rpmts ts,
rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg)); rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg),
int rebuildflags);
/** \ingroup rpmdb /** \ingroup rpmdb
* Verify database components. * Verify database components.

View File

@ -135,17 +135,21 @@ int rpmtsRebuildDB(rpmts ts)
{ {
int rc = -1; int rc = -1;
rpmtxn txn = NULL; rpmtxn txn = NULL;
int rebuildflags = 0;
/* Cannot do this on a populated transaction set */ /* Cannot do this on a populated transaction set */
if (rpmtsNElements(ts) > 0) if (rpmtsNElements(ts) > 0)
return -1; return -1;
if (rpmExpandNumeric("%{?_rebuilddb_salvage}"))
rebuildflags |= RPMDB_REBUILD_FLAG_SALVAGE;
txn = rpmtxnBegin(ts, RPMTXN_WRITE); txn = rpmtxnBegin(ts, RPMTXN_WRITE);
if (txn) { if (txn) {
if (!(ts->vsflags & RPMVSF_NOHDRCHK)) if (!(ts->vsflags & RPMVSF_NOHDRCHK))
rc = rpmdbRebuild(ts->rootDir, ts, headerCheck); rc = rpmdbRebuild(ts->rootDir, ts, headerCheck, rebuildflags);
else else
rc = rpmdbRebuild(ts->rootDir, NULL, NULL); rc = rpmdbRebuild(ts->rootDir, NULL, NULL, rebuildflags);
rpmtxnEnd(txn); rpmtxnEnd(txn);
} }
return rc; return rc;

View File

@ -12,6 +12,7 @@ enum modes {
MODE_VERIFYDB = (1 << 2), MODE_VERIFYDB = (1 << 2),
MODE_EXPORTDB = (1 << 3), MODE_EXPORTDB = (1 << 3),
MODE_IMPORTDB = (1 << 4), MODE_IMPORTDB = (1 << 4),
MODE_SALVAGEDB = (1 << 5),
}; };
static int mode = 0; static int mode = 0;
@ -24,6 +25,8 @@ static struct poptOption dbOptsTable[] = {
NULL}, NULL},
{ "verifydb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR|POPT_ARGFLAG_DOC_HIDDEN), { "verifydb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR|POPT_ARGFLAG_DOC_HIDDEN),
&mode, MODE_VERIFYDB, N_("verify database files"), NULL}, &mode, MODE_VERIFYDB, N_("verify database files"), NULL},
{ "salvagedb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR|POPT_ARGFLAG_DOC_HIDDEN),
&mode, MODE_SALVAGEDB, N_("salvage database"), NULL},
{ "exportdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_EXPORTDB, { "exportdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_EXPORTDB,
N_("export database to stdout header list"), N_("export database to stdout header list"),
NULL}, NULL},
@ -108,8 +111,11 @@ int main(int argc, char *argv[])
ec = rpmtsInitDB(ts, 0644); ec = rpmtsInitDB(ts, 0644);
break; break;
case MODE_REBUILDDB: case MODE_REBUILDDB:
case MODE_SALVAGEDB:
{ rpmVSFlags vsflags = rpmExpandNumeric("%{_vsflags_rebuilddb}"); { rpmVSFlags vsflags = rpmExpandNumeric("%{_vsflags_rebuilddb}");
rpmVSFlags ovsflags = rpmtsSetVSFlags(ts, vsflags); rpmVSFlags ovsflags = rpmtsSetVSFlags(ts, vsflags);
if (mode == MODE_SALVAGEDB)
rpmDefineMacro(NULL, "_rebuilddb_salvage 1", 0);
ec = rpmtsRebuildDB(ts); ec = rpmtsRebuildDB(ts);
rpmtsSetVSFlags(ts, ovsflags); rpmtsSetVSFlags(ts, ovsflags);
} break; } break;