#define _DBI_PERMS 0644
#define _DBI_MAJOR -1
-rpmTag * dbiTags = NULL;
-rpmTag dbiTagsMax = 0;
+struct dbiTags_s {
+ rpmTag * tags;
+ rpmTag max;
+ int nlink;
+};
+
+/* XXX should dbitags be per-db instead? */
+static struct dbiTags_s dbiTags = { NULL, 0, 0 };
/* We use this to comunicate back to the the rpm transaction
* what their install instance was on a rpmdbAdd().
{
int dbix;
- if (dbiTags != NULL)
- for (dbix = 0; dbix < dbiTagsMax; dbix++) {
- if (rpmtag == dbiTags[dbix])
+ if (dbiTags.tags != NULL)
+ for (dbix = 0; dbix < dbiTags.max; dbix++) {
+ if (rpmtag == dbiTags.tags[dbix])
return dbix;
}
return -1;
char * o, * oe;
rpmTag rpmtag;
+ dbiTags.nlink++;
+ if (dbiTags.tags != NULL && dbiTags.max > 0) {
+ return;
+ }
+
dbiTagStr = rpmExpand("%{?_dbi_tags}", NULL);
if (!(dbiTagStr && *dbiTagStr)) {
dbiTagStr = _free(dbiTagStr);
}
/* Discard previous values. */
- dbiTags = _free(dbiTags);
- dbiTagsMax = 0;
+ dbiTags.tags = _free(dbiTags.tags);
+ dbiTags.max = 0;
/* Always allocate package index */
- dbiTags = xcalloc(1, sizeof(*dbiTags));
- dbiTags[dbiTagsMax++] = RPMDBI_PACKAGES;
+ dbiTags.tags = xcalloc(1, sizeof(*dbiTags.tags));
+ dbiTags.tags[dbiTags.max++] = RPMDBI_PACKAGES;
for (o = dbiTagStr; o && *o; o = oe) {
while (*o && xisspace(*o))
if (dbiTagToDbix(rpmtag) >= 0)
continue;
- dbiTags = xrealloc(dbiTags, (dbiTagsMax + 1) * sizeof(*dbiTags)); /* XXX memory leak */
- dbiTags[dbiTagsMax++] = rpmtag;
+ dbiTags.tags = xrealloc(dbiTags.tags, (dbiTags.max + 1) * sizeof(*dbiTags.tags)); /* XXX memory leak */
+ dbiTags.tags[dbiTags.max++] = rpmtag;
}
dbiTagStr = _free(dbiTagStr);
}
+static void dbiTagsFree(void)
+{
+ if (--dbiTags.nlink > 0) {
+ return;
+ }
+ dbiTags.tags = _free(dbiTags.tags);
+ dbiTags.max = 0;
+}
+
#define DB1vec NULL
#define DB2vec NULL
return NULL;
dbix = dbiTagToDbix(rpmtag);
- if (dbix < 0 || dbix >= dbiTagsMax)
+ if (dbix < 0 || dbix >= dbiTags.max)
return NULL;
/* Is this index already open ? */
if (db == NULL) return -2;
- if (dbiTags != NULL)
- for (dbix = 0; dbix < dbiTagsMax; dbix++) {
+ if (dbiTags.tags != NULL)
+ for (dbix = 0; dbix < dbiTags.max; dbix++) {
if (db->_dbi[dbix] != NULL)
continue;
/* Filter out temporary databases */
- if (isTemporaryDB(dbiTags[dbix]))
+ if (isTemporaryDB(dbiTags.tags[dbix]))
continue;
- (void) dbiOpen(db, dbiTags[dbix], db->db_flags);
+ (void) dbiOpen(db, dbiTags.tags[dbix], db->db_flags);
}
return rc;
}
int dbix;
int rc = 0;
- if (db == NULL || db->_dbi == NULL || dbiTags == NULL)
+ if (db == NULL || db->_dbi == NULL || dbiTags.tags == NULL)
return 0;
- for (dbix = 0; dbix < dbiTagsMax; dbix++) {
- if (dbiTags[dbix] != rpmtag)
+ for (dbix = 0; dbix < dbiTags.max; dbix++) {
+ if (dbiTags.tags[dbix] != rpmtag)
continue;
if (db->_dbi[dbix] != NULL) {
int xx;
db = _free(db);
+ dbiTagsFree();
+
exit:
(void) rpmsqEnable(-SIGHUP, NULL);
(void) rpmsqEnable(-SIGINT, NULL);
db->db_errpfx = rpmExpand( (epfx && *epfx ? epfx : _DB_ERRPFX), NULL);
db->db_remove_env = 0;
db->db_filter_dups = _db_filter_dups;
- db->db_ndbi = dbiTagsMax;
+ db->db_ndbi = dbiTags.max;
db->_dbi = xcalloc(db->db_ndbi, sizeof(*db->_dbi));
db->nrefs = 0;
return rpmdbLink(db, RPMDBG_M("rpmdbCreate"));
{
rpmdb db;
int rc, xx;
- static int _tags_initialized = 0;
int justCheck = flags & RPMDB_FLAG_JUSTCHECK;
int minimal = flags & RPMDB_FLAG_MINIMAL;
- if (!_tags_initialized || dbiTagsMax == 0) {
- dbiTagsInit();
- _tags_initialized++;
- }
+ dbiTagsInit();
/* Insure that _dbapi has one of -1, 1, 2, or 3 */
if (_dbapi < -1 || _dbapi > 4)
{ int dbix;
rc = 0;
- if (dbiTags != NULL)
- for (dbix = 0; rc == 0 && dbix < dbiTagsMax; dbix++) {
+ if (dbiTags.tags != NULL)
+ for (dbix = 0; rc == 0 && dbix < dbiTags.max; dbix++) {
dbiIndex dbi;
rpmTag rpmtag;
/* Filter out temporary databases */
- if (isTemporaryDB((rpmtag = dbiTags[dbix])))
+ if (isTemporaryDB((rpmtag = dbiTags.tags[dbix])))
continue;
dbi = dbiOpen(db, rpmtag, 0);
{ int dbix;
dbiIndexItem rec = dbiIndexNewItem(hdrNum, 0);
- if (dbiTags != NULL)
- for (dbix = 0; dbix < dbiTagsMax; dbix++) {
+ if (dbiTags.tags != NULL)
+ for (dbix = 0; dbix < dbiTags.max; dbix++) {
dbiIndex dbi;
const char *av[1];
const char ** rpmvals = NULL;
rpm_count_t i, j;
dbi = NULL;
- rpmtag = dbiTags[dbix];
+ rpmtag = dbiTags.tags[dbix];
/* Filter out temporary databases */
if (isTemporaryDB(rpmtag))
/* Save the header number for the current transaction. */
myinstall_instance = hdrNum;
- if (dbiTags != NULL)
- for (dbix = 0; dbix < dbiTagsMax; dbix++) {
+ if (dbiTags.tags != NULL)
+ for (dbix = 0; dbix < dbiTags.max; dbix++) {
const char *av[1];
const char **rpmvals = NULL;
rpmTagType rpmtype = 0;
rpmrc = RPMRC_NOTFOUND;
dbi = NULL;
requireFlags = NULL;
- rpmtag = dbiTags[dbix];
+ rpmtag = dbiTags.tags[dbix];
/* Filter out temporary databases */
if (isTemporaryDB(rpmtag))
switch (_dbapi) {
case 4:
case 3:
- if (dbiTags != NULL)
- for (i = 0; i < dbiTagsMax; i++) {
- const char * base = rpmTagGetName(dbiTags[i]);
+ if (dbiTags.tags != NULL)
+ for (i = 0; i < dbiTags.max; i++) {
+ const char * base = rpmTagGetName(dbiTags.tags[i]);
sprintf(filename, "%s/%s/%s", prefix, dbpath, base);
(void)rpmCleanPath(filename);
if (!rpmioFileExists(filename))
case 4:
/* Fall through */
case 3:
- if (dbiTags != NULL)
- for (i = 0; i < dbiTagsMax; i++) {
+ if (dbiTags.tags != NULL)
+ for (i = 0; i < dbiTags.max; i++) {
const char * base;
rpmTag rpmtag;
/* Filter out temporary databases */
- if (isTemporaryDB((rpmtag = dbiTags[i])))
+ if (isTemporaryDB((rpmtag = dbiTags.tags[i])))
continue;
base = rpmTagGetName(rpmtag);