RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/rpmdb/ header.c

From: Jeff Johnson <jbj@rpm5.org>
Date: Sun 21 Oct 2007 - 01:22:06 CEST
Message-Id: <20071020232206.8A2B0348459@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  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(/*@null@*/ HE_t he)
  +static HE_t rpmheMark(/*@null@*/ HE_t he)
   	/*@modifies 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(/*@null@*/ HE_t he)
  +static HE_t rpmheClean(/*@null@*/ HE_t he)
   	/*@modifies 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);
   	    /*@switchbreak@*/ 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)
   	/*@modifies 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;
  +		    /*@switchbreak@*/ break;
  +		}
  +		if (he->c == numElements)
  +		    /*@switchbreak@*/ break;
   		hsa->errmsg =
   			_("array iterator used with different sized arrays");
  +		he = rpmheClean(he);
   		return NULL;
   		/*@notreached@*/ /*@switchbreak@*/ break;
   	    case RPM_OPENPGP_TYPE:
   	    case RPM_ASN1_TYPE:
   	    case RPM_BIN_TYPE:
   	    case RPM_STRING_TYPE:
  +		if (numElements == -1)
  +		    numElements = 1;
   		/*@switchbreak@*/ 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';
  @@ .
Received on Sun Oct 21 01:22:06 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.