From df023d73e8ea4a282e382977a482a28cacdd5d93 Mon Sep 17 00:00:00 2001 From: jbj Date: Sat, 8 Apr 2000 19:28:08 +0000 Subject: [PATCH] Hash package headers using simple counter. CVS patchset: 3664 CVS date: 2000/04/08 19:28:08 --- lib/db0.c | 6 ++--- lib/db1.c | 6 ++--- lib/db2.c | 6 ++--- lib/db3.c | 59 +++++++++++++++++++++++++++++++----------- lib/dbindex.h | 19 ++++++++------ lib/install.c | 22 +--------------- lib/rpmdb.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++------- lib/uninstall.c | 56 +++------------------------------------- po/rpm.pot | 79 +++++++++++++++++++++++++++------------------------------ 9 files changed, 172 insertions(+), 156 deletions(-) diff --git a/lib/db0.c b/lib/db0.c index 4bd2b49..84aef56 100644 --- a/lib/db0.c +++ b/lib/db0.c @@ -325,7 +325,7 @@ static int db0UpdateIndex(dbiIndex dbi, const char * str, dbiIndexSet set) { } /*@=compmempass@*/ -static int db0del(dbiIndex dbi, void * keyp, size_t keylen) +static int db0del(dbiIndex dbi, void * keyp, size_t keylen, int use_cursor) { DBT key; DB * db = GetDB(dbi); @@ -343,7 +343,7 @@ static int db0del(dbiIndex dbi, void * keyp, size_t keylen) } static int db0get(dbiIndex dbi, void * keyp, size_t keylen, - void ** datap, size_t * datalen) + void ** datap, size_t * datalen, int use_cursor) { DBT key, data; DB * db = GetDB(dbi); @@ -371,7 +371,7 @@ static int db0get(dbiIndex dbi, void * keyp, size_t keylen, } static int db0put(dbiIndex dbi, void * keyp, size_t keylen, - void * datap, size_t datalen) + void * datap, size_t datalen, int use_cursor) { DBT key, data; DB * db = GetDB(dbi); diff --git a/lib/db1.c b/lib/db1.c index 7145ff6..c50351b 100644 --- a/lib/db1.c +++ b/lib/db1.c @@ -327,7 +327,7 @@ static int db1UpdateIndex(dbiIndex dbi, const char * str, dbiIndexSet set) { } /*@=compmempass@*/ -static int db1del(dbiIndex dbi, void * keyp, size_t keylen) +static int db1del(dbiIndex dbi, void * keyp, size_t keylen, int use_cursor) { DBT key; DB * db = GetDB(dbi); @@ -345,7 +345,7 @@ static int db1del(dbiIndex dbi, void * keyp, size_t keylen) } static int db1get(dbiIndex dbi, void * keyp, size_t keylen, - void ** datap, size_t * datalen) + void ** datap, size_t * datalen, int use_cursor) { DBT key, data; DB * db = GetDB(dbi); @@ -373,7 +373,7 @@ static int db1get(dbiIndex dbi, void * keyp, size_t keylen, } static int db1put(dbiIndex dbi, void * keyp, size_t keylen, - void * datap, size_t datalen) + void * datap, size_t datalen, int use_cursor) { DBT key, data; DB * db = GetDB(dbi); diff --git a/lib/db2.c b/lib/db2.c index c408514..fd156e4 100644 --- a/lib/db2.c +++ b/lib/db2.c @@ -433,7 +433,7 @@ static int db2UpdateIndex(dbiIndex dbi, const char * str, dbiIndexSet set) } /*@=compmempass@*/ -static int db2del(dbiIndex dbi, void * keyp, size_t keylen) +static int db2del(dbiIndex dbi, void * keyp, size_t keylen, int use_cursor) { DB_TXN * txnid = NULL; DBT key; @@ -452,7 +452,7 @@ static int db2del(dbiIndex dbi, void * keyp, size_t keylen) } static int db2get(dbiIndex dbi, void * keyp, size_t keylen, - void ** datap, size_t * datalen) + void ** datap, size_t * datalen, int use_cursor) { DB_TXN * txnid = NULL; DBT key, data; @@ -481,7 +481,7 @@ static int db2get(dbiIndex dbi, void * keyp, size_t keylen, } static int db2put(dbiIndex dbi, void * keyp, size_t keylen, - void * datap, size_t datalen) + void * datap, size_t datalen, int use_cursor) { DB_TXN * txnid = NULL; DBT key, data; diff --git a/lib/db3.c b/lib/db3.c index fe33dda..48e6810 100644 --- a/lib/db3.c +++ b/lib/db3.c @@ -373,6 +373,7 @@ static int db3close(dbiIndex dbi, unsigned int flags) if (dbi->dbi_dbcursor) { DBC * dbcursor = (DBC *)dbi->dbi_dbcursor; +fprintf(stderr, "*** explicit dbcursor->c_close\n"); xx = dbcursor->c_close(dbcursor); xx = cvtdberr(dbi, "dbcursor->c_close", xx, _debug); dbi->dbi_dbcursor = NULL; @@ -623,7 +624,7 @@ static int db3UpdateIndex(dbiIndex dbi, const char * str, dbiIndexSet set) } /*@=compmempass@*/ -static int db3del(dbiIndex dbi, void * keyp, size_t keylen) +static int db3del(dbiIndex dbi, void * keyp, size_t keylen, int use_cursor) { DB_TXN * txnid = NULL; DBT key; @@ -643,41 +644,69 @@ fprintf(stderr, "*** db3del(%p, %p,%d) rc %d\n", dbi, keyp, keylen, rc); return rc; } -static int db3get(dbiIndex dbi, void * keyp, size_t keylen, - void ** datap, size_t * datalen) +static int db3get(dbiIndex dbi, void ** keyp, size_t * keylen, + void ** datap, size_t * datalen, int use_cursor) { DB_TXN * txnid = NULL; DBT key, data; DB * db = GetDB(dbi); int _printit; int rc; + int xx; if (datap) *datap = NULL; if (datalen) *datalen = 0; _mymemset(&key, 0, sizeof(key)); _mymemset(&data, 0, sizeof(data)); - key.data = keyp; - key.size = keylen; - data.data = NULL; - data.size = 0; + if (use_cursor) { + DBC * dbcursor; - rc = db->get(db, txnid, &key, &data, 0); - _printit = (rc == DB_NOTFOUND ? 0 : _debug); - rc = cvtdberr(dbi, "db->get", rc, _printit); + if ((dbcursor = dbi->dbi_dbcursor) == NULL) { +#if defined(__USE_DB3) + rc = db->cursor(db, txnid, &dbcursor, 0); +#else + rc = db->cursor(db, txnid, &dbcursor); +#endif + rc = cvtdberr(dbi, "db->cursor", rc, _debug); + if (rc) + return rc; + dbi->dbi_dbcursor = dbcursor; + } + + /* XXX db3 does DB_FIRST on uninitialized cursor */ + rc = dbcursor->c_get(dbcursor, &key, &data, DB_NEXT); + if (rc == DB_NOTFOUND) { + xx = dbcursor->c_close(dbcursor); + xx = cvtdberr(dbi, "dbcursor->c_close", xx, _debug); + dbi->dbi_dbcursor = NULL; + return rc; + } + rc = cvtdberr(dbi, "dbcursor->c_get", rc, _debug); + if (rc == 0) { + *keyp = key.data; + *keylen = key.size; + } + } else { + key.data = *keyp; + key.size = *keylen; + rc = db->get(db, txnid, &key, &data, 0); + _printit = (rc == DB_NOTFOUND ? 0 : _debug); + rc = cvtdberr(dbi, "db->get", rc, _printit); + } if (rc == 0) { - *datap = data.data; - *datalen = data.size; + if (datap) + *datap = data.data; + if (datalen) + *datalen = data.size; } -if (_debug) -fprintf(stderr, "*** db3get(%p, %p,%d, %p,%d) rc %d\n", dbi, keyp, keylen, *datap, *datalen, rc); return rc; } static int db3put(dbiIndex dbi, void * keyp, size_t keylen, - void * datap, size_t datalen) + void * datap, size_t datalen, int use_cursor) { DB_TXN * txnid = NULL; DBT key, data; diff --git a/lib/dbindex.h b/lib/dbindex.h index 6c6d267..daecb4d 100644 --- a/lib/dbindex.h +++ b/lib/dbindex.h @@ -101,19 +101,21 @@ struct _dbiVec { * @param dbi index database handle * @param keyp key data * @param keylen key data length + * @param use_cursor open cursor for access? */ - int (*del) (dbiIndex dbi, void * keyp, size_t keylen); + int (*del) (dbiIndex dbi, void * keyp, size_t keylen, int use_cursor); /** * Retrieve item using db->get. * @param dbi index database handle - * @param keyp key data - * @param keylen key data length + * @param keyp address of key data + * @param keylen address of key data length * @param datap address of data pointer * @param datalen address of data length + * @param use_cursor open cursor for access? */ - int (*get) (dbiIndex dbi, void * keyp, size_t keylen, - void ** datap, size_t * datalen); + int (*get) (dbiIndex dbi, void ** keyp, size_t * keylen, + void ** datap, size_t * datalen, int use_cursor); /** * Save item using db->put. @@ -122,9 +124,10 @@ struct _dbiVec { * @param keylen key data length * @param datap data pointer * @param datalen data length + * @param use_cursor open cursor for access? */ int (*put) (dbiIndex dbi, void * keyp, size_t keylen, - void * datap, size_t datalen); + void * datap, size_t datalen, int use_cursor); }; @@ -145,8 +148,8 @@ struct _dbiIndex { void * dbi_dbenv; void * dbi_dbinfo; void * dbi_dbcursor; - const void * dbi_openinfo; /*pkgs = fadOpen(filename, mode, perms); if (Ferror(db->pkgs)) { @@ -230,6 +232,7 @@ int openDatabase(const char * prefix, const char * dbpath, rpmdb *dbp, } } } + } { int dbix; @@ -333,11 +336,41 @@ void rpmdbClose (rpmdb db) } int rpmdbFirstRecNum(rpmdb db) { + if (db->pkgs == NULL) { + dbiIndex dbi = db->_dbi[RPMDBI_PACKAGES]; + unsigned int offset = 0; + void * keyp = &offset; + size_t keylen = sizeof(offset); + int rc; + + /* XXX skip over instance 0 */ + do { + rc = (*dbi->dbi_vec->get) (dbi, &keyp, &keylen, NULL, NULL, 1); + if (rc) + return 0; + memcpy(&offset, keyp, sizeof(offset)); + } while (offset == 0); + return offset; + } + return fadFirstOffset(db->pkgs); } int rpmdbNextRecNum(rpmdb db, unsigned int lastOffset) { /* 0 at end */ + if (db->pkgs == NULL) { + dbiIndex dbi = db->_dbi[RPMDBI_PACKAGES]; + void * keyp = &lastOffset; + size_t keylen = sizeof(lastOffset); + int rc; + + rc = (*dbi->dbi_vec->get) (dbi, &keyp, &keylen, NULL, NULL, 1); + if (rc) + return 0; + memcpy(&lastOffset, keyp, sizeof(lastOffset)); + return lastOffset; + } + return fadNextOffset(db->pkgs, lastOffset); } @@ -399,15 +432,15 @@ static Header doGetRecord(rpmdb db, unsigned int offset, int pristine) Header rpmdbGetRecord(rpmdb db, unsigned int offset) { - int _use_falloc = rpmExpandNumeric("%{_db3_use_falloc}"); - dbiIndex dbi; - - if (!_use_falloc && (dbi = db->_dbi[RPMDBI_PACKAGES]) != NULL) { + if (db->pkgs == NULL) { + dbiIndex dbi = db->_dbi[RPMDBI_PACKAGES]; void * uh; size_t uhlen; + void * keyp = &offset; + size_t keylen = sizeof(offset); int rc; - rc = (*dbi->dbi_vec->get) (dbi, &offset, sizeof(offset), &uh, &uhlen); + rc = (*dbi->dbi_vec->get) (dbi, &keyp, &keylen, &uh, &uhlen, 0); if (rc) return NULL; return headerLoad(uh); @@ -629,7 +662,7 @@ if (_debug) fprintf(stderr, "*** removing dbix %d tag %d offset 0x%x\n", dbix, dbi->dbi_rpmtag, offset); if (dbi->dbi_rpmtag == 0) { /* XXX TODO: remove h to packages.rpm */ - (void) (*dbi->dbi_vec->del) (dbi, &offset, sizeof(offset)); + (void) (*dbi->dbi_vec->del) (dbi, &offset, sizeof(offset), 0); continue; } @@ -742,6 +775,7 @@ int rpmdbAdd(rpmdb db, Header h) const char ** baseNames; int count = 0; int type; + dbiIndex dbi; unsigned int offset; int rc = 0; @@ -758,7 +792,31 @@ int rpmdbAdd(rpmdb db, Header h) blockSignals(); - { int newSize; + if (db->pkgs == NULL) { + unsigned int firstkey = 0; + void * keyp = &firstkey; + size_t keylen = sizeof(firstkey); + void * datap = NULL; + size_t datalen = 0; + int rc; + + dbi = db->_dbi[RPMDBI_PACKAGES]; + /* Retrieve join key for next header instance. */ + + rc = (*dbi->dbi_vec->get) (dbi, &keyp, &keylen, (void *)&datap, &datalen, 0); + offset = 0; + if (rc == 0 && datap) + memcpy(&offset, datap, sizeof(offset)); + ++offset; + if (datap) { + memcpy(datap, &offset, sizeof(offset)); + } else { + datap = &offset; + datalen = sizeof(offset); + } + rc = (*dbi->dbi_vec->put) (dbi, keyp, keylen, datap, datalen, 0); + } else { + int newSize; newSize = headerSizeof(h, HEADER_MAGIC_NO); offset = fadAlloc(db->pkgs, newSize); if (offset == 0) { @@ -782,7 +840,6 @@ int rpmdbAdd(rpmdb db, Header h) dbiIndexRecord rec = dbiReturnIndexRecordInstance(offset, 0); for (dbix = RPMDBI_MIN; dbix < RPMDBI_MAX; dbix++) { - dbiIndex dbi; const char **rpmvals = NULL; int rpmtype = 0; int rpmcnt = 0; @@ -795,7 +852,7 @@ fprintf(stderr, "*** adding dbix %d tag %d offset 0x%x\n", dbix, dbi->dbi_rpmtag size_t uhlen = headerSizeof(h, HEADER_MAGIC_NO); void * uh = headerUnload(h); /* XXX TODO: add h to packages.rpm */ - (void) (*dbi->dbi_vec->put) (dbi, &offset, sizeof(offset), uh, uhlen); + (void) (*dbi->dbi_vec->put) (dbi, &offset, sizeof(offset), uh, uhlen, 0); free(uh); continue; } diff --git a/lib/uninstall.c b/lib/uninstall.c index 8f52475..c018057 100644 --- a/lib/uninstall.c +++ b/lib/uninstall.c @@ -4,12 +4,10 @@ #include #include /* XXX for rpmExpand */ -#include "dbindex.h" /* XXX prototypes */ -#include "depends.h" +#include "depends.h" /* XXX for headerMatchesDepFlags */ #include "install.h" -#include "md5.h" -#include "misc.h" -#include "rpmdb.h" +#include "misc.h" /* XXX for makeTempFile, doputenv */ +#include "rpmdb.h" /* XXX for rpmdbRemove */ static char * SCRIPT_PATH = "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin"; @@ -100,25 +98,11 @@ int removeBinaryPackage(const char * prefix, rpmdb db, unsigned int offset, * When we run scripts, we pass an argument which is the number of * versions of this package that will be installed when we are finished. */ -#ifdef DYING - { dbiIndexSet matches; - if (rpmdbFindPackage(db, name, &matches)) { - rpmError(RPMERR_DBCORRUPT, _("cannot read packages named %s for uninstall"), - name); - dbiFreeIndexSet(matches); - rc = 1; - goto exit; - } - scriptArg = dbiIndexSetCount(matches) - 1; - dbiFreeIndexSet(matches); - } -#else if ((scriptArg = rpmdbCountPackages(db, name)) < 0) { rc = 1; goto exit; } scriptArg -= 1; -#endif if (!(flags & RPMTRANS_FLAG_NOTRIGGERS)) { /* run triggers from this package which are keyed on installed @@ -505,27 +489,6 @@ static int handleOneTrigger(const char * root, rpmdb db, int sense, Header sourc headerGetEntry(triggeredH, RPMTAG_NAME, NULL, (void **) &triggerPackageName, NULL); -#ifdef DYING - { dbiIndexSet matches = NULL; - int index; - - rpmdbFindPackage(db, triggerPackageName, &matches); - - index = triggerIndices[i]; - if (!triggersAlreadyRun || !triggersAlreadyRun[index]) { - rc = runScript(triggeredH, root, 1, triggerProgs + index, - triggerScripts[index], - dbiIndexSetCount(matches) + arg1correction, arg2, - scriptFd); - if (triggersAlreadyRun) triggersAlreadyRun[index] = 1; - } - - if (matches) { - dbiFreeIndexSet(matches); - matches = NULL; - } - } -#else { int arg1; int index; @@ -542,7 +505,7 @@ static int handleOneTrigger(const char * root, rpmdb db, int sense, Header sourc } } } -#endif + free(triggerScripts); free(triggerProgs); @@ -578,22 +541,11 @@ int runTriggers(const char * root, rpmdb db, int sense, Header h, goto exit; } -#ifdef DYING - { dbiIndexSet otherMatches = NULL; - rpmdbFindPackage(db, packageName, &otherMatches); - if (otherMatches) { - numPackage = dbiIndexSetCount(otherMatches) + countCorrection; - dbiFreeIndexSet(otherMatches); - } else - numPackage = 0; - } -#else numPackage = rpmdbCountPackages(db, packageName); if (numPackage < 0) { rc = 1; goto exit; } -#endif rc = 0; for (i = 0; i < dbiIndexSetCount(matches); i++) { diff --git a/po/rpm.pot b/po/rpm.pot index d99d020..a50696a 100644 --- a/po/rpm.pot +++ b/po/rpm.pot @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2000-04-07 12:18-0400\n" +"POT-Creation-Date: 2000-04-08 15:20-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -2218,7 +2218,7 @@ msgstr "" msgid "(unknown type)" msgstr "" -#: lib/install.c:146 lib/uninstall.c:200 +#: lib/install.c:146 lib/uninstall.c:184 #, c-format msgid " file: %s action: %s\n" msgstr "" @@ -2286,7 +2286,7 @@ msgstr "" msgid "renaming %s to %s\n" msgstr "" -#: lib/install.c:562 lib/install.c:854 lib/uninstall.c:31 +#: lib/install.c:562 lib/install.c:834 lib/uninstall.c:29 #, c-format msgid "rename of %s to %s failed: %s" msgstr "" @@ -2300,25 +2300,25 @@ msgstr "" msgid "package: %s-%s-%s files test = %d\n" msgstr "" -#: lib/install.c:784 +#: lib/install.c:764 msgid "stopping install as we're running --test\n" msgstr "" -#: lib/install.c:789 +#: lib/install.c:769 msgid "running preinstall script (if any)\n" msgstr "" -#: lib/install.c:814 +#: lib/install.c:794 #, c-format msgid "warning: %s created as %s" msgstr "" -#: lib/install.c:850 +#: lib/install.c:830 #, c-format msgid "warning: %s saved as %s" msgstr "" -#: lib/install.c:924 +#: lib/install.c:904 msgid "running postinstall scripts (if any)\n" msgstr "" @@ -2713,7 +2713,7 @@ msgstr "" msgid "display a verbose file listing" msgstr "" -#: lib/rebuilddb.c:34 lib/rpmdb.c:295 +#: lib/rebuilddb.c:34 lib/rpmdb.c:298 msgid "no dbpath has been set" msgstr "" @@ -2868,101 +2868,101 @@ msgstr "" msgid "OK" msgstr "" -#: lib/rpmdb.c:192 +#: lib/rpmdb.c:193 #, c-format msgid "opening database mode 0x%x in %s\n" msgstr "" -#: lib/rpmdb.c:204 lib/url.c:445 +#: lib/rpmdb.c:206 lib/url.c:445 #, c-format msgid "failed to open %s: %s\n" msgstr "" -#: lib/rpmdb.c:218 lib/rpmdb.c:226 +#: lib/rpmdb.c:220 lib/rpmdb.c:228 #, c-format msgid "cannot get %s lock on database" msgstr "" -#: lib/rpmdb.c:219 +#: lib/rpmdb.c:221 msgid "exclusive" msgstr "" -#: lib/rpmdb.c:227 +#: lib/rpmdb.c:229 msgid "shared" msgstr "" -#: lib/rpmdb.c:268 +#: lib/rpmdb.c:271 msgid "" "old format database is present; use --rebuilddb to generate a new format " "database" msgstr "" #. error -#: lib/rpmdb.c:554 +#: lib/rpmdb.c:587 #, c-format msgid "cannot retrieve package \"%s\" from db" msgstr "" -#: lib/rpmdb.c:583 +#: lib/rpmdb.c:616 #, c-format msgid "package not found with key \"%s\" in %s" msgstr "" -#: lib/rpmdb.c:592 +#: lib/rpmdb.c:625 #, c-format msgid "key \"%s\" not found in %s" msgstr "" -#: lib/rpmdb.c:610 +#: lib/rpmdb.c:643 #, c-format msgid "rpmdbRemove: cannot read header at 0x%x" msgstr "" -#: lib/rpmdb.c:638 +#: lib/rpmdb.c:671 #, c-format msgid "removing 0 %s entries.\n" msgstr "" -#: lib/rpmdb.c:644 +#: lib/rpmdb.c:677 #, c-format msgid "removing \"%s\" from %s index.\n" msgstr "" -#: lib/rpmdb.c:652 +#: lib/rpmdb.c:685 #, c-format msgid "removing %d entries in %s index:\n" msgstr "" -#: lib/rpmdb.c:656 lib/rpmdb.c:841 +#: lib/rpmdb.c:689 lib/rpmdb.c:898 #, c-format msgid "\t%6d %s\n" msgstr "" -#: lib/rpmdb.c:774 +#: lib/rpmdb.c:832 msgid "cannot allocate space for database" msgstr "" -#: lib/rpmdb.c:818 +#: lib/rpmdb.c:875 #, c-format msgid "adding 0 %s entries.\n" msgstr "" -#: lib/rpmdb.c:830 +#: lib/rpmdb.c:887 #, c-format msgid "adding \"%s\" to %s index.\n" msgstr "" -#: lib/rpmdb.c:837 +#: lib/rpmdb.c:894 #, c-format msgid "adding %d entries to %s index:\n" msgstr "" -#: lib/rpmdb.c:895 +#: lib/rpmdb.c:952 #, c-format msgid "cannot read header at %d for update" msgstr "" -#: lib/rpmdb.c:908 +#: lib/rpmdb.c:965 msgid "header changed size!" msgstr "" @@ -3382,45 +3382,40 @@ msgstr "" msgid "%s skipped due to missingok flag\n" msgstr "" -#: lib/uninstall.c:42 +#: lib/uninstall.c:40 #, c-format msgid "cannot remove %s - directory not empty" msgstr "" -#: lib/uninstall.c:45 +#: lib/uninstall.c:43 #, c-format msgid "rmdir of %s failed: %s" msgstr "" -#: lib/uninstall.c:53 +#: lib/uninstall.c:51 #, c-format msgid "removal of %s failed: %s" msgstr "" -#: lib/uninstall.c:91 +#: lib/uninstall.c:89 #, c-format msgid "cannot read header at %d for uninstall" msgstr "" -#: lib/uninstall.c:106 -#, c-format -msgid "cannot read packages named %s for uninstall" -msgstr "" - -#: lib/uninstall.c:146 +#: lib/uninstall.c:130 #, c-format msgid "will remove files test = %d\n" msgstr "" -#: lib/uninstall.c:214 +#: lib/uninstall.c:198 msgid "running postuninstall script (if any)\n" msgstr "" -#: lib/uninstall.c:228 +#: lib/uninstall.c:212 msgid "removing database entry\n" msgstr "" -#: lib/uninstall.c:412 +#: lib/uninstall.c:396 msgid "execution of script failed" msgstr "" -- 2.7.4