#define HTDATATYPE int
#include "lib/rpmhash.H"
#include "lib/rpmhash.C"
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+
+#define HASHTYPE intHash
+#define HTKEYTYPE unsigned int
+#include "rpmhash.C"
+#undef HASHTYPE
+#undef HASHKEYTYPE
+
/**
* Compare removed package instances (qsort/bsearch).
if (dboffset == 0) return 1;
/* Filter out duplicate erasures. */
- if (tsmem->numRemovedPackages > 0 && tsmem->removedPackages != NULL) {
- if (bsearch(&dboffset,
- tsmem->removedPackages, tsmem->numRemovedPackages,
- sizeof(*tsmem->removedPackages), intcmp) != NULL)
- return 0;
- }
-
- if (tsmem->numRemovedPackages == tsmem->allocedRemovedPackages) {
- tsmem->allocedRemovedPackages += tsmem->delta;
- tsmem->removedPackages = xrealloc(tsmem->removedPackages,
- sizeof(tsmem->removedPackages) * tsmem->allocedRemovedPackages);
+ if (intHashHasEntry(tsmem->removedPackages, dboffset)) {
+ return 0;
}
- if (tsmem->removedPackages != NULL) { /* XXX can't happen. */
- tsmem->removedPackages[tsmem->numRemovedPackages] = dboffset;
- tsmem->numRemovedPackages++;
- if (tsmem->numRemovedPackages > 1)
- qsort(tsmem->removedPackages, tsmem->numRemovedPackages,
- sizeof(*tsmem->removedPackages), intcmp);
- }
+ intHashAddEntry(tsmem->removedPackages, dboffset);
if (tsmem->orderCount >= tsmem->orderAlloced) {
tsmem->orderAlloced += (tsmem->orderCount - tsmem->orderAlloced) + tsmem->delta;
{
rpmdbMatchIterator mi = rpmtsInitIterator(ts, tag, key, 0);
tsMembers tsmem = rpmtsMembers(ts);
- rpmdbPruneIterator(mi, tsmem->removedPackages, tsmem->numRemovedPackages,1);
+ rpmdbPruneIterator(mi, tsmem->removedPackages);
return mi;
}
return rc;
}
-int rpmdbPruneIterator(rpmdbMatchIterator mi, int * hdrNums,
- int nHdrNums, int sorted)
+int rpmdbPruneIterator(rpmdbMatchIterator mi, intHash hdrNums)
{
- if (mi == NULL || hdrNums == NULL || nHdrNums <= 0)
+ if (mi == NULL || hdrNums == NULL || intHashNumKeys(hdrNums) <= 0)
return 1;
- if (mi->mi_set)
- (void) dbiPruneSet(mi->mi_set, hdrNums, nHdrNums, sizeof(*hdrNums), sorted);
+ if (!mi->mi_set)
+ return 0;
+
+ unsigned int from;
+ unsigned int to = 0;
+ unsigned int num = mi->mi_set->count;
+
+ assert(mi->mi_set->count > 0);
+
+ for (from = 0; from < num; from++) {
+ if (intHashHasEntry(hdrNums, mi->mi_set->recs[from].hdrNum)) {
+ mi->mi_set->count--;
+ continue;
+ }
+ if (from != to)
+ mi->mi_set->recs[to] = mi->mi_set->recs[from]; /* structure assignment */
+ to++;
+ }
return 0;
}
const int * hdrNums, int nHdrNums);
/** \ingroup rpmdb
- * Remove items from set of package instances to iterate.
- * @note Sorted hdrNums are always passed in rpmlib.
- * @param mi rpm database iterator
- * @param hdrNums array of package instances
- * @param nHdrNums number of elements in array
- * @param sorted is the array sorted? (array will be sorted on return)
- * @return 0 on success, 1 on failure (bad args)
- */
-int rpmdbPruneIterator(rpmdbMatchIterator mi,
- int * hdrNums, int nHdrNums, int sorted);
-
-/** \ingroup rpmdb
* Add pattern to iterator selector.
* @param mi rpm database iterator
* @param tag rpm tag
*/
void rpmdbSortIterator(rpmdbMatchIterator mi);
+/* avoid importing rpmts_internal.h */
+#undef HASHTYPE
+#undef HTKEYTYPE
+#undef HTDATATYPE
+#define HASHTYPE intHash
+#define HTKEYTYPE unsigned int
+#include "rpmhash.H"
+#undef HASHTYPE
+#undef HTKEYTYPE
+
+/** \ingroup rpmdb
+ * Remove items from set of package instances to iterate.
+ * @note Sorted hdrNums are always passed in rpmlib.
+ * @param mi rpm database iterator
+ * @param hdrNums hash of package instances
+ * @return 0 on success, 1 on failure (bad args)
+ */
+int rpmdbPruneIterator(rpmdbMatchIterator mi, intHash hdrNums);
+
#ifndef __APPLE__
/**
* * Mergesort, same arguments as qsort(2).
rpmtsCleanProblems(ts);
}
+/* hash comparison function */
+static int uintCmp(unsigned int a, unsigned int b)
+{
+ return (a != b);
+}
+
+/* "hash"function*/
+static unsigned int uintId(unsigned int a)
+{
+ return a;
+}
+
void rpmtsEmpty(rpmts ts)
{
tsMembers tsmem = rpmtsMembers(ts);
}
tsmem->orderCount = 0;
- tsmem->numRemovedPackages = 0;
+ intHashEmpty(tsmem->removedPackages);
return;
}
(void) rpmtsCloseDB(ts);
- tsmem->removedPackages = _free(tsmem->removedPackages);
+ tsmem->removedPackages = intHashFree(tsmem->removedPackages);
tsmem->order = _free(tsmem->order);
ts->members = _free(ts->members);
}
tsmem = xcalloc(1, sizeof(*ts->members));
- tsmem->delta = 5;
tsmem->numAddedPackages = 0;
tsmem->addedPackages = NULL;
- tsmem->numRemovedPackages = 0;
- tsmem->allocedRemovedPackages = tsmem->delta;
- tsmem->removedPackages = xcalloc(tsmem->allocedRemovedPackages,
- sizeof(*tsmem->removedPackages));
+ tsmem->removedPackages = intHashCreate(128, uintId, uintCmp, NULL);
tsmem->orderAlloced = 0;
tsmem->orderCount = 0;
tsmem->order = NULL;
/* Transaction set elements information */
typedef struct tsMembers_s {
- int * removedPackages; /*!< Set of packages being removed. */
- int numRemovedPackages; /*!< No. removed package instances. */
- int allocedRemovedPackages; /*!< Size of removed packages array. */
+ intHash removedPackages; /*!< Set of packages being removed. */
rpmal addedPackages; /*!< Set of packages being installed. */
int numAddedPackages; /*!< No. added package instances. */
/* Is this package being removed? */
installedPkg = rpmdbGetIteratorOffset(mi);
- beingRemoved = 0;
- if (tsmem->removedPackages != NULL)
- for (j = 0; j < tsmem->numRemovedPackages; j++) {
- if (tsmem->removedPackages[j] != installedPkg)
- continue;
- beingRemoved = 1;
- break;
- }
+ beingRemoved = intHashHasEntry(tsmem->removedPackages, installedPkg);
h = headerLink(h);
headerGet(h, RPMTAG_BASENAMES, &bnames, hgflags);