Add a "unique string cache" to rpmug
authorPanu Matilainen <pmatilai@redhat.com>
Thu, 16 Dec 2010 07:31:20 +0000 (09:31 +0200)
committerPanu Matilainen <pmatilai@redhat.com>
Thu, 16 Dec 2010 07:31:20 +0000 (09:31 +0200)
- Used for storing unique strings just once

lib/rpmug.c
lib/rpmug.h

index 47aa6cc..2bb18e5 100644 (file)
@@ -5,9 +5,36 @@
 #include <rpm/rpmlog.h>
 #include <rpm/rpmstring.h>
 
+#include "lib/misc.h"
 #include "lib/rpmug.h"
 #include "debug.h"
 
+#define HASHTYPE strCache
+#define HTKEYTYPE const char *
+#include "lib/rpmhash.H"
+#include "lib/rpmhash.C"
+#undef HASHTYPE
+#undef HTKEYTYPE
+
+static strCache strStash = NULL;
+
+const char * rpmugStashStr(const char *str)
+{
+    const char *ret = NULL;
+    if (str) {
+       if (strStash == NULL) {
+           strStash = strCacheCreate(64, hashFunctionString, strcmp,
+                                     (strCacheFreeKey)rfree);
+       }
+       
+       if (!strCacheGetEntry(strStash, str, &ret)) {
+           strCacheAddEntry(strStash, xstrdup(str));
+           (void) strCacheGetEntry(strStash, str, &ret);
+       }
+    }
+    return ret;
+}
+
 /* 
  * These really ought to use hash tables. I just made the
  * guess that most files would be owned by root or the same person/group
@@ -171,4 +198,5 @@ void rpmugFree(void)
     rpmugGid(NULL, NULL);
     rpmugUname(-1);
     rpmugGname(-1);
+    strCacheFree(strStash);
 }
index 7dbe77d..35e5d63 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <sys/types.h>
 
+const char * rpmugStashStr(const char *str);
+
 int rpmugUid(const char * name, uid_t * uid);
 
 int rpmugGid(const char * name, gid_t * gid);