RPM Community Forums

Mailing List Message of <rpm-cvs>

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

From: Alexey Tourbin <at@rpm5.org>
Date: Fri 08 Aug 2008 - 05:19:31 CEST
Message-Id: <20080808031931.EF6A85ECD4@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Alexey Tourbin
  Root:   /v/rpm/cvs                       Email:  at@rpm5.org
  Module: rpm                              Date:   08-Aug-2008 05:19:31
  Branch: HEAD                             Handle: 2008080803193100

  Modified files:
    rpm/rpmdb               rpmdb.c

  Log:
    rpmdb.c (rpmdbAdd): DBT_INIT; local scope for DBT and DBC; comment;
    cleanup

  Summary:
    Revision    Changes     Path
    1.262       +66 -94     rpm/rpmdb/rpmdb.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmdb.c
  ============================================================================
  $ cvs diff -u -r1.261 -r1.262 rpmdb.c
  --- rpm/rpmdb/rpmdb.c	8 Aug 2008 02:07:11 -0000	1.261
  +++ rpm/rpmdb/rpmdb.c	8 Aug 2008 03:19:31 -0000	1.262
  @@ -3143,9 +3143,6 @@
   /* XXX install.c */
   int rpmdbAdd(rpmdb db, int iid, Header h, /*@unused@*/ rpmts ts)
   {
  -DBC * dbcursor = NULL;
  -DBT * key = alloca(sizeof(*key));
  -DBT * data = alloca(sizeof(*data));
       HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       sigset_t signalMask;
       const char ** dirNames;
  @@ -3154,7 +3151,6 @@
       size_t dbix;
       union _dbswap mi_offset;
       unsigned int hdrNum = 0;
  -    size_t nb;
       int ret = 0;
       int rc;
       int xx;
  @@ -3165,9 +3161,6 @@
       if (db == NULL)
   	return 0;
   
  -memset(key, 0, sizeof(*key));
  -memset(data, 0, sizeof(*data));
  -
   #ifdef	NOTYET	/* XXX headerRemoveEntry() broken on dribbles. */
       he->tag = RPMTAG_REMOVETID;
       xx = headerDel(h, he, 0);
  @@ -3211,35 +3204,27 @@
   
       (void) blockSignals(db, &signalMask);
   
  -    {
  -	unsigned int firstkey = 0;
  -	void * keyp = &firstkey;
  -	size_t keylen = sizeof(firstkey);
  -	void * datap = NULL;
  -	size_t datalen = 0;
  -
  -      dbi = dbiOpen(db, RPMDBI_PACKAGES, 0);
  -      if (dbi != NULL) {
  +    dbi = dbiOpen(db, RPMDBI_PACKAGES, 0);
  +    if (dbi != NULL) {
  +	/* Header indices are monotonically increasing integer instances
  +	 * starting with 1.  Header instance #0 is where the monotonically
  +	 * increasing integer is stored.  */
  +	unsigned int idx0 = 0;
  +
  +	DBC * dbcursor = NULL;
  +	DBT k = DBT_INIT;
  +	DBT v = DBT_INIT;
   
   	xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, DB_WRITECURSOR);
   
   	/* Retrieve join key for next header instance. */
  -
  -/*@-compmempass@*/
  -	key->data = keyp;
  -	key->size = (UINT32_T) keylen;
  -/*@i@*/	data->data = datap;
  -	data->size = (UINT32_T) datalen;
  -	ret = dbiGet(dbi, dbcursor, key, data, DB_SET);
  -	keyp = key->data;
  -	keylen = key->size;
  -	datap = data->data;
  -	datalen = data->size;
  -/*@=compmempass@*/
  +	k.data = &idx0;
  +	k.size = sizeof(idx0);
  +	ret = dbiGet(dbi, dbcursor, &k, &v, DB_SET);
   
   	hdrNum = 0;
  -	if (ret == 0 && datap) {
  -	    memcpy(&mi_offset, datap, sizeof(mi_offset.ui));
  +	if (ret == 0 && v.data) {
  +	    memcpy(&mi_offset, v.data, sizeof(mi_offset.ui));
   	    if (dbiByteSwapped(dbi) == 1)
   		_DBSWAP(mi_offset);
   	    hdrNum = (unsigned) mi_offset.ui;
  @@ -3248,28 +3233,19 @@
   	mi_offset.ui = hdrNum;
   	if (dbiByteSwapped(dbi) == 1)
   	    _DBSWAP(mi_offset);
  -	if (ret == 0 && datap) {
  -	    memcpy(datap, &mi_offset, sizeof(mi_offset.ui));
  +	if (ret == 0 && v.data) {
  +	    memcpy(v.data, &mi_offset, sizeof(mi_offset.ui));
   	} else {
  -	    datap = &mi_offset;
  -	    datalen = sizeof(mi_offset.ui);
  +	    v.data = &mi_offset;
  +	    v.size = sizeof(mi_offset.ui);
   	}
   
  -	key->data = keyp;
  -	key->size = (UINT32_T) keylen;
  -/*@-kepttrans@*/
  -	data->data = datap;
  -/*@=kepttrans@*/
  -	data->size = (UINT32_T) datalen;
  -
   /*@-compmempass@*/
  -	ret = dbiPut(dbi, dbcursor, key, data, DB_KEYLAST);
  +	ret = dbiPut(dbi, dbcursor, &k, &v, DB_KEYLAST);
   /*@=compmempass@*/
   	xx = dbiSync(dbi, 0);
   
   	xx = dbiCclose(dbi, dbcursor, DB_WRITECURSOR);
  -	dbcursor = NULL;
  -      }
   
       }
   
  @@ -3289,6 +3265,10 @@
   	
   	if (db->db_tags != NULL)
   	for (dbix = 0; dbix < db->db_ndbi; dbix++) {
  +	    DBC * dbcursor = NULL;
  +	    DBT k = DBT_INIT;
  +	    DBT v = DBT_INIT;
  +
   	    tagStore_t dbiTags = db->db_tags + dbix;
   	    const char * dbiBN = (dbiTags->str != NULL
   			? dbiTags->str : tagName(dbiTags->tag));
  @@ -3321,31 +3301,25 @@
   		    continue;
   		xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, DB_WRITECURSOR);
   
  -mi_offset.ui = hdrNum;
  -if (dbiByteSwapped(dbi) == 1)
  -    _DBSWAP(mi_offset);
  -/*@-immediatetrans@*/
  -key->data = (void *) &mi_offset;
  -/*@=immediatetrans@*/
  -key->size = (UINT32_T) sizeof(mi_offset.ui);
  - {  size_t len;
  -    nb = 0;
  -    (void) headerGetMagic(h, NULL, &nb);
  -    len = 0;
  -    data->data = headerUnload(h, &len);
  -    data->size = (UINT32_T) len;	/* XXX data->size is rpmuint32_t */
  -#ifdef	DYING	/* XXX this is needed iff headerSizeof() is used instead. */
  -    data->size -= nb;	/* XXX HEADER_MAGIC_NO */
  -#endif
  - }
  +		mi_offset.ui = hdrNum;
  +		if (dbiByteSwapped(dbi) == 1)
  +		    _DBSWAP(mi_offset);
  +		/*@-immediatetrans@*/
  +		k.data = (void *) &mi_offset;
  +		/*@=immediatetrans@*/
  +		k.size = (UINT32_T) sizeof(mi_offset.ui);
  +		{   size_t len = 0;
  +		    v.data = headerUnload(h, &len);
  +		    v.size = (UINT32_T) len;
  +		}
   
   		/* Check header digest/signature on blob export. */
   		if (ts) {
   		    const char * msg = NULL;
   		    int lvl;
   
  -assert(data->data != NULL);
  -		    rpmrc = headerCheck(rpmtsDig(ts), data->data, data->size, &msg);
  +assert(v.data != NULL);
  +		    rpmrc = headerCheck(rpmtsDig(ts), v.data, v.size, &msg);
   		    rpmtsCleanDig(ts);
   		    lvl = (rpmrc == RPMRC_FAIL ? RPMLOG_ERR : RPMLOG_DEBUG);
   		    rpmlog(lvl, "%s h#%8u %s\n",
  @@ -3354,16 +3328,15 @@
   		    msg = _free(msg);
   		}
   
  -		if (data->data != NULL && rpmrc != RPMRC_FAIL) {
  +		if (v.data != NULL && rpmrc != RPMRC_FAIL) {
   /*@-compmempass@*/
  -		    xx = dbiPut(dbi, dbcursor, key, data, DB_KEYLAST);
  +		    xx = dbiPut(dbi, dbcursor, &k, &v, DB_KEYLAST);
   /*@=compmempass@*/
   		    xx = dbiSync(dbi, 0);
   		}
  -data->data = _free(data->data);
  -data->size = 0;
  +v.data = _free(v.data);
  +v.size = 0;
   		xx = dbiCclose(dbi, dbcursor, DB_WRITECURSOR);
  -		dbcursor = NULL;
   		if (!dbi->dbi_no_dbsync)
   		    xx = dbiSync(dbi, 0);
   		continue;
  @@ -3456,24 +3429,24 @@
   		stringvalued = 0;
   		switch (he->t) {
   		case RPM_UINT8_TYPE:
  -		    key->size = (UINT32_T) sizeof(*he->p.ui8p);
  -/*@i@*/		    key->data = he->p.ui8p + i;
  +		    k.size = (UINT32_T) sizeof(*he->p.ui8p);
  +/*@i@*/		    k.data = he->p.ui8p + i;
   		    /*@switchbreak@*/ break;
   		case RPM_UINT16_TYPE:
  -		    key->size = (UINT32_T) sizeof(*he->p.ui16p);
  -/*@i@*/		    key->data = he->p.ui16p + i;
  +		    k.size = (UINT32_T) sizeof(*he->p.ui16p);
  +/*@i@*/		    k.data = he->p.ui16p + i;
   		    /*@switchbreak@*/ break;
   		case RPM_UINT32_TYPE:
  -		    key->size = (UINT32_T) sizeof(*he->p.ui32p);
  -/*@i@*/		    key->data = he->p.ui32p + i;
  +		    k.size = (UINT32_T) sizeof(*he->p.ui32p);
  +/*@i@*/		    k.data = he->p.ui32p + i;
   		    /*@switchbreak@*/ break;
   		case RPM_UINT64_TYPE:
  -		    key->size = (UINT32_T) sizeof(*he->p.ui64p);
  -/*@i@*/		    key->data = he->p.ui64p + i;
  +		    k.size = (UINT32_T) sizeof(*he->p.ui64p);
  +/*@i@*/		    k.data = he->p.ui64p + i;
   		    /*@switchbreak@*/ break;
   		case RPM_BIN_TYPE:
  -		    key->size = (UINT32_T) he->c;
  -/*@i@*/		    key->data = he->p.ptr;
  +		    k.size = (UINT32_T) he->c;
  +/*@i@*/		    k.data = he->p.ptr;
   		    he->c = 1;		/* XXX break out of loop. */
   		    /*@switchbreak@*/ break;
   		case RPM_I18NSTRING_TYPE:	/* XXX never occurs */
  @@ -3494,8 +3467,8 @@
   			for (j = 0; j < (unsigned) dlen; j++, t++, s += 2)
   			    *t = (rpmuint8_t) (nibble(s[0]) << 4) | nibble(s[1]);
   /*@=type@*/
  -			key->data = bin;
  -			key->size = (UINT32_T) dlen;
  +			k.data = bin;
  +			k.size = (UINT32_T) dlen;
   			/*@switchbreak@*/ break;
   		    }
   		    /* Extract the pubkey id from the base64 blob. */
  @@ -3505,14 +3478,14 @@
   			nbin = pgpExtractPubkeyFingerprint(he->p.argv[i], bin);
   			if (nbin <= 0)
   			    /*@innercontinue@*/ continue;
  -			key->data = bin;
  -			key->size = (UINT32_T) nbin;
  +			k.data = bin;
  +			k.size = (UINT32_T) nbin;
   			/*@switchbreak@*/ break;
   		    }
   		    /*@fallthrough@*/
   		default:
  -/*@i@*/		    key->data = (void *) he->p.argv[i];
  -		    key->size = (UINT32_T) strlen(he->p.argv[i]);
  +/*@i@*/		    k.data = (void *) he->p.argv[i];
  +		    k.size = (UINT32_T) strlen(he->p.argv[i]);
   		    stringvalued = 1;
   		    /*@switchbreak@*/ break;
   		}
  @@ -3521,7 +3494,7 @@
   		    if (he->c == 1 && stringvalued) {
   			rpmlog(RPMLOG_DEBUG,
   				D_("adding \"%s\" to %s index.\n"),
  -				(char *)key->data, dbiBN);
  +				(char *)k.data, dbiBN);
   		    } else {
   			rpmlog(RPMLOG_DEBUG,
   				D_("adding %u entries to %s index.\n"),
  @@ -3534,15 +3507,15 @@
   
   		set = NULL;
   
  -if (key->size == 0) key->size = (UINT32_T) strlen((char *)key->data);
  -if (key->size == 0) key->size++;	/* XXX "/" fixup. */
  +if (k.size == 0) k.size = (UINT32_T) strlen((char *)k.data);
  +if (k.size == 0) k.size++;	/* XXX "/" fixup. */
   
   /*@-compmempass@*/
  -		rc = dbiGet(dbi, dbcursor, key, data, DB_SET);
  +		rc = dbiGet(dbi, dbcursor, &k, &v, DB_SET);
   		if (rc == 0) {			/* success */
   		/* With duplicates, cursor is positioned, discard the record. */
   		    if (!dbi->dbi_permit_dups)
  -			(void) dbt2set(dbi, data, &set);
  +			(void) dbt2set(dbi, &v, &set);
   		} else if (rc != DB_NOTFOUND) {	/* error */
   		    rpmlog(RPMLOG_ERR,
   			_("error(%d) getting records from %s index\n"),
  @@ -3558,8 +3531,8 @@
   		(void) dbiAppendSet(set, rec, 1, sizeof(*rec), 0);
   
   /*@-compmempass@*/
  -		(void) set2dbt(dbi, data, set);
  -		rc = dbiPut(dbi, dbcursor, key, data, DB_KEYLAST);
  +		(void) set2dbt(dbi, &v, set);
  +		rc = dbiPut(dbi, dbcursor, &k, &v, DB_KEYLAST);
   /*@=compmempass@*/
   
   		if (rc) {
  @@ -3569,14 +3542,13 @@
   		    ret += 1;
   		}
   /*@-unqualifiedtrans@*/
  -		data->data = _free(data->data);
  +		v.data = _free(v.data);
   /*@=unqualifiedtrans@*/
  -		data->size = 0;
  +		v.size = 0;
   		set = dbiFreeIndexSet(set);
   	    }
   
   	    xx = dbiCclose(dbi, dbcursor, DB_WRITECURSOR);
  -	    dbcursor = NULL;
   
   	    if (!dbi->dbi_no_dbsync)
   		xx = dbiSync(dbi, 0);
  @@ .
Received on Fri Aug 8 05:19:32 2008
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.