RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 09-Dec-2009 18:52:42 Branch: HEAD Handle: 2009120917524101 Modified files: rpm CHANGES rpm/rpmdb rpmdb.c Log: - rpmmi: optimize NVRA range queries using a *RE stem. Summary: Revision Changes Path 1.3190 +1 -0 rpm/CHANGES 1.353 +28 -65 rpm/rpmdb/rpmdb.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.3189 -r1.3190 CHANGES --- rpm/CHANGES 9 Dec 2009 03:59:57 -0000 1.3189 +++ rpm/CHANGES 9 Dec 2009 17:52:41 -0000 1.3190 @@ -1,5 +1,6 @@ 5.2b1 -> 5.3a1 + - jbj: rpmmi: optimize NVRA range queries using a *RE stem. - jbj: rpmdb: inline rpmdbOpenAll for inplace --rebuilddb. sadly DB->associate(..., DB_CREATE) is not free threaded w -fopenmp. oh well. - jbj: rpmts: take checkpoints beroe and after --rebuilddb. @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.c ============================================================================ $ cvs diff -u -r1.352 -r1.353 rpmdb.c --- rpm/rpmdb/rpmdb.c 9 Dec 2009 03:59:57 -0000 1.352 +++ rpm/rpmdb/rpmdb.c 9 Dec 2009 17:52:42 -0000 1.353 @@ -64,8 +64,6 @@ /*...@unchecked@*/ int _rpmdb_debug = 0; -static int _jbj_debug = 0; - /*...@unchecked@*/ static int _rebuildinprogress = 0; @@ -1294,22 +1292,12 @@ return ret; } -static void prtDBT(const char * msg, DBT * kp) -{ - if (msg) fprintf(stderr, "\t%s", msg); - fprintf(stderr, " %p[%u:%u:%u] flags 0x%x\n", - kp->data, (unsigned)kp->size, (unsigned)kp->doff, (unsigned)kp->dlen, - kp->flags); -} - -#ifdef NOTYET -/* Determine if the regular expression specification has any meta characters. */ +/* Return pointer to first RE character (or NUL terminator) */ static const char * stemEnd(const char * s) - /*...@modifies sxp @*/ + /*...@*/ { int c; - /* Return pointer to first RE character (or NUL terminator) */ while ((c = *s)) { switch (c) { case '.': @@ -1337,7 +1325,6 @@ exit: return s; } -#endif /*...@only@*/ static const char * _str2PCREpat(/*...@null@*/ const char *_pre, const char *s, @@ -1351,9 +1338,6 @@ char * t; char * te; - if (_pre == NULL) _pre = "^"; - if (_post == NULL) _post = "(-[^-]+-[^-]+\\.[^.]+|-[^-]+\\.[^.]+|\\.[^.]+|)$"; - /* Find the PCRE pattern length, including escapes. */ for (se = s; *se != '\0'; se++, nt++) if (strchr(_REchars, *se)) nt++; @@ -1367,8 +1351,6 @@ te = stpcpy(te, _post); *te = '\0'; -if (_jbj_debug) -fprintf(stderr, "<-- %s(\"%s\") ret \"%s\"\n", __FUNCTION__, s, t); return t; } @@ -1377,15 +1359,14 @@ { DBC * dbcursor = NULL; DBT k = DBT_INIT; -#ifdef NOTYET - DBT fk; -#endif DBT p = DBT_INIT; DBT v = DBT_INIT; dbiIndex dbi; miRE mire = NULL; -uint32_t _flags = DB_NEXT; -dbiIndexSet set = NULL; + uint32_t _flags = DB_NEXT; + dbiIndexSet set = NULL; + const char * b = NULL; + size_t nb = 0; int ret = 1; /* assume error */ int rc; int xx; @@ -1395,10 +1376,6 @@ goto exit; if (pat) { - const char * b = pat; -#ifdef NOTYET - const char * be; -#endif mire = mireNew(mode, 0); xx = mireRegcomp(mire, pat); @@ -1407,22 +1384,20 @@ default: break; case RPMMIRE_PCRE: -#ifdef NOTYET - if (*b == '^') k.doff = 1; - be = stemEnd(b + k.doff); + b = pat; + if (*b == '^') b++; + nb = stemEnd(b) - b; /* If partial match on stem won't help, just iterate. */ - if (be == (b + k.doff)) { + if (nb == 0) { k.doff = 0; goto doit; } /* Set stem length for partial match retrieve. */ - k.dlen = (be - b) - k.doff; k.flags = DB_DBT_PARTIAL; + k.dlen = nb; + k.size = nb; k.data = (void *) b; - _flags = DB_SET; -#else - goto doit; -#endif + _flags = DB_SET_RANGE; break; case RPMMIRE_STRCMP: k.size = (UINT32_T) strlen(b); @@ -1430,37 +1405,33 @@ _flags = DB_SET; break; } -if (_jbj_debug) prtDBT("k", &k); } doit: + p.flags |= DB_DBT_PARTIAL; + v.flags |= DB_DBT_PARTIAL; + xx = dbiCopen(dbi, dbiTxnid(dbi), &dbcursor, 0); /* Iterate over all keys, collecting primary keys. */ while ((rc = dbiPget(dbi, dbcursor, &k, &p, &v, _flags)) == 0) { uint32_t hdrNum; -unsigned ix; if (_flags == DB_SET) _flags = DB_NEXT_DUP; + if (b != NULL && nb > 0) { + /* Exit if the stem doesn't match. */ + if (k.size < nb || memcmp(b, k.data, nb)) + break; + /* Retrieve the full record. */ + memset (&k, 0, sizeof(k)); + xx = dbiPget(dbi, dbcursor, &k, &p, &v, DB_CURRENT); + _flags = DB_NEXT; + } -if (_jbj_debug) prtDBT("k", &k); -if (_jbj_debug) prtDBT("p", &p); -if (_jbj_debug) prtDBT("v", &v); - + /* Apply pattern to the key. */ if (mire) { - const char * s; - size_t ns; - -#ifdef NOTYET - /* Retrieve the full match key. */ - memset (&fk, 0, sizeof(fk)); - xx = dbiPget(dbi, dbcursor, &fk, &p, &v, DB_CURRENT); - s = (const char * ) fk.data; - ns = fk.size; -#else - s = (const char * ) k.data; - ns = k.size; -#endif + const char * s = (const char * ) k.data; + size_t ns = k.size; /* Skip if not matched. */ if (mireRegexec(mire, s, ns) < 0) @@ -1474,11 +1445,8 @@ /* Append primary package key to set. */ if (set == NULL) set = xcalloc(1, sizeof(*set)); -ix = set->count; /* XXX TODO: sort/uniqify set? */ (void) dbiAppendSet(set, &hdrNum, 1, sizeof(hdrNum), 0); -if (_jbj_debug) -fprintf(stderr, "\tset[%u] = %u\n", ix, dbiIndexRecordOffset(set, ix)); } xx = dbiCclose(dbi, dbcursor, 0); @@ -1496,8 +1464,6 @@ } exit: -if (_jbj_debug) -fprintf(stderr, "<-- %s(%p, %s(%u), %d, \"%s\", %p) rc %d set %p[%u]\n", __FUNCTION__, db, tagName(tag), (unsigned)tag, mode, pat, matches, ret, (set ? set->recs : NULL), (set ? set->count : 0)); if (ret == 0 && matches) { /* XXX TODO: sort/uniqify set? */ *matches = set; @@ -1554,9 +1520,6 @@ } exit: -if (_jbj_debug) -fprintf(stderr, "<-- %s(%p, %p, %p, %p, \"%s\", %p) rc %d set %p[%u]\n", __FUNCTION__, dbi, dbcursor, key, data, NVR, matches, rc, (*matches ? (*matches)->recs : NULL), (*matches ? (*matches)->count : 0)); - /*...@-unqualifiedtrans@*/ /* FIX: double indirection */ if (rc != RPMRC_OK && matches && *matches) *matches = dbiFreeIndexSet(*matches); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org