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: 05-Dec-2009 00:22:52 Branch: HEAD Handle: 2009120423225101 Modified files: rpm CHANGES rpm/rpmdb rpmdb.c Log: - rpmdb: use RPMTAG_NVRA patterns for RPMDBI_LABEL rpmmi iterators. Summary: Revision Changes Path 1.3182 +1 -0 rpm/CHANGES 1.346 +29 -27 rpm/rpmdb/rpmdb.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.3181 -r1.3182 CHANGES --- rpm/CHANGES 4 Dec 2009 18:40:19 -0000 1.3181 +++ rpm/CHANGES 4 Dec 2009 23:22:51 -0000 1.3182 @@ -1,5 +1,6 @@ 5.2b1 -> 5.3a1 + - jbj: rpmdb: use RPMTAG_NVRA patterns for RPMDBI_LABEL rpmmi iterators. - jbj: rpmdb: permit anchored patterns on RPMDBI_LABEL retrieves. strings are escaped and anchored. Still only RPMTAG_NAME, RPMTAG_NVRA next. - jbj: perform checkpoint after every successful transaction. @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.c ============================================================================ $ cvs diff -u -r1.345 -r1.346 rpmdb.c --- rpm/rpmdb/rpmdb.c 4 Dec 2009 18:40:19 -0000 1.345 +++ rpm/rpmdb/rpmdb.c 4 Dec 2009 23:22:52 -0000 1.346 @@ -1283,31 +1283,36 @@ } #endif -static const char * xpatdup(const char * s, size_t ns) +/*...@only@*/ +static const char * _str2PCREpat(/*...@null@*/ const char *_pre, const char *s, + /*...@null@*/ const char *_post) + /*...@*/ { + + static const char _REchars[] = "^.*(|)[]+?{}$"; + size_t nt = 0; + const char * se; char * t; + char * te; - if (s[0] == '^' || s[ns-1] == '$') - t = xstrdup(s); - else { - static const char _REchars[] = "^.*(|)[]+?{}$"; - size_t nt = 0; - const char * se; - char * te; - - for (se = s; *se != '\0'; se++, nt++) - if (strchr(_REchars, *se)) nt++; - - te = t = xmalloc(nt + sizeof("^$")); - *te++ = '^'; - for (se = s; *se != '\0'; *te++ = *se++) - if (strchr(_REchars, *se)) *te++ = '\\'; - *te++ = '$'; - *te = '\0'; - } + 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++; + nt += strlen(_pre) + strlen(_post); + + /* Build the PCRE pattern, escaping characters as needed. */ + te = t = xmalloc(nt + 1); + te = stpcpy(te, _pre); + for (se = s; *se != '\0'; *te++ = *se++) + if (strchr(_REchars, *se)) *te++ = '\\'; + te = stpcpy(te, _post); + *te = '\0'; if (_jbj_debug) -fprintf(stderr, "<-- %s(\"%s\", %u) ret \"%s\"\n", __FUNCTION__, s, ns, t); +fprintf(stderr, "<-- %s(\"%s\") ret \"%s\"\n", __FUNCTION__, s, t); return t; } @@ -1472,15 +1477,12 @@ if (ns == 0) goto exit; - { -#ifdef NOTYET - rpmTag _tag = RPMTAG_NVRA; -#else - rpmTag _tag = RPMTAG_NAME; -#endif + { rpmTag _tag = RPMTAG_NVRA; rpmMireMode _mode = RPMMIRE_PCRE; - const char * _pat = xpatdup(s, ns); /* Add ^...$ *RE anchors. Escape pattern characters. */ + const char * _pat = (s[0] == '^' || s[ns-1] == '$') + ? xstrdup(s) + : _str2PCREpat("^", s, "(-[^-]+-[^-]+|-[^-]+|)\\.[^.]+$"); ret = rpmdbMireKeys(dbi->dbi_rpmdb, _tag, _mode, _pat, matches); _pat = _free(_pat); } @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org