static VALUE rpmds_Ix_set(VALUE s, VALUE v) { rpmds ds = rpmds_ptr(s); int ix = FIX2INT(v); if (_debug) fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds); if (ix != rpmdsIx(ds)) { (void) rpmdsSetIx(ds, ix-1); /* XXX flush and recreate N and DNEVR with a rpmdsNext() step */ (void) rpmdsNext(ds); } return INT2FIX(rpmdsIx(ds)); }
static int isNewDep(rpmds *dsp, rpmds bds, Header h, rpmTagVal indextag, uint32_t index) { int isnew = 1; if (!indextag) { /* With normal deps, we can just merge and see if anything got added */ isnew = (rpmdsMerge(dsp, bds) > 0); } else { struct rpmtd_s idx; rpmds ads = *dsp; headerGet(h, indextag, &idx, HEADERGET_MINMEM); /* rpmdsFind/Merge() probably isn't realiable with triggers... */ rpmdsInit(ads); while (isnew && rpmdsNext(ads) >= 0) { if (!rstreq(rpmdsN(ads), rpmdsN(bds))) continue; if (!rstreq(rpmdsEVR(ads), rpmdsEVR(bds))) continue; if (rpmdsFlags(ads) != rpmdsFlags(bds)) continue; if (indextag && rpmtdSetIndex(&idx, rpmdsIx(ads)) >= 0 && rpmtdGetNumber(&idx) != index) continue; isnew = 0; } rpmtdFreeData(&idx); rpmdsMerge(dsp, bds); } return isnew; }
static rpmte * rpmalAllSatisfiesDepend(const rpmal al, const rpmds ds) { rpmte * ret = NULL; int i, found; const char * name; availableIndexEntry result; int resultCnt; int obsolete; availablePackage alp; int rc; if (al == NULL || ds == NULL || (name = rpmdsN(ds)) == NULL) return ret; if (al->providesHash == NULL && al->fileHash == NULL) rpmalMakeIndex(al); obsolete = (rpmdsTagN(ds) == RPMTAG_OBSOLETENAME); if (!obsolete && *name == '/') { /* First, look for files "contained" in package ... */ ret = rpmalAllFileSatisfiesDepend(al, ds); if (ret != NULL && *ret != NULL) return ret; /* ... then, look for files "provided" by package. */ ret = _free(ret); } rpmalProvidesHashGetEntry(al->providesHash, name, &result, &resultCnt, NULL); if (resultCnt==0) return NULL; ret = xmalloc((resultCnt+1) * sizeof(*ret)); for (found=i=0; i<resultCnt; i++) { alp = al->list + result[i].pkgNum; if (alp->p == NULL) // deleted continue; (void) rpmdsSetIx(alp->provides, result[i].entryIx); /* Obsoletes are on package name, filter out other provide matches */ if (obsolete && !rstreq(rpmdsN(alp->provides), rpmteN(alp->p))) continue; rc = 0; if (rpmdsIx(alp->provides) >= 0) rc = rpmdsCompare(alp->provides, ds); if (rc) { rpmdsNotify(ds, "(added provide)", 0); ret[found] = alp->p; found++; } } ret[found] = NULL; return ret; }
static VALUE rpmds_Ix_get(VALUE s) { rpmds ds = rpmds_ptr(s); if (_debug) fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds); return INT2FIX(rpmdsIx(ds)); }
int rpmdsSearch(rpmds ds, rpmds ods) { int comparison; int i, l, u; const char *ON = rpmdsN(ods); if (ds == NULL || ods == NULL) return -1; /* Binary search to find the [l,u) subset that contains N */ i = -1; l = 0; u = ds->Count; while (l < u) { i = (l + u) / 2; comparison = strcmp(ON, rpmdsNIndex(ds, i)); if (comparison < 0) u = i; else if (comparison > 0) l = i + 1; else { /* Set l to 1st member of set that contains N. */ if (!rstreq(ON, rpmdsNIndex(ds, l))) l = i; while (l > 0 && rstreq(ON, rpmdsNIndex(ds, l-1))) l--; /* Set u to 1st member of set that does not contain N. */ if (u >= ds->Count || !rstreq(ON, rpmdsNIndex(ds, u))) u = i; while (++u < ds->Count) { if (!rstreq(ON, rpmdsNIndex(ds, u))) break; } break; } } /* Check each member of [l,u) subset for ranges overlap. */ i = -1; if (l < u) { int save = rpmdsSetIx(ds, l-1); while ((l = rpmdsNext(ds)) >= 0 && (l < u)) { if ((i = rpmdsCompare(ods, ds)) != 0) break; } /* Return element index that overlaps, or -1. */ if (i) i = rpmdsIx(ds); else { (void) rpmdsSetIx(ds, save); i = -1; } } return i; }
static PyObject * rpmds_Find(rpmdsObject * s, PyObject * args, PyObject * kwds) { rpmdsObject *o = NULL; int rc; char * kwlist[] = {"element", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!:Find", kwlist, &rpmds_Type, &o)) { return NULL; } /* XXX make sure ods index is valid, real fix in lib/rpmds.c. */ if (rpmdsIx(o->ds) == -1) rpmdsSetIx(o->ds, 0); rc = rpmdsFind(s->ds, o->ds); return Py_BuildValue("i", rc); }
rpmte * rpmalAllObsoletes(rpmal al, rpmds ds) { rpmte * ret = NULL; rpmsid nameId; availableIndexEntry result; int resultCnt; if (al == NULL || ds == NULL || (nameId = rpmdsNId(ds)) == 0) return ret; if (al->obsoletesHash == NULL) rpmalMakeObsoletesIndex(al); rpmalDepHashGetEntry(al->obsoletesHash, nameId, &result, &resultCnt, NULL); if (resultCnt > 0) { availablePackage alp; int rc, found = 0; ret = xmalloc((resultCnt+1) * sizeof(*ret)); for (int i = 0; i < resultCnt; i++) { alp = al->list + result[i].pkgNum; if (alp->p == NULL) // deleted continue; rc = rpmdsCompareIndex(alp->obsoletes, result[i].entryIx, ds, rpmdsIx(ds)); if (rc) { rpmdsNotify(ds, "(added obsolete)", 0); ret[found] = alp->p; found++; } } if (found) ret[found] = NULL; else ret = _free(ret); } return ret; }
static void rpmalAddProvides(rpmal al, rpmalNum pkgNum, rpmds provides) { struct availableIndexEntry_s indexEntry; rpm_color_t dscolor; int skipconf = (al->tsflags & RPMTRANS_FLAG_NOCONFIGS); indexEntry.pkgNum = pkgNum; if (rpmdsInit(provides) != NULL) while (rpmdsNext(provides) >= 0) { /* Ignore colored provides not in our rainbow. */ dscolor = rpmdsColor(provides); if (al->tscolor && dscolor && !(al->tscolor & dscolor)) continue; /* Ignore config() provides if the files wont be installed */ if (skipconf & (rpmdsFlags(provides) & RPMSENSE_CONFIG)) continue; indexEntry.entryIx = rpmdsIx(provides); rpmalProvidesHashAddEntry(al->providesHash, rpmdsN(provides), indexEntry); } }
static PyObject * rpmds_Ix(rpmdsObject * s) { return Py_BuildValue("i", rpmdsIx(s->ds)); }
rpmte * rpmalAllSatisfiesDepend(const rpmal al, const rpmds ds) { rpmte * ret = NULL; int i, ix, found; rpmsid nameId; const char *name; availableIndexEntry result; int resultCnt; int obsolete; rpmTagVal dtag; rpmds filterds = NULL; availablePackage alp; int rc; if (al == NULL || ds == NULL || (nameId = rpmdsNId(ds)) == 0) return ret; dtag = rpmdsTagN(ds); obsolete = (dtag == RPMTAG_OBSOLETENAME); if (dtag == RPMTAG_OBSOLETENAME || dtag == RPMTAG_CONFLICTNAME) filterds = ds; name = rpmstrPoolStr(al->pool, nameId); if (!obsolete && *name == '/') { /* First, look for files "contained" in package ... */ ret = rpmalAllFileSatisfiesDepend(al, name, filterds); if (ret != NULL && *ret != NULL) { rpmdsNotify(ds, "(added files)", 0); return ret; } /* ... then, look for files "provided" by package. */ ret = _free(ret); } if (al->providesHash == NULL) rpmalMakeProvidesIndex(al); rpmalDepHashGetEntry(al->providesHash, nameId, &result, &resultCnt, NULL); if (resultCnt==0) return NULL; ret = xmalloc((resultCnt+1) * sizeof(*ret)); for (found=i=0; i<resultCnt; i++) { alp = al->list + result[i].pkgNum; if (alp->p == NULL) /* deleted */ continue; /* ignore self-conflicts/obsoletes */ if (filterds && rpmteDS(alp->p, rpmdsTagN(filterds)) == filterds) continue; ix = result[i].entryIx; if (obsolete) { /* Obsoletes are on package NEVR only */ rpmds thisds; if (!rstreq(rpmdsNIndex(alp->provides, ix), rpmteN(alp->p))) continue; thisds = rpmteDS(alp->p, RPMTAG_NAME); rc = rpmdsCompareIndex(thisds, rpmdsIx(thisds), ds, rpmdsIx(ds)); } else { rc = rpmdsCompareIndex(alp->provides, ix, ds, rpmdsIx(ds)); } if (rc) ret[found++] = alp->p; } if (found) { rpmdsNotify(ds, "(added provide)", 0); ret[found] = NULL; } else { ret = _free(ret); } return ret; }