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

Reply via email to