summaryrefslogtreecommitdiff
path: root/rpmdb
diff options
context:
space:
mode:
Diffstat (limited to 'rpmdb')
-rw-r--r--rpmdb/db1.c2
-rw-r--r--rpmdb/db3.c2
-rw-r--r--rpmdb/dbconfig.c8
-rw-r--r--rpmdb/rpmdb.c49
-rw-r--r--rpmdb/rpmdb.h19
5 files changed, 40 insertions, 40 deletions
diff --git a/rpmdb/db1.c b/rpmdb/db1.c
index bfeaa9e04..57ea66721 100644
--- a/rpmdb/db1.c
+++ b/rpmdb/db1.c
@@ -516,7 +516,7 @@ static int db1close(/*@only@*/ dbiIndex dbi, /*@unused@*/ unsigned int flags)
return rc;
}
-static int db1open(/*@keep@*/ rpmdb rpmdb, int rpmtag,
+static int db1open(rpmdb rpmdb, int rpmtag,
/*@out@*/ dbiIndex * dbip)
/*@globals rpmGlobalMacroContext,
fileSystem @*/
diff --git a/rpmdb/db3.c b/rpmdb/db3.c
index 4739dd114..f35a16d51 100644
--- a/rpmdb/db3.c
+++ b/rpmdb/db3.c
@@ -801,7 +801,7 @@ exit:
}
/*@=moduncon@*/
-static int db3open(/*@keep@*/ rpmdb rpmdb, int rpmtag, dbiIndex * dbip)
+static int db3open(rpmdb rpmdb, int rpmtag, dbiIndex * dbip)
/*@globals rpmGlobalMacroContext,
fileSystem @*/
/*@modifies *dbip, fileSystem @*/
diff --git a/rpmdb/dbconfig.c b/rpmdb/dbconfig.c
index 75d209901..83f3966f8 100644
--- a/rpmdb/dbconfig.c
+++ b/rpmdb/dbconfig.c
@@ -476,16 +476,16 @@ dbiIndex db3New(rpmdb rpmdb, int rpmtag)
dbOpts = _free(dbOpts);
/*@-assignexpose@*/
- *dbi = db3dbi; /* structure assignment */
+/*@i@*/ *dbi = db3dbi; /* structure assignment */
/*@=assignexpose@*/
memset(&db3dbi, 0, sizeof(db3dbi));
if (!(dbi->dbi_perms & 0600))
dbi->dbi_perms = 0644;
dbi->dbi_mode = rpmdb->db_mode;
- /*@-keeptrans@*/
- dbi->dbi_rpmdb = rpmdb;
- /*@=keeptrans@*/
+ /*@-assignexpose -newreftrans@*/ /* FIX: figger rpmdb/dbi refcounts */
+/*@i@*/ dbi->dbi_rpmdb = rpmdb;
+ /*@=assignexpose =newreftrans@*/
dbi->dbi_rpmtag = rpmtag;
/*
diff --git a/rpmdb/rpmdb.c b/rpmdb/rpmdb.c
index c94daab1b..c865861ec 100644
--- a/rpmdb/rpmdb.c
+++ b/rpmdb/rpmdb.c
@@ -817,7 +817,9 @@ int rpmdbClose(rpmdb db)
int dbix;
int rc = 0;
- if (db == NULL) return 0;
+ if (db == NULL || --db->nrefs > 0)
+ return 0;
+
if (db->_dbi)
for (dbix = db->db_ndbi; --dbix >= 0; ) {
int xx;
@@ -833,7 +835,7 @@ int rpmdbClose(rpmdb db)
db->db_root = _free(db->db_root);
db->db_home = _free(db->db_home);
db->_dbi = _free(db->_dbi);
- db = _free(db);
+ /*@-refcounttrans@*/ db = _free(db); /*@=refcounttrans@*/
return rc;
}
@@ -858,9 +860,8 @@ static /*@only@*/ /*@null@*/
rpmdb newRpmdb(/*@kept@*/ /*@null@*/ const char * root,
/*@kept@*/ /*@null@*/ const char * home,
int mode, int perms, int flags)
- /*@globals _db_filter_dups, rpmGlobalMacroContext,
- fileSystem @*/
- /*@modifies _db_filter_dups, rpmGlobalMacroContext, fileSystem @*/
+ /*@globals _db_filter_dups, rpmGlobalMacroContext @*/
+ /*@modifies _db_filter_dups, rpmGlobalMacroContext @*/
{
rpmdb db = xcalloc(sizeof(*db), 1);
const char * epfx = _DB_ERRPFX;
@@ -875,6 +876,8 @@ rpmdb newRpmdb(/*@kept@*/ /*@null@*/ const char * root,
*db = dbTemplate; /* structure assignment */
/*@=assignexpose@*/
+ db->_dbi = NULL;
+
if (!(perms & 0600)) perms = 0644; /* XXX sanity */
if (mode >= 0) db->db_mode = mode;
@@ -887,7 +890,9 @@ rpmdb newRpmdb(/*@kept@*/ /*@null@*/ const char * root,
/*@=nullpass@*/
if (!(db->db_home && db->db_home[0] != '%')) {
rpmError(RPMERR_DBOPEN, _("no dbpath has been set\n"));
- (void) rpmdbClose(db);
+ db->db_root = _free(db->db_root);
+ db->db_home = _free(db->db_home);
+ db = _free(db);
/*@-globstate@*/ return NULL; /*@=globstate@*/
}
/*@-nullpass@*/
@@ -897,6 +902,7 @@ rpmdb newRpmdb(/*@kept@*/ /*@null@*/ const char * root,
db->db_filter_dups = _db_filter_dups;
db->db_ndbi = dbiTagsMax;
db->_dbi = xcalloc(db->db_ndbi, sizeof(*db->_dbi));
+ db->nrefs = 1;
/*@-globstate@*/ return db; /*@=globstate@*/
}
/*@=mods@*/
@@ -1048,6 +1054,18 @@ exit:
return rc;
}
+rpmdb rpmdbLink(rpmdb db)
+{
+ db->nrefs++;
+ /*@-refcounttrans@*/ return db; /*@=refcounttrans@*/
+}
+
+rpmdb rpmdbUnlink(rpmdb db)
+{
+ db->nrefs--;
+ return NULL;
+}
+
/* XXX python/rpmmodule.c */
/*@-globs@*/ /* FIX: rpmGlobalMacroContext not in <rpmlib.h> */
int rpmdbOpen (const char * prefix, rpmdb *dbp, int mode, int perms)
@@ -1517,7 +1535,7 @@ typedef struct miRE_s {
struct _rpmdbMatchIterator {
/*@only@*/ const void * mi_keyp;
size_t mi_keylen;
-/*@kept@*/ rpmdb mi_rpmdb;
+/*@refcounted@*/ rpmdb mi_db;
int mi_rpmtag;
dbiIndexSet mi_set;
DBC * mi_dbc;
@@ -1547,7 +1565,7 @@ rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi)
if (mi == NULL)
return mi;
- dbi = dbiOpen(mi->mi_rpmdb, RPMDBI_PACKAGES, 0);
+ dbi = dbiOpen(mi->mi_db, RPMDBI_PACKAGES, 0);
/*@-branchstate@*/
if (mi->mi_h) {
if (dbi && mi->mi_dbc && mi->mi_modified && mi->mi_prevoffset) {
@@ -1584,18 +1602,11 @@ rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi)
mi->mi_dbc = NULL;
mi->mi_set = dbiFreeIndexSet(mi->mi_set);
mi->mi_keyp = _free(mi->mi_keyp);
+ mi->mi_db = rpmdbUnlink(mi->mi_db);
mi = _free(mi);
return mi;
}
-rpmdb rpmdbGetIteratorRpmDB(rpmdbMatchIterator mi) {
- if (mi == NULL)
- return NULL;
- /*@-retexpose -retalias@*/
- return mi->mi_rpmdb;
- /*@=retexpose =retalias@*/
-}
-
unsigned int rpmdbGetIteratorOffset(rpmdbMatchIterator mi) {
if (mi == NULL)
return 0;
@@ -2023,7 +2034,7 @@ Header rpmdbNextIterator(rpmdbMatchIterator mi)
if (mi == NULL)
return NULL;
- dbi = dbiOpen(mi->mi_rpmdb, RPMDBI_PACKAGES, 0);
+ dbi = dbiOpen(mi->mi_db, RPMDBI_PACKAGES, 0);
if (dbi == NULL)
return NULL;
@@ -2163,7 +2174,7 @@ static int rpmdbGrowIterator(/*@null@*/ rpmdbMatchIterator mi,
if (!(mi && keyp))
return 1;
- dbi = dbiOpen(mi->mi_rpmdb, mi->mi_rpmtag, 0);
+ dbi = dbiOpen(mi->mi_db, mi->mi_rpmtag, 0);
if (dbi == NULL)
return 1;
@@ -2294,7 +2305,7 @@ fprintf(stderr, "*** RMW %s %p\n", tagName(rpmtag), dbi->dbi_rmw);
mi->mi_keylen = keylen;
/*@-assignexpose@*/
- mi->mi_rpmdb = db;
+ mi->mi_db = rpmdbLink(db);
/*@=assignexpose@*/
mi->mi_rpmtag = rpmtag;
diff --git a/rpmdb/rpmdb.h b/rpmdb/rpmdb.h
index 25875023a..d6fccff68 100644
--- a/rpmdb/rpmdb.h
+++ b/rpmdb/rpmdb.h
@@ -31,19 +31,6 @@ struct _dbiIndexItem {
unsigned int dbNum; /*!< database index */
};
-#ifdef DYING
-/** \ingroup dbi
- * A single item in an index database (i.e. the "data saved").
- */
-struct _dbiIR {
-/*@unused@*/ unsigned int recOffset; /*!< byte offset of header in db */
-/*@unused@*/ unsigned int fileNumber; /*!< file array index */
-};
-/*@-typeuse@*/
-typedef struct _dbiIR * DBIR_t;
-/*@=typeuse@*/
-#endif /* DYING */
-
/** \ingroup dbi
* Items retrieved from the index database.
*/
@@ -299,7 +286,7 @@ struct _dbiIndex {
/* queue access parameters */
unsigned int dbi_q_extentsize;
-/*@kept@*/ rpmdb dbi_rpmdb;
+/*@refcounted@*/ rpmdb dbi_rpmdb;
rpmTag dbi_rpmtag; /*!< rpm tag used for index */
int dbi_jlen; /*!< size of join key */
@@ -341,6 +328,8 @@ struct rpmdb_s {
/*@modifies *ptr @*/;
int db_ndbi; /*!< No. of tag indices. */
dbiIndex * _dbi; /*!< Tag indices. */
+
+/*@refs@*/ int nrefs; /*!< Reference count. */
};
/* for RPM's internal use only */
@@ -364,7 +353,7 @@ extern "C" {
* Return new configured index database handle instance.
* @param rpmdb rpm database
*/
-/*@only@*/ /*@null@*/ dbiIndex db3New(/*@keep@*/ rpmdb rpmdb, int rpmtag)
+/*@only@*/ /*@null@*/ dbiIndex db3New(rpmdb rpmdb, int rpmtag)
/*@globals rpmGlobalMacroContext @*/
/*@modifies rpmGlobalMacroContext @*/;