RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [EMAIL PROTECTED]
  Module: rpm                              Date:   24-Sep-2008 05:41:03
  Branch: HEAD                             Handle: 2008092403410300

  Modified files:
    rpm                     CHANGES
    rpm/lib                 psm.c

  Log:
    - jbj: speed up dirname triggers from glob patterns. almost spiffy ...

  Summary:
    Revision    Changes     Path
    1.2572      +1  -0      rpm/CHANGES
    2.323       +40 -15     rpm/lib/psm.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.2571 -r1.2572 CHANGES
  --- rpm/CHANGES       24 Sep 2008 02:58:20 -0000      1.2571
  +++ rpm/CHANGES       24 Sep 2008 03:41:03 -0000      1.2572
  @@ -1,5 +1,6 @@
   
   5.1.0 -> 5.2a0:
  +    - jbj: speed up dirname triggers from glob patterns. almost spiffy ...
       - jbj: rpmdb: add rpmdbMireApply to retrieve primary keys from index.
       - jbj: fire dirname triggers from glob patterns (pig slow, fixing 
todo++).
       - jbj: rpmfi: add storage and getters for exclude/include patterns.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/psm.c
  ============================================================================
  $ cvs diff -u -r2.322 -r2.323 psm.c
  --- rpm/lib/psm.c     23 Sep 2008 20:33:34 -0000      2.322
  +++ rpm/lib/psm.c     24 Sep 2008 03:41:03 -0000      2.323
  @@ -1289,11 +1289,13 @@
       rpmfi fi = psm->fi;
       rpmds triggers = NULL;
       rpmdbMatchIterator mi;
  +    ARGV_t keys = NULL;
       ARGI_t instances = NULL;
       Header sourceH = NULL;
  -    int i;
  +    const char * Name;
       rpmTag tagno;
       rpmRC rc = RPMRC_OK;
  +    int i;
       int xx;
   
   assert(fi->h != NULL);
  @@ -1316,20 +1318,41 @@
       xx = headerGet(fi->h, Ihe, 0);
       if (!(xx && Ihe->p.ui32p && Ihe->c)) goto exit;
   
  +    /* Collect primary trigger keys, expanding globs as needed. */
       triggers = rpmdsInit(triggers);
       if (triggers != NULL)
       while ((i = rpmdsNext(triggers)) >= 0) {
        evrFlags Flags = rpmdsFlags(triggers);
        const char * Name = rpmdsN(triggers);
  +     const char * EVR = rpmdsEVR(triggers);
  +
  +     /* Skip triggers that are not in this context. */
  +     if (!(Flags & psm->sense))
  +         continue;
  +
  +     /* If not limited to NEVRA triggers, use file/dir index. */
  +     if (tagno != RPMTAG_NAME) {
  +         /* XXX if trigger name ends with '/', use dirnames instead. */
  +         if (Name[0] == '/') 
  +             tagno = (Name[strlen(Name)-1] == '/')
  +                     ? RPMTAG_DIRNAMES : RPMTAG_BASENAMES;
  +     }
  +     /* XXX For now, permit globs only in unversioned triggers. */
  +     if ((EVR == NULL || *EVR == '\0') && Glob_pattern_p(Name, 0))
  +         xx = rpmdbMireApply(rpmtsGetRdb(ts), tagno, RPMMIRE_GLOB, Name, 
&keys);
  +     else
  +         xx = argvAdd(&keys, Name);
  +    }
  +    triggers = rpmdsFree(triggers);
  +
  +    /* For all primary keys, retrieve headers and fire triggers. */
  +    if (keys != NULL)
  +    for (i = 0; (Name = keys[i]) != NULL; i++) {
        unsigned prev, instance;
        unsigned nvals;
        int delslash;
        ARGint_t vals;
   
  -     /* Skip triggers that are not in this context. */
  -     if (!(Flags & psm->sense))
  -             continue;
  -     
        /* If not limited to NEVRA triggers, use file/dir index. */
        if (tagno != RPMTAG_NAME) {
            /* XXX if trigger name ends with '/', use dirnames instead. */
  @@ -1337,33 +1360,35 @@
                tagno = (Name[strlen(Name)-1] == '/')
                        ? RPMTAG_DIRNAMES : RPMTAG_BASENAMES;
        }
  +
        delslash = (tagno == RPMTAG_DIRNAMES);
   
  -     if (Glob_pattern_p(Name, 0)) {
  -         mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, NULL, 0);
  -         xx = rpmdbSetIteratorRE(mi, tagno, RPMMIRE_GLOB, Name);
  -     } else {
  -         mi = rpmtsInitIterator(ts, tagno, Name, 0);
  -     }
  +     mi = rpmtsInitIterator(ts, tagno, Name, 0);
   
   if (_jbj)
   fprintf(stderr, "=== runImmedTriggers(%p) indices[%d] %d sense 0x%x %s N %s 
mi %p\n", psm, i, Ihe->p.ui32p[i], psm->sense, tagName(tagno), Name, mi);
   
  +     /* Don't retrieve headers that have already been processed. */
        nvals = argiCount(instances);
        vals = argiData(instances);
        if (nvals > 0)
  -         (void) rpmdbPruneIterator(mi, (int *)vals, nvals, 1);
  +         xx = rpmdbPruneIterator(mi, (int *)vals, nvals, 1);
   
        prev = 0;
        while((sourceH = rpmdbNextIterator(mi)) != NULL) {
  +
  +         /* Skip headers that have already been processed. */
            instance = rpmdbGetIteratorOffset(mi);
            if (prev == instance)
                continue;
  +
            rc |= handleOneTrigger(psm, sourceH, fi->h,
                                rpmdbGetIteratorCount(mi), delslash);
  +
  +         /* Mark header instance as processed. */
            prev = instance;
  -         (void) argiAdd(&instances, -1, instance);
  -         (void) argiSort(instances, NULL);
  +         xx = argiAdd(&instances, -1, instance);
  +         xx = argiSort(instances, NULL);
        }
   
        mi = rpmdbFreeIterator(mi);
  @@ -1371,8 +1396,8 @@
   
   exit:
       instances = argiFree(instances);
  +    keys = argvFree(keys);
       Ihe->p.ptr = _free(Ihe->p.ptr);
  -    triggers = rpmdsFree(triggers);
       return rc;
   }
   
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to