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:   21-Oct-2007 01:22:06
  Branch: HEAD                             Handle: 2007102100220600

  Modified files:
    rpm                     CHANGES
    rpm/rpmdb               header.c

  Log:
    - jbj: start using headerGetExtension under headerSprintf.
    - jbj: prime the tag data cache earlier.

  Summary:
    Revision    Changes     Path
    1.1746      +2  -0      rpm/CHANGES
    1.106       +74 -45     rpm/rpmdb/header.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1745 -r1.1746 CHANGES
  --- rpm/CHANGES       20 Oct 2007 19:48:06 -0000      1.1745
  +++ rpm/CHANGES       20 Oct 2007 23:22:06 -0000      1.1746
  @@ -1,4 +1,6 @@
   4.5 -> 5.0:
  +    - jbj: start using headerGetExtension under headerSprintf.
  +    - jbj: prime the tag data cache earlier.
       - jbj: enable Plan B tag data caching.
       - jbj: grr, Plan B: cache w sprintfTag, not sprintfToken.
       - jbj: use tag data cache.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.c
  ============================================================================
  $ cvs diff -u -r1.105 -r1.106 header.c
  --- rpm/rpmdb/header.c        20 Oct 2007 19:48:06 -0000      1.105
  +++ rpm/rpmdb/header.c        20 Oct 2007 23:22:06 -0000      1.106
  @@ -2430,7 +2430,7 @@
    * Mark a tag container with headerGetEntry() freeData.
    * @param he         tag container
    */
  -static void rpmtcMark(/[EMAIL PROTECTED]@*/ HE_t he)
  +static HE_t rpmheMark(/[EMAIL PROTECTED]@*/ HE_t he)
        /[EMAIL PROTECTED] he @*/
   {
       /* Set he->freeData as appropriate for headerGetEntry() . */
  @@ -2444,14 +2444,14 @@
        he->freeData = 1;
        break;
       }
  -    return;
  +    return he;
   }
   
   /**
    * Clean a tag container, free'ing attached malloc's..
    * @param he         tag container
    */
  -static void rpmtcClean(/[EMAIL PROTECTED]@*/ HE_t he)
  +static HE_t rpmheClean(/[EMAIL PROTECTED]@*/ HE_t he)
        /[EMAIL PROTECTED] he @*/
   {
       if (he) {
  @@ -2462,7 +2462,7 @@
        }
        memset(he, 0, sizeof(*he));
       }
  -    return;
  +    return he;
   }
   
   #ifdef       NOTYET
  @@ -2516,7 +2516,7 @@
       for (i = 0; i < num; i++) {
        switch (format[i].type) {
        case PTOK_TAG:
  -         rpmtcClean(&format[i].u.tag.he);
  +         (void) rpmheClean(&format[i].u.tag.he);
            break;
        case PTOK_ARRAY:
            format[i].u.array.format =
  @@ -2530,7 +2530,7 @@
            format[i].u.cond.elseFormat =
                freeFormat(format[i].u.cond.elseFormat, 
                        format[i].u.cond.numElseTokens);
  -         rpmtcClean(&format[i].u.cond.tag.he);
  +         (void) rpmheClean(&format[i].u.cond.tag.he);
            /[EMAIL PROTECTED]@*/ break;
        case PTOK_NONE:
        case PTOK_STRING:
  @@ -2733,18 +2733,17 @@
        if (hsa->hi == NULL) {
            hsa->i++;
        } else {
  -         HE_t he = &tag->he;
  -         rpmtcClean(he);
  +         HE_t he = rpmheClean(&tag->he);
            if (!headerNextIterator(hsa->hi, &he->tag, &he->t, &he->p, &he->c))
            {
                tag->tagno = 0;
                return NULL;
            }
  -         tag->tagno = he->tag;
  -         rpmtcMark(he);
  +         he = rpmheMark(he);
            he->avail = 1;
   if (_jbj)
   fprintf(stderr, " NEW: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, 
tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, 
he->avail);
  +         tag->tagno = he->tag;
        }
       }
   
  @@ -3586,6 +3585,7 @@
       char * val = NULL;
       size_t need = 0;
       char * t, * te;
  +    int xx;
       
       rpmTagCount countBuf;
   
  @@ -3598,28 +3598,39 @@
            he->c = 1;
            he->t = RPM_STRING_TYPE;    
            he->p.str = "(none)";
  +         he->freeData = 0;
        }
       } else
       if (!he->avail) {
        he->tag = tag->tagno;   /* XXX necessary? */
  -     if (!headerGetEntry(hsa->h, he->tag, &he->t, &he->p, &he->c)) {
  +#ifdef       DYING
  +     xx = headerGetEntry(hsa->h, he->tag, &he->t, &he->p, &he->c);
  +     if (xx)
  +         rpmheMark(he);
  +#else
  +     xx = headerGetExtension(hsa->h, he->tag, &he->t, &he->p, &he->c);
  +     if (xx && he->p.ptr != NULL)
  +         he->freeData = 1;
  +#endif
  +     if (!xx) {
            he->c = 1;
            he->t = RPM_STRING_TYPE;    
            he->p.str = "(none)";
  +         he->freeData = 0;
        }
  -     rpmtcMark(he);
  -     he->avail = 1;
   if (_jbj)
   fprintf(stderr, " NEW: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, 
tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, 
he->avail);
       }
   
       if (tag->arrayCount) {
        countBuf = he->c;
  -     rpmtcClean(he);
  +     he = rpmheClean(he);
        he->t = RPM_INT32_TYPE;
        he->p.i32p = &countBuf;
        he->c = 1;
  +     he->freeData = 0;
       }
  +    he->avail = 1;
   
       if (he->p.ptr)
       switch (he->t) {
  @@ -3691,7 +3702,7 @@
   
   exit:
       if (!_tagcache)
  -     rpmtcClean(he);
  +     he = rpmheClean(he);
   
       if (val && need > 0) {
        if (tag->format && *tag->format && tag->pad) {
  @@ -3728,14 +3739,16 @@
                int element)
        /[EMAIL PROTECTED] hsa @*/
   {
  -    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       char numbuf[64]; /* XXX big enuf for "Tag_0x01234567" */
       char * t, * te;
       int i, j;
       int numElements;
       sprintfToken spft;
  +    sprintfTag tag;
  +    HE_t he;
       int condNumFormats;
       size_t need;
  +    int xx;
   
       /* we assume the token and header have been validated already! */
   
  @@ -3786,40 +3799,54 @@
        spft = token->u.array.format;
        for (i = 0; i < token->u.array.numTokens; i++, spft++)
        {
  -         if (spft->type != PTOK_TAG ||
  -             spft->u.tag.arrayCount ||
  -             spft->u.tag.justOne) continue;
  -
  -         if (spft->u.tag.ext) {
  -             if (getExtension(hsa, spft->u.tag.ext, &he->t, NULL, &he->c, 
  -                              hsa->ec + spft->u.tag.extNum))
  +         tag = &spft->u.tag;
  +         if (spft->type != PTOK_TAG || tag->arrayCount || tag->justOne)
  +             continue;
  +
  +         he = &tag->he;
  +         if (tag->ext) {
  +             if (getExtension(hsa, tag->ext, &he->t, &he->p, &he->c, 
  +                              hsa->ec + tag->extNum))
                     continue;
            } else {
  -             he->tag = spft->u.tag.tagno;
  -             if (!headerGetEntry(hsa->h, he->tag, &he->t, NULL, &he->c))
  +             he->tag = tag->tagno;
  +#ifdef       DYING
  +             xx = headerGetEntry(hsa->h, he->tag, &he->t, &he->p, &he->c);
  +             if (xx)
  +                 he = rpmheMark(he);
  +#else
  +             xx = headerGetExtension(hsa->h, he->tag, &he->t, &he->p, 
&he->c);
  +             if (xx && he->p.ptr != NULL)
  +                 he->freeData = 1;
  +#endif
  +             if (!xx)
                    continue;
  +if (_jbj)
  +fprintf(stderr, " NEW: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, 
tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, 
he->avail);
            } 
   
  -#if !defined(DYING)  /* XXX notyet */
  -         if (he->t == RPM_BIN_TYPE || he->t == RPM_ASN1_TYPE || he->t == 
RPM_OPENPGP_TYPE)
  -             he->c = 1;      /* XXX count abused as no. of bytes. */
  -#endif
  -
  -         if (numElements > 1 && he->c != numElements)
  +         /* Check that all iteration items are same size (or scalar). */
            switch (he->t) {
            default:
  +             if (numElements == -1) {
  +                 numElements = he->c;
  +                 /[EMAIL PROTECTED]@*/ break;
  +             }
  +             if (he->c == numElements)
  +                 /[EMAIL PROTECTED]@*/ break;
                hsa->errmsg =
                        _("array iterator used with different sized arrays");
  +             he = rpmheClean(he);
                return NULL;
                /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ break;
            case RPM_OPENPGP_TYPE:
            case RPM_ASN1_TYPE:
            case RPM_BIN_TYPE:
            case RPM_STRING_TYPE:
  +             if (numElements == -1)
  +                 numElements = 1;
                /[EMAIL PROTECTED]@*/ break;
            }
  -         if (he->c > numElements)
  -             numElements = he->c;
        }
   
        if (numElements == -1) {
  @@ -3837,21 +3864,23 @@
            if (need == 0) break;
   
            spft = token->u.array.format;
  -         isxml = (spft->type == PTOK_TAG && spft->u.tag.type != NULL &&
  -             !strcmp(spft->u.tag.type, "xml"));
  -         isyaml = (spft->type == PTOK_TAG && spft->u.tag.type != NULL &&
  -             !strcmp(spft->u.tag.type, "yaml"));
  +         tag = &spft->u.tag;
  +
  +         isxml = (spft->type == PTOK_TAG && tag->type != NULL &&
  +             !strcmp(tag->type, "xml"));
  +         isyaml = (spft->type == PTOK_TAG && tag->type != NULL &&
  +             !strcmp(tag->type, "yaml"));
   
            if (isxml) {
   #if defined(SUPPORT_LINEAR_TAGTABLE_LOOKUP)
  -             const char * tagN = myTagName(hsa->tags, spft->u.tag.tagno, 
NULL);
  +             const char * tagN = myTagName(hsa->tags, tag->tagno, NULL);
   #else
  -             const char * tagN = tagName(spft->u.tag.tagno);
  +             const char * tagN = tagName(tag->tagno);
   #endif
                /* XXX display "Tag_0x01234567" for unknown tags. */
                if (tagN == NULL) {
                    (void) snprintf(numbuf, sizeof(numbuf), "Tag_0x%08x",
  -                             spft->u.tag.tagno);
  +                             tag->tagno);
                    numbuf[sizeof(numbuf)-1] = '\0';
                    tagN = numbuf;
                }
  @@ -3863,15 +3892,15 @@
            if (isyaml) {
   #if defined(SUPPORT_LINEAR_TAGTABLE_LOOKUP)
                int tagT = -1;
  -             const char * tagN = myTagName(hsa->tags, spft->u.tag.tagno, 
&tagT);
  +             const char * tagN = myTagName(hsa->tags, tag->tagno, &tagT);
   #else
  -             rpmTagType tagT = tagType(spft->u.tag.tagno);
  -             const char * tagN = tagName(spft->u.tag.tagno);
  +             rpmTagType tagT = tagType(tag->tagno);
  +             const char * tagN = tagName(tag->tagno);
   #endif
                /* XXX display "Tag_0x01234567" for unknown tags. */
                if (tagN == NULL) {
                    (void) snprintf(numbuf, sizeof(numbuf), "Tag_0x%08x",
  -                             spft->u.tag.tagno);
  +                             tag->tagno);
                    numbuf[sizeof(numbuf)-1] = '\0';
                    tagN = numbuf;
                    tagT = numElements > 1
  @@ -3889,7 +3918,7 @@
                if (((tagT & RPM_MASK_RETURN_TYPE) == RPM_ARRAY_RETURN_TYPE)
                 && numElements == 1) {
                    te = stpcpy(te, "    ");
  -                 if (spft->u.tag.tagno != 1118)
  +                 if (tag->tagno != 1118)
                        te = stpcpy(te, "- ");
                }
                *te = '\0';
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to