static void Check_HRSW_cache(void *xxx) { SWI_t *swi = (SWI_t *) xxx; /* * Make sure cache is up-to-date */ if (swi->swi_recs != NULL) { struct stat sb; lstat(swi->swi_directory, &sb); if (swi->swi_timestamp == sb.st_mtime) return; swi->swi_timestamp = sb.st_mtime; swi->swi_maxrec = 0; } /* * Get header offsets */ { int ix = 0; int offset; #if defined(RPMDBI_PACKAGES) rpmdbMatchIterator mi = NULL; Header h; mi = rpmdbInitIterator(swi->swi_rpmdb, RPMDBI_PACKAGES, NULL, 0); while ((h = rpmdbNextIterator(mi)) != NULL) { offset = rpmdbGetIteratorOffset(mi); #else for (offset = rpmdbFirstRecNum(swi->swi_rpmdb); offset != 0; offset = rpmdbNextRecNum(swi->swi_rpmdb, offset)) { #endif if (ix >= swi->swi_maxrec) { swi->swi_maxrec += 256; swi->swi_recs = (swi->swi_recs == NULL) ? (int *) malloc(swi->swi_maxrec * sizeof(int)) : (int *) realloc(swi->swi_recs, swi->swi_maxrec * sizeof(int)); } swi->swi_recs[ix++] = offset; #if !defined(RPMDBI_PACKAGES) } #else } rpmdbFreeIterator(mi); #endif swi->swi_nrec = ix; } }
/* Get a rpmdbMatchIterator containing all files in * the rpmdb that share the basename with one from * the transaction. * @param ts transaction set * @return rpmdbMatchIterator sorted by (package, fileNum) */ static rpmdbMatchIterator rpmFindBaseNamesInDB(rpmts ts) { rpmtsi pi; rpmte p; rpmfi fi; int fc=0; rpmdbMatchIterator mi; int i, xx; const char * baseName; /* get number of files in transaction */ // XXX move to ts pi = rpmtsiInit(ts); while ((p = rpmtsiNext(pi, 0)) != NULL) { if ((fi = rpmteFI(p)) == NULL) continue; /* XXX can't happen */ fc += rpmfiFC(fi); } pi = rpmtsiFree(pi); rpmStringSet baseNames = rpmStringSetCreate(fc, hashFunctionString, strcmp, NULL); mi = rpmdbInitIterator(rpmtsGetRdb(ts), RPMTAG_BASENAMES, NULL, 0); pi = rpmtsiInit(ts); while ((p = rpmtsiNext(pi, 0)) != NULL) { (void) rpmdbCheckSignals(); if ((fi = rpmteFI(p)) == NULL) continue; /* XXX can't happen */ rpmtsNotify(ts, NULL, RPMCALLBACK_TRANS_PROGRESS, rpmtsiOc(pi), ts->orderCount); /* Gather all installed headers with matching basename's. */ fi = rpmfiInit(fi, 0); while ((i = rpmfiNext(fi)) >= 0) { size_t keylen; baseName = rpmfiBN(fi); if (rpmStringSetHasEntry(baseNames, baseName)) continue; keylen = strlen(baseName); if (keylen == 0) keylen++; /* XXX "/" fixup. */ xx = rpmdbExtendIterator(mi, baseName, keylen); rpmStringSetAddEntry(baseNames, baseName); } } pi = rpmtsiFree(pi); rpmStringSetFree(baseNames); rpmdbSortIterator(mi); /* iterator is now sorted by (recnum, filenum) */ return mi; }
void Save_HR_SW_info(int ix) { SWI_t *swi = &_myswi; /* XXX static for now */ #ifdef HAVE_LIBRPM /* * XXX Watchout: ix starts with 1 */ if (1 <= ix && ix <= swi->swi_nrec && ix != swi->swi_prevx) { int offset; Header h; char *n, *v, *r; offset = swi->swi_recs[ix - 1]; #if defined(RPMDBI_PACKAGES) { rpmdbMatchIterator mi; mi = rpmdbInitIterator(swi->swi_rpmdb, RPMDBI_PACKAGES, &offset, sizeof(offset)); if ((h = rpmdbNextIterator(mi)) != NULL) h = headerLink(h); rpmdbFreeIterator(mi); } #else h = rpmdbGetRecord(swi->swi_rpmdb, offset); #endif if (h == NULL) return; if (swi->swi_h != NULL) headerFree(swi->swi_h); swi->swi_h = h; swi->swi_prevx = ix; headerGetEntry(swi->swi_h, RPMTAG_NAME, NULL, (void **) &n, NULL); headerGetEntry(swi->swi_h, RPMTAG_VERSION, NULL, (void **) &v, NULL); headerGetEntry(swi->swi_h, RPMTAG_RELEASE, NULL, (void **) &r, NULL); snprintf(swi->swi_name, sizeof(swi->swi_name), "%s-%s-%s", n, v, r); swi->swi_name[ sizeof(swi->swi_name)-1 ] = 0; } #else snprintf(swi->swi_name, sizeof(swi->swi_name), swi->swi_dep->d_name); swi->swi_name[ sizeof(swi->swi_name)-1 ] = 0; #endif }
void RpmTransaction::addToTransactionRemove(const StringVector& files) { for (StringVector::size_type i = 0;i < files.size();i++) { rpmdbMatchIterator MI; MI = rpmdbInitIterator(m_db, RPMDBI_LABEL, files[i].c_str(), 0); Header hdr; while ((hdr = rpmdbNextIterator(MI)) != NULL) { const unsigned int recOffset = rpmdbGetIteratorOffset(MI); if (recOffset) { const int rc = rpmtransRemovePackage(m_ts, recOffset); if (rc != 0) throw PkgBackEndException("rpmtransRemovePackage()"); } } MI = rpmdbFreeIterator(MI); } }
VALUE rpm_db_init_iterator(VALUE db, VALUE key, VALUE val) { rpm_mi_t* mi; check_closed(db); if (!NIL_P(val) && TYPE(val) != T_STRING) { rb_raise(rb_eTypeError, "illegal argument type"); } mi = ALLOC_N(rpm_mi_t,1); if ((mi->mi = rpmdbInitIterator(RPM_DB(db), NUM2INT(rb_Integer(key)), NIL_P(val) ? NULL : RSTRING_PTR(val), NIL_P(val) ? 0 : RSTRING_LEN(val)))){ mi->db = (rpm_db_t*)DATA_PTR(db); db_ref(mi->db); return Data_Wrap_Struct(rpm_cMatchIterator, NULL, mi_free, mi); } free(mi); /* FIXME: returning nil here is a pain; for ruby, it would be nicer to return an empty array */ return Qnil; }
/* keyp might no be defined. */ rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag, const void * keyp, size_t keylen) { rpmdbMatchIterator mi = NULL; char *tmp = NULL; if (ts == NULL) return NULL; if (ts && ts->keyring == NULL) loadKeyring(ts); if (ts->rdb == NULL && rpmtsOpenDB(ts, ts->dbmode)) return NULL; /* Parse out "N(EVR)" tokens from a label key if present */ if (rpmtag == RPMDBI_LABEL && keyp != NULL && strchr(keyp, '(')) { const char *se, *s = keyp; char *t; size_t slen = strlen(s); int level = 0; int c; tmp = xmalloc(slen+1); keyp = t = tmp; while ((c = *s++) != '\0') { switch (c) { default: *t++ = c; break; case '(': /* XXX Fail if nested parens. */ if (level++ != 0) { rpmlog(RPMLOG_ERR, _("extra '(' in package label: %s\n"), (const char*)keyp); goto exit; } /* Parse explicit epoch. */ for (se = s; *se && risdigit(*se); se++) {}; if (*se == ':') { /* XXX skip explicit epoch's (for now) */ *t++ = '-'; s = se + 1; } else { /* No Epoch: found. Convert '(' to '-' and chug. */ *t++ = '-'; } break; case ')': /* XXX Fail if nested parens. */ if (--level != 0) { rpmlog(RPMLOG_ERR, _("missing '(' in package label: %s\n"), (const char*)keyp); goto exit; } /* Don't copy trailing ')' */ break; } } if (level) { rpmlog(RPMLOG_ERR, _("missing ')' in package label: %s\n"), (const char*)keyp); goto exit; } *t = '\0'; } mi = rpmdbInitIterator(ts->rdb, rpmtag, keyp, keylen); /* Verify header signature/digest during retrieve (if not disabled). */ if (mi && !(ts->vsflags & RPMVSF_NOHDRCHK)) (void) rpmdbSetHdrChk(mi, ts, headerCheck); exit: free(tmp); return mi; }