static void rpmalMakeIndex(rpmal al) { availablePackage alp; int i; int providesCnt = 0; int fileCnt = 0; if (al == NULL || al->list == NULL) return; if (al->providesHash != NULL || al->fileHash != NULL) return; for (i = 0; i < al->size; i++) { alp = al->list + i; if (alp->provides != NULL) providesCnt += rpmdsCount(alp->provides); if (alp->fi != NULL) fileCnt += rpmfiFC(alp->fi); } al->providesHash = rpmalProvidesHashCreate(providesCnt/4+128, rstrhash, strcmp, NULL, NULL); al->fileHash = rpmalFileHashCreate(fileCnt/4+128, fileHash, fileCompare, NULL, NULL); for (i = 0; i < al->size; i++) { alp = al->list + i; rpmalAddProvides(al, i, alp->provides); rpmalAddFiles(al, i, alp->fi); } }
void rpmalAdd(rpmal al, rpmte p) { rpmalNum pkgNum; availablePackage alp; if (al->size == al->alloced) { al->alloced += al->delta; al->list = xrealloc(al->list, sizeof(*al->list) * al->alloced); } pkgNum = al->size++; alp = al->list + pkgNum; alp->p = p; alp->provides = rpmdsLink(rpmteDS(p, RPMTAG_PROVIDENAME)); alp->fi = rpmfiLink(rpmteFI(p)); if (al->providesHash != NULL) { // index is already created rpmalAddProvides(al, pkgNum, alp->provides); rpmalAddFiles(al, pkgNum, alp->fi); } assert(((rpmalNum)(alp - al->list)) == pkgNum); }
static void rpmalMakeProvidesIndex(rpmal al) { availablePackage alp; int i, providesCnt = 0; for (i = 0; i < al->size; i++) { alp = al->list + i; providesCnt += rpmdsCount(alp->provides); } al->providesHash = rpmalDepHashCreate(providesCnt/4+128, sidHash, sidCmp, NULL, NULL); for (i = 0; i < al->size; i++) { alp = al->list + i; rpmalAddProvides(al, i, alp->provides); } }
void rpmalAdd(rpmal al, rpmte p) { rpmalNum pkgNum; availablePackage alp; if (al->size == al->alloced) { al->alloced += al->delta; al->list = xrealloc(al->list, sizeof(*al->list) * al->alloced); } pkgNum = al->size++; alp = al->list + pkgNum; alp->p = p; alp->provides = rpmdsLink(rpmteDS(p, RPMTAG_PROVIDENAME)); alp->obsoletes = rpmdsLink(rpmteDS(p, RPMTAG_OBSOLETENAME)); alp->fi = rpmteFiles(p); /* * Transition-time safe-guard to catch private-pool uses. * File sets with no files have NULL pool, that's fine. But WTF is up * with the provides: every single package should have at least its * own name as a provide, and thus never NULL, and normal use matches * this expectation. However the test-suite is tripping up on NULL * NULL pool from NULL alp->provides in numerous cases? */ { rpmstrPool fipool = rpmfilesPool(alp->fi); rpmstrPool dspool = rpmdsPool(alp->provides); assert(fipool == NULL || fipool == al->pool); assert(dspool == NULL || dspool == al->pool); } /* Try to be lazy as delayed hash creation is cheaper */ if (al->providesHash != NULL) rpmalAddProvides(al, pkgNum, alp->provides); if (al->obsoletesHash != NULL) rpmalAddObsoletes(al, pkgNum, alp->obsoletes); if (al->fileHash != NULL) rpmalAddFiles(al, pkgNum, alp->fi); assert(((rpmalNum)(alp - al->list)) == pkgNum); }
static PyObject * rpmal_AddProvides(rpmalObject * s, PyObject * args, PyObject * kwds) { rpmdsObject * dso; rpmalKey pkgKey; char * kwlist[] = {"index", "packageIndex", "dso", NULL}; /* XXX: why is there an argument listed in the format string that * isn't handled? Is that for transaction color? */ if (!PyArg_ParseTupleAndKeywords(args, kwds, "iOO!O!:AddProvides", kwlist, &pkgKey, &rpmds_Type, &dso)) return NULL; /* XXX transaction colors */ rpmalAddProvides(s->al, pkgKey, dso->ds, 0); Py_INCREF(Py_None); return Py_None; }