summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Festi <ffesti@redhat.com>2010-05-05 12:49:16 +0200
committerFlorian Festi <ffesti@redhat.com>2010-05-06 16:07:56 +0200
commit70e9b035ff33d649adb32028258f9676fc12d126 (patch)
tree29cef3fb0264af8a7c96cd093ca73e8f4c3965fe
parent9fad36f0eddb5d2d63cba6656978c68d7b5b715d (diff)
downloadlibrpm-tizen-70e9b035ff33d649adb32028258f9676fc12d126.tar.gz
librpm-tizen-70e9b035ff33d649adb32028258f9676fc12d126.tar.bz2
librpm-tizen-70e9b035ff33d649adb32028258f9676fc12d126.zip
Convert tsmem->removedPackages to a hash table and remove rpmdbPruneIterator from the API
-rw-r--r--lib/depends.c33
-rw-r--r--lib/rpmdb.c25
-rw-r--r--lib/rpmdb.h12
-rw-r--r--lib/rpmdb_internal.h19
-rw-r--r--lib/rpmts.c22
-rw-r--r--lib/rpmts_internal.h4
-rw-r--r--lib/transaction.c9
7 files changed, 70 insertions, 54 deletions
diff --git a/lib/depends.c b/lib/depends.c
index b0692688b..1cfc61096 100644
--- a/lib/depends.c
+++ b/lib/depends.c
@@ -36,6 +36,16 @@ static rpmds rpmlibP = NULL;
#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).
@@ -67,26 +77,11 @@ static int removePackage(tsMembers tsmem, Header h, rpmte depends)
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;
@@ -107,7 +102,7 @@ static rpmdbMatchIterator rpmtsPrunedIterator(rpmts ts, rpmTag tag, const char *
{
rpmdbMatchIterator mi = rpmtsInitIterator(ts, tag, key, 0);
tsMembers tsmem = rpmtsMembers(ts);
- rpmdbPruneIterator(mi, tsmem->removedPackages, tsmem->numRemovedPackages,1);
+ rpmdbPruneIterator(mi, tsmem->removedPackages);
return mi;
}
diff --git a/lib/rpmdb.c b/lib/rpmdb.c
index 43f86e9a5..194e47a56 100644
--- a/lib/rpmdb.c
+++ b/lib/rpmdb.c
@@ -1916,14 +1916,29 @@ static int rpmdbGrowIterator(rpmdbMatchIterator 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;
}
diff --git a/lib/rpmdb.h b/lib/rpmdb.h
index dc211842b..a4b61bc17 100644
--- a/lib/rpmdb.h
+++ b/lib/rpmdb.h
@@ -144,18 +144,6 @@ int rpmdbAppendIterator(rpmdbMatchIterator mi,
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
diff --git a/lib/rpmdb_internal.h b/lib/rpmdb_internal.h
index 1f7be34fa..c738d68d0 100644
--- a/lib/rpmdb_internal.h
+++ b/lib/rpmdb_internal.h
@@ -56,6 +56,25 @@ int rpmdbExtendIterator(rpmdbMatchIterator mi,
*/
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).
diff --git a/lib/rpmts.c b/lib/rpmts.c
index 433160d95..1688889fd 100644
--- a/lib/rpmts.c
+++ b/lib/rpmts.c
@@ -515,6 +515,18 @@ void rpmtsClean(rpmts ts)
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);
@@ -528,7 +540,7 @@ void rpmtsEmpty(rpmts ts)
}
tsmem->orderCount = 0;
- tsmem->numRemovedPackages = 0;
+ intHashEmpty(tsmem->removedPackages);
return;
}
@@ -577,7 +589,7 @@ rpmts rpmtsFree(rpmts ts)
(void) rpmtsCloseDB(ts);
- tsmem->removedPackages = _free(tsmem->removedPackages);
+ tsmem->removedPackages = intHashFree(tsmem->removedPackages);
tsmem->order = _free(tsmem->order);
ts->members = _free(ts->members);
@@ -906,13 +918,9 @@ rpmts rpmtsCreate(void)
}
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;
diff --git a/lib/rpmts_internal.h b/lib/rpmts_internal.h
index 551cdd76b..f70401ae0 100644
--- a/lib/rpmts_internal.h
+++ b/lib/rpmts_internal.h
@@ -12,9 +12,7 @@ typedef struct diskspaceInfo_s * rpmDiskSpaceInfo;
/* 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. */
diff --git a/lib/transaction.c b/lib/transaction.c
index 93903fb08..e9e1f0cb0 100644
--- a/lib/transaction.c
+++ b/lib/transaction.c
@@ -954,14 +954,7 @@ void checkInstalledFiles(rpmts ts, uint64_t fileCount, rpmFpHash ht, fingerPrint
/* 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);